СистемаVerilog DPI
SystemVerilog DPI (Интерфейс прямого программирования) — это интерфейс, который можно использовать для взаимодействия SystemVerilog с иностранными языками. Этими иностранными языками могут быть C , C++ , SystemC и другие. DPI состоят из двух уровней: уровня SystemVerilog и уровня иностранного языка. Оба слоя изолированы друг от друга.
Объяснение [ править ]
Интерфейс прямого программирования ( DPI ) позволяет осуществлять прямые вызовы межъязыковых функций между SystemVerilog и иностранным языком. Функции, реализованные на иностранном языке, можно вызывать из SystemVerilog, и такие функции называются функциями импорта . Аналогично, функции, реализованные в SystemVerilog, можно вызывать с иностранного языка ( C/C++ или System C ); такие функции называются функциями экспорта . DPI позволяют передавать данные между двумя доменами через аргументы функции и возврат.
Импорт и экспорт функций [ править ]
1) Импорт функций: — Функция, реализованная на иностранном языке, может использоваться в SystemVerilog путем ее импорта. Функция иностранного языка, используемая в SystemVerilog, называется импортированной функцией.
Свойства импортированной функции и задачи [ править ]
- Импортированная функция должна завершить свое выполнение мгновенно и не тратить времени на моделирование. Импортированная задача может занять время.
- Импортированная функция может иметь входные, выходные и входные аргументы.
- Формальные входные аргументы не должны изменяться. Если такие аргументы изменяются внутри функции, эти изменения не должны быть видны за пределами функции.
- Импортированная функция не должна принимать никаких начальных значений формальных выходных аргументов. Начальное значение выходных аргументов не определено и зависит от реализации.
- Импортированная функция может получить доступ к начальному значению формального входного аргумента. Изменения, которые импортированная функция вносит в формальный входной аргумент, должны быть видны за пределами функции.
- Импортированная функция не должна освобождать память, выделенную кодом SystemVerilog, и не ожидать, что код SystemVerilog освободит память, выделенную внешним кодом или (внешним компилятором).
- Вызов импортированной задачи может привести к приостановке текущего выполняющегося потока. Это происходит, когда импортированная задача вызывает экспортированную задачу, а экспортированная задача выполняет оператор управления задержкой, управления событиями или ожидания. Таким образом, импортированная задача может быть одновременно активной в нескольких потоках выполнения.
- Импортированную функцию или задачу можно снабдить специальными свойствами, называемыми чистыми или контекстными.
Чистые и контекстные задачи и функции [ править ]
Чистые функции [ править ]
Функция, результаты которой зависят исключительно от значения ее входных аргументов без каких-либо побочных эффектов, называется чистой функцией.
Свойства чистых функций [ править ]
- Только непустые функции без выходных или входных аргументов можно вызывать как чистые функции.
- Функции, указанные как Pure, не должны иметь побочных эффектов, их результаты должны зависеть исключительно от значений их входных аргументов.
- Вызов функции Pure можно безопасно исключить, если его результат не нужен или если его результаты для того же значения входных аргументов доступны для повторного использования без необходимости пересчета.
- Предполагается, что чистая функция не выполняет прямо или косвенно следующее:
- Выполните любую файловую операцию.
- Чтение или запись чего-либо в переменную среды, общую память, сокеты и т. д.
- Доступ к любым постоянным данным, таким как глобальная или статическая переменная.
- Импортированная задача никогда не может быть объявлена чистой.
Контекстные задачи и функции [ править ]
Импортированная задача или функция, которая вызывает «экспортированные» задачи или функции или обращается к объектам данных SystemVerilog, отличным от ее фактических аргументов, называется контекстной задачей или функцией.
Свойства контекстных задач и функций [ править ]
1) Задача или функция, импортированная из контекста, может получить доступ (чтение или запись) к любому объекту данных SystemVerilog, вызвав (PLI/VPI) или вызвав задачу или функцию экспорта. Таким образом, вызов задачи или функции Context является препятствием для оптимизации компилятора SystemVerilog.
Импортная декларация [ править ]
import "DPI-C" function int calc_parity (input int a);
Экспортная декларация [ править ]
export "DPI-C" my_cfunction = function myfunction;
Вызов функций Unix [ править ]
Код SystemVerilog может вызывать функции Unix напрямую, импортируя их, без необходимости использования оболочки.
Пример DPI [ править ]
Вызов функций C в SystemVerilog [ править ]
C - файл кода [ править ]
#include <stdio.h>
#include <stdlib.h>
extern int add() {
int a = 10, b = 20;
a = a + b;
printf("Addition Successful and Result = %d\n", a);
return a;
}
Файл кода SystemVerilog [ править ]
module tb_dpi;
import "DPI-C" function int add();
import "DPI-C" function int sleep(input int secs);
int j;
initial
begin
$display("Entering in SystemVerilog Initial Block");
#20
j = add();
$display("Value of J = %d", j);
$display("Sleeping for 3 seconds with Unix function");
sleep(3);
$display("Exiting from SystemVerilog Initial Block");
#5 $finish;
end
endmodule
Ссылки [ править ]
- Гопи Кришна (9 ноября 2005 г.). «Учебное пособие по SystemVerilog DPI» .
- Учебное пособие по SystemVerilog DPI из проекта VeriPage