20. Обзор интерфейса языка программирования (PLI) Verilog

Содержание

20.1 Назначение и история PLI

В стандарте IEEE Std 1364-2005 устарели подпрограммы задач/функций (TF) и доступа (ACC), которые ранее были указаны в пунктах с 21 по 25, приложении E и приложении F стандарта IEEE Std 1364-2001. Пункт 20 был изменен, чтобы отразить это изменение. Текст устаревших пунктов и приложений был удален из этой версии стандарта, но заголовки пунктов были сохранены. См. соответствующие пункты в IEEE Std 1364-2001.

Пункты 26(VPI) и 27 описывают стандарт процедурного интерфейса языка C и механизмы интерфейса, которые являются частью Verilog HDL. Этот процедурный интерфейс, известный как PLI, предоставляет пользователям Verilog HDL средства для динамического доступа и изменения данных в инстанцированной структуре данных Verilog HDL. Инстанцированная структура данных Verilog HDL — это результат компиляции исходных описаний Verilog HDL и генерации иерархии, моделируемой экземплярами модулей, экземплярами примитивов и другими конструкциями Verilog HDL, которые представляют область видимости. Процедурный интерфейс PLI предоставляет библиотеку функций языка C, которые могут напрямую обращаться к данным в инстанцированной структуре данных Verilog HDL.

Ниже перечислены некоторые из множества возможных применений процедурного интерфейса PLI:

  • Вычислители задержек на языке C для библиотек моделей Verilog, которые могут динамически сканировать структуру данных программного продукта Verilog и затем динамически изменять задержки каждого экземпляра моделей из библиотеки
  • Приложения на языке C, которые динамически считывают тестовые векторы или другие данные из файла и передают их в программный продукт Verilog
  • Пользовательские графические осциллографы и отладочные среды для программных продуктов Verilog
  • Декомпиляторы исходного кода, которые могут генерировать исходный код Verilog HDL из скомпилированной структуры данных программного продукта Verilog
  • Имитационные модели, написанные на языке C и динамически подключаемые к симуляторам Verilog HDL
  • Интерфейсы для реального оборудования, такие как аппаратный моделировщик, которые динамически взаимодействуют с симуляцией.

Существует три основных поколения ПЛИС Verilog:

  • Подпрограммы задач/функций, называемые TF-подпрограммами, составили первое поколение PLI. Эти подпрограммы, большинство из которых начинались с символов tf_, в основном использовались для операций с определенными пользователем аргументами системных задач/функций, а также для утилитарных функций, таких как настройка механизмов обратного вызова и запись данных на устройства вывода. Подпрограммы TF иногда называли утилитами.
    ПРИМЕЧАНИЕ — Подпрограммы TF были исключены из данной версии стандарта.
  • Подпрограммы доступа, называемые подпрограммами ACC, составили второе поколение PLI. Эти подпрограммы, начинающиеся с символов acc_, обеспечивали объектно-ориентированный доступ непосредственно к структурному описанию Verilog HDL. Подпрограммы ACC использовались для доступа и модификации информации, такой как значения задержки и логические значения, для широкого спектра объектов, существующих в описании Verilog HDL.
    Функциональность подпрограмм ACC и подпрограмм TF частично совпадала.
    ПРИМЕЧАНИЕ — Подпрограммы ACC были исключены из данной версии стандарта.
  • Процедурные интерфейсные подпрограммы Verilog, называемые подпрограммами VPI, представляют собой 3-е поколение PLI. Эти процедуры, начинающиеся с символов vpi_, обеспечивают объектно-ориентированный доступ к структурным и поведенческим объектам Verilog HDL. Подпрограммы VPI являются надстройкой над функциональностью подпрограмм TF и ACC.

20.2 Определяемые пользователем имена системных задач/функций

Определяемое пользователем имя системной задачи/функции — это имя, которое будет использоваться в исходном файле Verilog HDL для вызова определенных приложений PLI. Имя должно соответствовать следующим правилам:

  • Первым символом имени должен быть знак доллара ($).
  • Остальные символы должны быть буквами, цифрами, символом подчеркивания (_) или знаком доллара ($).
  • Прописные и строчные буквы должны считаться уникальными — имя чувствительно к регистру.
  • Имя может быть любого размера, и все символы являются значимыми.

20.3 Типы системных задач/функций, определяемых пользователем

