SystemVerilog DPI - SystemVerilog DPI

SystemVerilog DPI (Direct Programming Interface) - это интерфейс, который можно использовать для взаимодействия SystemVerilog с иностранными языками. Эти иностранные языки могут быть C, C ++, SystemC, а также другие. DPI состоят из двух уровней: SystemVerilog слой и слой иностранного языка. Оба слоя изолированы друг от друга. Какой язык программирования фактически используется в качестве иностранного, прозрачно и не имеет значения для стороны System-Verilog этого интерфейса. Ни компилятор SystemVerilog, ни компилятор иностранного языка не требуется для анализа исходного кода на другом языке. Различные языки программирования могут использоваться и поддерживаться одним и тем же неизменным уровнем SystemVerilog. Однако на данный момент SystemVerilog определяет уровень иностранного языка только для языка программирования C.

У этого интерфейса двоякая мотивация. Методологическое требование состоит в том, что интерфейс должен позволять строить гетерогенную систему (дизайн или тестовый стенд), в которой некоторые компоненты могут быть написаны на языке (или нескольких языках), отличном от SystemVerilog, в дальнейшем называемом иностранным языком. С другой стороны, также существует практическая потребность в простом и эффективном способе подключения существующего кода, обычно написанного на C или C ++, без знания и накладных расходов на PLI или VPI. DPI следует принципу черного ящика: спецификация и реализация компонента четко разделены, а фактическая реализация прозрачна для остальной части системы. Следовательно, фактический язык программирования реализации также прозрачен, хотя этот стандарт определяет только семантику компоновки C. Разделение кода SystemVerilog на иностранный язык основано на использовании функций в качестве естественной единицы инкапсуляции в SystemVerilog. По большому счету, любую функцию можно рассматривать как черный ящик и реализовывать либо в SystemVerilog, либо на иностранном языке прозрачным образом, без изменения ее вызовов.

Объяснение

Интерфейс прямого программирования (DPI) позволяет выполнять прямые межъязыковые вызовы функций между SystemVerilog и иностранный язык. Функции, реализованные на иностранном языке, могут быть вызваны из SystemVerilog, и такие функции называются импорт функции аналогичны функциям, реализованным в SystemVerilog можно вызвать с иностранного языка (C / C ++ или System C) такие функции называются Экспорт функции. DPI позволяют передавать данные между двумя доменами с помощью аргументов функции и возврата.

Функция импорта и экспорта

1) Импорт функции: - Функция, реализованная на иностранном языке, может использоваться в SystemVerilog путем импорта. Функция иностранного языка, используемая в SystemVerilog называется Импортированной функцией.

Свойства импортированной функции и задачи

  1. Импортированная функция должна завершить свое выполнение немедленно и потреблять нулевое время моделирования. Импортированная задача может занять время.
  2. Импортированная функция может иметь аргументы ввода, вывода и ввода.
    • Формальные входные аргументы не должны изменяться. Если такие аргументы изменяются внутри функции, изменения не должны быть видны вне функции.
    • Импортированная функция не должна принимать никаких начальных значений формальных выходных аргументов. Начальное значение выходных аргументов не определено и зависит от реализации.
    • Импортированная функция может получить доступ к начальному значению формального аргумента inout. Изменения, которые функция Imported вносит в формальный аргумент inout, должны быть видны за пределами функции.
  3. Импортированная функция не должна освобождать память, выделенную кодом SystemVerilog, и не ожидать SystemVerilog код для освобождения памяти, выделенной внешним кодом или (внешним компилятором).
  4. Вызов импортированной задачи может привести к приостановке текущего выполняющегося потока. Это происходит, когда импортированная задача вызывает экспортированную задачу, а экспортированная задача выполняет управление задержкой, управление событиями или оператор ожидания. Таким образом, импортированная задача может быть одновременно активной в нескольких потоках выполнения.
  5. Импортированная функция или задача могут быть снабжены специальными свойствами, называемыми чистыми или контекстными.

Чистые и контекстные задачи и функции

Чистые функции

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

Свойства чистых функций

  1. Только функции Non-Void без вывода или ввода могут быть вызваны как чистые функции.
  2. Функции, указанные как Pure, не должны иметь побочных эффектов, их результаты должны зависеть исключительно от значений их входных аргументов.
  3. Вызов функции Pure можно безопасно исключить, если его результат не нужен или если его результаты для того же значения входных аргументов доступны для повторного использования без необходимости пересчета.
  4. Предполагается, что функция Pure не выполняет прямо или косвенно следующее:
    1. Выполните любую файловую операцию.
    2. Чтение или запись чего-либо в переменной среды, общей памяти, сокетах и ​​т. Д.
    3. Доступ к любым постоянным данным, таким как глобальная или статическая переменная.
  5. Импортированная задача никогда не может быть объявлена ​​чистой.

Контекстные задачи и функции

Импортированная задача или функция, которая вызывает «Экспортированные» задачи или функции или обращается к объектам данных SystemVerilog, отличным от своих фактических аргументов, называется контекстной задачей или функцией.

Свойства контекстных задач и функций

1) Задача или функция с импортированным контекстом может обращаться (читать или писать) к любому объекту данных SystemVerilog, вызывая (PLI / VPI) или вызывая задачу или функцию экспорта. Следовательно, вызов задачи или функции Context является препятствием для оптимизации компилятора SystemVerilog.

Декларация импорта

импорт DPI-C функция int calc_parity (Вход int а);

Экспортная декларация

экспорт DPI-C my_cfunction = функция моя функция;

Вызов функций Unix

Код SystemVerilog может вызывать функции Unix напрямую, импортируя их, без необходимости в оболочке.

Пример DPI

Вызов функций C в SystemVerilog

C - файл кода

#включают <stdio.h>#включают <stdlib.h>внешний int Добавить() {  int а = 10, б = 20;  а = а + б;  printf("Добавление выполнено успешно и результат =% d", а);  возвращаться а;}

Файл кода SystemVerilog

модуль tb_dpi;  импорт "DPI-C"функция int add ();  импорт "DPI-C"функция int sleep (ввод int secs);  int j;    исходный  начинать    $ display(«Вход в начальный блок SystemVerilog»);    #20    j = Добавить();    $ display(«Значение J =% d», j);    $ display(«Сон в течение 3 секунд с функцией Unix»);    спать(3);    $ display(«Выход из начального блока SystemVerilog»);    #5 $ отделка;  конец  конечный модуль

Рекомендации

  • Гопи Кришна (2005-11-09). "Учебное пособие по SystemVerilog DPI".
  • Учебное пособие по SystemVerilog DPI из Project VeriPage