Закодируйте функцию MATLAB®, которую вы хотите экспортировать в среду SystemVerilog. Для получения информации о кодировании функций MATLAB см. "Функциональные Основы" в документации MATLAB.
Считайте добавление директивы компиляции %#codegen
к вашей функции. Эта директива может помочь вам диагностировать и зафиксировать нарушения, которые привели бы к ошибкам во время генерации кода. Смотрите Направляющий % Компиляции #codegen (MATLAB Coder).
В то время как вы кодируете свою функцию, имеете в виду Ограничения, которые описывают различные аспекты генерации компонента DPI, которую необходимо знать. Эти аспекты включают, какие типы данных допустимы, какие файлы сгенерированы, и как разделяемые библиотеки скомпилированы.
В этом примере функция MATLAB fun.m
берет один вход и умножает его на 2. Функция включает директиву компиляции %#codegen
.
function y = fun(x); %#codegen y = x * 2;
Процесс создания MATLAB включает запись кода, создание испытательного стенда и выполнение испытательного стенда в итеративном процессе. Когда вы удовлетворены, что ваша функция делает то, что вы предназначаете его, чтобы сделать, продвинуться, чтобы Сгенерировать Компонент SystemVerilog DPI.
Создайте испытательный стенд, чтобы осуществить функцию. В этом примере испытательный стенд применяет тестовый вектор против fun.m
и строит вывод.
function sample=fun_tb % Testbench should not require input, however you can give an output. % Define a test vector tVecIn = [1,2,3,4,5]; % Exercise fun.m and plot results to make sure function is working correctly tVecOut = arrayfun(@(in) fun(in),tVecIn); plot(tVecIn,tVecOut); grid on; % Get my sample input to use it with function dpigen. sample = tVecIn(1);
Обратите внимание на то, что испытательный стенд не должен иметь входных параметров. Испытательный стенд может векторы нагрузочного теста с помощью файлов MAT или любого другого файла данных, таким образом, это не требует входных параметров.
Вывод fun_tb
, sample
, будет используемым в качестве аргумента входных параметров функции для fun.m
во время вызова dpigen
, который является, почему это - один элемент. Смотрите Генерируют Компонент SystemVerilog DPI.
fun_tb
ans = 1
Затем, сгенерируйте компонент SystemVerilog DPI. Смотрите Генерируют Компонент SystemVerilog DPI.
dpigen
Используйте функциональный dpigen
, чтобы сгенерировать компонент DPI. Эта функция имеет несколько дополнительных входных параметров. Как минимум задайте функцию MATLAB, вы хотите сгенерировать компонент для и входные параметры функции. Если вы также хотите сгенерировать испытательный стенд, чтобы осуществить сгенерированный компонент, используйте опцию -testbench
.
dpigen func -args input_arg -testbench test_bench_name
Задайте входные параметры как требуется функцией. В этом примере sample
является скалярным значением, типа double.
sample = 1;
Вызовите функцию генератора компонента DPI:
dpigen fun -args sample -testbench fun_tb
Команда, данная как показано, выполняет следующие задачи:
Генерирует fun_dpi.sv
– компонент SystemVerilog для функционального fun.m
.The входные параметры функции для fun.m
задан в sample.
Генерирует fun_dpi_pkg.sv
– файл пакета SystemVerilog. Этот файл содержит все импортированные объявления функции.
Создает испытательный стенд для сгенерированного компонента.
Для этого вызова dpigen
MATLAB выводит следующие сообщения:
### Generating DPI Wrapper fun_dpi.c ### Generating DPI Wrapper header file fun_dpi.h ### Generating SystemVerilog module package fun_dpi_pkg.sv ### Generating SystemVerilog module fun_dpi.sv ### Generating makefiles for: fun_dpi ### Compiling the DPI Component ### Generating SystemVerilog test bench fun_tb.sv ### Generating test bench simulation script for Mentor Graphics QuestaSim/Modelsim run_tb_mq.do ### Generating test bench simulation script for Cadence Incisive run_tb_incisive.sh ### Generating test bench simulation script for Cadence Xcelium run_tb_xcelium.sh ### Generating test bench simulation script for Synopsys VCS run_tb_vcs.sh ### Generating test bench simulation script for Vivado Simulator run_tb_vivado.bat
Функция, показанная в предыдущем примере, генерирует следующие папки и файлы:
Исследуйте сгенерированный файл пакета. Отметьте объявления initialize
, reset
, terminate
и функций fun
.
Этот пример показывает код, сгенерированный для fun_dpi_pkg.sv
.
// File: C:\fun_example\codegen\dll\fun\fun_dpi_pkg.sv // Created: 2017-12-19 09:18:00 // Generated by MATLAB 9.5 and HDL Verifier 5.4 `timescale 1ns / 1ns package fun_dpi_pkg; // Declare imported C functions import "DPI" function chandle DPI_fun_initialize(input chandle existhandle); import "DPI" function chandle DPI_fun_reset(input chandle objhandle,input real x,output real y); import "DPI" function void DPI_fun(input chandle objhandle,input real x,output real y); import "DPI" function void DPI_fun_terminate(input chandle existhandle); endpackage : fun_dpi_pkg
Исследуйте сгенерированный компонент так, чтобы можно было понять, как функция dpigen
преобразовала код MATLAB в код SystemVerilog. Для получения дополнительной информации о том, что включает функция, смотрите Сгенерированную Обертку SystemVerilog.
Этот пример показывает код, сгенерированный для fun_dpi.sv
.
// File: C:\fun_example\codegen\dll\fun\fun_dpi.sv // Created: 2017-12-19 09:18:00 // Generated by MATLAB 9.5 and HDL Verifier 5.4 `timescale 1ns / 1ns import fun_dpi_pkg::*; module fun_dpi( input bit clk, input bit clk_enable, input bit reset, input real x, output real y ); chandle objhandle=null; real y_temp; initial begin objhandle=DPI_fun_initialize(objhandle); end final begin DPI_fun_terminate(objhandle); end always @(posedge clk or posedge reset) begin if(reset== 1'b1) begin objhandle=DPI_fun_reset(objhandle,x,y_temp); y<=y_temp; end else if(clk_enable) begin DPI_fun(objhandle,x,y_temp); y<=y_temp; end end endmodule
Исследуйте сгенерированный испытательный стенд, таким образом, вы видите, как функциональный dpigen
создал этот испытательный стенд из кода MATLAB. Для получения дополнительной информации о сгенерированном испытательном стенде смотрите Сгенерированный Испытательный стенд.
Этот пример показывает код, сгенерированный для fun_tb.sv
.
// File: C:\fun_example\codegen\dll\fun\dpi_tb\fun_tb.sv // Created: 2017-12-19 09:18:13 // Generated by MATLAB 9.5 and HDL Verifier 5.4 `timescale 1ns / 1ns module fun_tb; real x; real y_ref; real y_read; real y; // File Handles integer fid_x; integer fid_y; // Other test bench variables bit clk; bit clk_enable; bit reset; integer fscanf_status; reg testFailure; reg tbDone; bit[63:0] real_bit64; bit[31:0] shortreal_bit64; parameter CLOCK_PERIOD= 10; parameter CLOCK_HOLD= 2; parameter RESET_LEN= 2*CLOCK_PERIOD+CLOCK_HOLD; // Initialize variables initial begin clk = 1; clk_enable = 0; testFailure = 0; tbDone = 0; reset = 1; fid_x = $fopen("dpig_in1.dat","r"); fid_y = $fopen("dpig_out1.dat","r"); // Initialize multirate counters #RESET_LEN reset = 0; end // Clock always #(CLOCK_PERIOD/2) clk = ~ clk; always@(posedge clk) begin if (reset == 0) begin #CLOCK_HOLD clk_enable <= 1; fscanf_status = $fscanf(fid_x, "%h", real_bit64); x = $bitstoreal(real_bit64); if ($feof(fid_x)) tbDone = 1; fscanf_status = $fscanf(fid_y, "%h", real_bit64); y_read = $bitstoreal(real_bit64); if ($feof(fid_y)) tbDone = 1; y_ref <= y_read; if (clk_enable == 1) begin assert ( ((y_ref - y) < 2.22045e-16) && ((y_ref - y) > -2.22045e-16) ) else begin testFailure = 1; $display("ERROR in output y_ref at time %0t :", $time); $display("Expected %e; Actual %e; Difference %e", y_ref, y, y_ref-y); end if (tbDone == 1) begin if (testFailure == 0) $display("**************TEST COMPLETED (PASSED)**************"); else $display("**************TEST COMPLETED (FAILED)**************"); $finish; end end end end // Instantiate DUT fun_dpi u_fun_dpi( .clk(clk), .clk_enable(clk_enable), .reset(reset), .x(x), .y(y) ); endmodule
Затем, запустите сгенерированный испытательный стенд в симуляторе HDL. Смотрите Выполнение Сгенерированный Испытательный стенд в симуляторе HDL. Если вы планируете портировать и дополнительный испытательный стенд компонента от Windows® до Linux®, смотрите Порт Сгенерированный и Испытательный стенд Компонента к Linux.
Запустите испытательный стенд в средствах моделирования ModelSim и QuestaSim
Запустите испытательный стенд в остром средстве моделирования
Этот раздел включает инструкции для выполнения сгенерированного испытательного стенда в одном из поддерживаемых симуляторов HDL: Наставник Graphics® ModelSim® и Questa®Sim, Cadence Incisive® и Synopsys® VCS®. Возможно, что этот код будет работать в других (неподдерживаемых) симуляторах HDL, но это не гарантируется.
Выберите рабочий процесс для своего симулятора HDL.
Запустите ModelSim или QuestaSim в режиме GUI.
Измените свой текущий каталог на папку dpi_tb
в соответствии с директорией генерации кода в MATLAB.
Введите следующую команду в интерпретатор, чтобы запустить вашу симуляцию:
do run_tb_mq.do
Этот сгенерированный скрипт содержит имя и испытательного стенда компонента и инструкции к симулятору HDL для выполнения испытательного стенда.
Когда симуляция заканчивается, необходимо видеть следующий текст, отображенный в консоли:
**************TEST COMPLETED (PASSED)**************
Это сообщение говорит вам, что испытательный стенд был запущен против сгенерированного компонента успешно.
Следующее изображение формы волны от этого примера демонстрирует, что сгенерированный испытательный стенд был успешно осуществлен в симуляторе HDL.
Затем, импортируйте свой компонент. Смотрите Использование Сгенерированные Функции DPI в SystemVerilog.
Запустите Incisive®.
Запустите свой терминальный интерпретатор.
Измените текущий каталог на dpi_tb
в соответствии с директорией генерации кода в MATLAB.
Введите следующую команду в интерпретатор, чтобы запустить симуляцию:
sh run_tb_ncsim.sh
Этот сгенерированный скрипт содержит имя и испытательного стенда компонента и инструкции к симулятору HDL для выполнения испытательного стенда.
Когда симуляция заканчивается, необходимо видеть следующий текст, отображенный в консоли:
**************TEST COMPLETED (PASSED)**************
Это сообщение говорит вам, что испытательный стенд был запущен против сгенерированного компонента успешно.
Запустите VCS.
Запустите свой терминальный интерпретатор.
Измените текущий каталог на dpi_tb
в соответствии с директорией генерации кода в MATLAB.
Введите следующую команду в свой интерпретатор, чтобы запустить симуляцию:
sh run_tb_vcs.sh
Этот сгенерированный скрипт содержит имя и испытательного стенда компонента и инструкции к симулятору HDL для выполнения испытательного стенда.
Когда симуляция заканчивается, необходимо видеть следующий текст, отображенный в консоли:
**************TEST COMPLETED (PASSED)**************
Это сообщение говорит вам, что испытательный стенд был запущен против сгенерированного компонента успешно.
Чтобы использовать сгенерированный компонент DPI в испытательном стенде SystemVerilog, сначала необходимо включать файл пакета в среду SystemVerilog. Это будет иметь функции DPI в наличии в рамках вашего модуля SystemVerilog. Затем необходимо вызвать сгенерированные функции. Когда вы компилируете код SystemVerilog, который содержит импортированные сгенерированные функции, используйте учитывающий DPI компилятор SystemVerilog и задайте компонент и имена файлов пакета наряду с кодом SystemVerilog.
Следующий пример демонстрирует добавление сгенерированного компонента DPI для fun.m
к модулю SystemVerilog.
Вызовите функцию Initialize
.
DPI_fun_initialize();
Вызовите функцию, сгенерированную от fun.m
.
DPI_fun(x,y);
Можно теперь изменить сгенерированный код по мере необходимости.
module test_twofun_tb; initial begin DPI_fun_initialize(); end always@(posedge clk) begin #1 DPI_fun(x,y); end
Чтобы портировать и дополнительный испытательный стенд компонента от операционной системы Windows до операционной системы Linux, следуйте этим инструкциям.
У вас должна быть лицензия Embedded Coder® на порт Windows to Linux. Несмотря на то, что возможно, что порт будет работать без лицензии Embedded Coder, то использование не поддержано.
Создайте объект MATLAB Coder™ config
. Измените целевой тип устройства HW на LP64
для операционной системы Linux.
cfg=coder.config('dll');
cfg.HardwareImplementation.TargetHWDeviceType='Generic->64-bit Embedded Processor (LP64)';
Запустите команду dpigen
с помощью опции -config
, чтобы использовать объект config
, который вы создали на шаге 1. Используйте опцию -c
так, чтобы функциональный dpigen
сгенерировал только код. Например:
dpigen -config cfg DataTypes.m -args InputSample -c
Чтобы сгенерировать zip-файл к порту к Linux, измените папку на исходную папку (где файл buildInfo.mat
сгенерирован), и выполните следующие команды в командной строке:
load buildInfo buildInfo.packNGo()
Чтобы скопировать файл для портирования, возвратитесь к папке верхнего уровня. Найдите zip-файл сгенерированным на предыдущем шаге (то же имя как функция MATLAB). Скопируйте zip-файл в машину Linux.
Разархивируйте файл с помощью опции -j
, чтобы извлечь все файлы со сглаженной структурой папок. Можно разархивировать в любую папку. Например:
unzip -j DataTypes.zip
Скопируйте этот типичный скрипт make-файла в пустой файл:
SRC=$(wildcard *.c) OBJ=$(SRC:.c=.o) SHARE_LIB_NAME=DPI_Component.so all: $(SRC) $(SHARE_LIB_NAME) @echo "### Successfully generated all binary outputs." $(SHARE_LIB_NAME): $(OBJ) gcc -shared -lm $(OBJ) -o $@ .c.o: gcc -c -fPIC -Wall -ansi -pedantic -Wno-long-long -fwrapv -O0 $< -o $@
Замените DPI_Component.so
на имя разделяемой библиотеки, которую вы хотите создать.
Сохраните скрипт как Porting_DPIC.mk
в папке, где zip-файлы были извлечены.
Создайте разделяемую библиотеку со следующей командой:
make -f Porting_DPIC.mk all
Чтобы использовать сгенерированный компонент с SystemVerilog, смотрите Использование Сгенерированные Функции DPI в SystemVerilog.
(Необязательно) Запускает испытательный стенд, который был автоматически сгенерирован в Windows.
Скопируйте содержимое папки dpi_tb
с хост-машины Windows на целевую машину Linux.
Запустите испытательный стенд.
Чтобы запустить испытательный стенд в симуляторе HDL, смотрите Выполнение Сгенерированный Испытательный стенд в симуляторе HDL.