Тип определяемой пользователем системной задачи/функции определяет, каким образом приложение PLI будет вызываться из исходного кода Verilog HDL. Существуют следующие типы:

  • Пользовательская задача может использоваться в тех же местах, где может использоваться задача Verilog HDL (см. 10.2). Определенная пользователем системная задача может читать и изменять аргументы задачи, но не возвращает никаких значений.
  • Пользовательская функция может использоваться в тех же местах, что и функция Verilog HDL (см. 10.4). Определенная пользователем системная функция может читать и изменять аргументы функции и возвращает значение. Битовая ширина вектора определяется пользовательским приложением sizetf (см. VPI 2.34).

20.4 Переопределение имен встроенных системных задач/функций

В пункте 17 определен ряд встроенных системных задач и функций, которые являются частью языка Verilog. Кроме того, программные продукты могут включать другие встроенные системные задачи и функции, специфичные для данного продукта.

Имена этих встроенных системных задач/функций начинаются со знака доллара ($), как и имена системных задач/функций, определяемых пользователем.

Если пользовательское PLI-приложение связано с тем же именем, что и встроенная системная задача/функция (с помощью механизма PLI), пользовательское C-приложение должно переопределить встроенную системную задачу/функцию, заменив ее функциональность на функциональность пользовательского C-приложения. Например, пользователь может написать генератор случайных чисел как PLI-приложение, а затем связать это приложение с именем $random, тем самым заменив встроенную функцию $random пользовательским приложением.

Проверки синхронизации Verilog, такие как $setup, не являются системными задачами и не могут быть переопределены.

Системные функции $signed и $unsigned могут быть переопределены. Эти системные функции уникальны для Verilog HDL тем, что ширина возвращаемого значения зависит от ширины аргумента. Если они переопределены, то версия PLI должна иметь одинаковую ширину возврата для всех экземпляров системной функции. Ширина возврата PLI определяется с помощью PLI sizetf (см. VPI 2.34).

20.5 Приложения PLI, определяемые пользователем

Пользовательские PLI-приложения — это функции языка C, использующие библиотеку функций PLI C для динамического доступа и взаимодействия с программными реализациями Verilog HDL по мере выполнения исходного кода Verilog HDL.

Эти PLI-приложения не являются независимыми программами на языке C. Это функции языка Си, которые подключаются к программному продукту и становятся его частью. Это позволяет вызывать PLI-приложение, когда пользовательская системная задача/функция с именем $ компилируется или выполняется в исходном коде Verilog HDL (см. VPI 1.1).

20.6 Механизм PLI

Механизм PLI позволяет вызывать приложения PLI по различным причинам, когда в исходном описании Verilog HDL встречается имя соответствующей системной задачи/функции $. Например, когда симулятор Verilog HDL впервые компилирует исходное описание Verilog HDL, может быть вызвана специальная PLI-программа, которая выполняет проверку синтаксиса, чтобы убедиться, что пользовательская системная задача/функция используется правильно. Затем, по мере выполнения моделирования, может быть вызвана другая PLI-программа для выполнения операций, требуемых PLI-приложением. Другие подпрограммы PLI могут автоматически вызываться симулятором по разным причинам, например, по окончании временного шага симуляции или при изменении логического значения определенного сигнала (см. VPI 1.1).

20.7 Аргументы системных задач/функций, определяемых пользователем

Когда в исходном файле Verilog HDL используется определяемая пользователем системная задача/функция, она может иметь аргументы, которые могут использоваться приложениями PLI, связанными с этой системной задачей/функцией. В следующем примере определяемая пользователем системная задача $get_vector имеет два аргумента:
$get_vector(«test_vector.pat», input_bus);

Аргументы системной задачи/функции называются аргументами задачи/функции (часто сокращенно tfargs). Эти аргументы отличаются от аргументов языка Си. Когда вызываются приложения PLI, связанные с определенной пользователем системной задачей/функцией, аргументы задачи/функции не передаются приложению PLI. Вместо этого предоставляется ряд подпрограмм PLI, которые позволяют приложениям PLI читать и записывать аргументы задачи/функции. Информацию о конкретных подпрограммах, работающих с аргументами задачи/функции, см. в пункте VPI 2.

20.8 Файлы включения PLI

Библиотеки функций PLI определены в включаемом файле C, который является нормативной частью настоящего стандарта. В этом файле также определяются константы, структуры и другие данные, используемые библиотекой функций PLI и интерфейсными механизмами. Этот файл — vpi_user.h. PLI-приложения, использующие подпрограммы VPI, должны включать файл vpi_user.h.