Если у вас есть лицензия Simulink ® Coder™, можно создать компоненты SystemVerilog DPI одним из двух способов.
HDL Verifier™ интегрируется с Simulink Coder для экспорта подсистемы в виде сгенерированного кода C внутри компонента SystemVerilog с интерфейсом прямого программирования (DPI). Этот компонент можно интегрировать в моделирование ЛПВП в качестве поведенческой модели. Кодер предоставляет опции для настройки созданной структуры SystemVerilog. Генератор компонентов поддерживает доступ к контрольной точке и настраиваемые параметры. Кодер дополнительно создает тестовый стенд SystemVerilog, который проверяет сгенерированный компонент DPI на наличие векторов данных из подсистемы Simulink. Эта функция доступна в диалоговом окне Параметры конфигурации модели (Model Configuration Parameters) в разделе Создание кода (Code Generation). См. раздел Создание компонента SystemVerilog DPI.
На основе Coder™ HDL можно создать тестовый стенд SystemVerilog DPI. Используйте тестовый стенд для проверки созданного кода HDL с использованием кода C, созданного из всей модели Simulink, включая DUT и источники данных. Для использования этой функции вся модель должна поддерживать генерацию кода C с помощью Simulink Coder. Доступ к этой функции можно получить в мастере рабочего процесса HDL по пути Создание кода HDL (HDL Code Generation) > Задать параметры тестирования (Set Testbench Options) или в диалоговом окне Параметры конфигурации модели (Model Configuration Parameters) по пути Создание кода HDL (HDL Code Generation) > Испытательный стенд (Test Stench). Либо для доступа в командной строке установите значение GenerateSVDPITestBench имущество makehdltb (Кодер ЛПВП). См. раздел Проверка конструкции ЛПВП с помощью испытательного стенда с DPI SystemVerilog (кодер ЛПВП).
Поддерживаемые типы данных Simulink преобразуются в типы данных SystemVerilog, как показано в этой таблице.
Можно выбрать битовый вектор, логический вектор или совместимый C-тип. Выберите в диалоговом окне Параметры конфигурации в разделе Создание кода > SystemVerilog DPI по пути SystemVerilog Ports > Ports type data.
Созданные типы SystemVerilog
| MATLAB ® | SystemVerilog | ||
|---|---|---|---|
| Совместимый тип C | Логический вектор | Битовый вектор | |
uint8 | byte unsigned | logic [7:0] | bit [7:0] |
uint16 | shortint unsigned | logic [15:0] | bit [15:0] |
uint32 | int unsigned | logic [31:0] | bit [31:0] |
uint64 | longint unsigned | logic [63:0] | bit [63:0] |
int8 | byte | logic signed [7:0] | bit signed [7:0] |
int16 | shortint | logic signed [15:0] | bit signed [15:0] |
int32 | int | logic signed [31:0] | bit signed [31:0] |
int64 | longint | logic signed [63:0] | bit signed [63:0] |
boolean | byte unsigned | logic [0:0] | bit [0:0] |
| фиксированная точка | Порт имеет расширение на встроенный тип C, например: |
Длина логического вектора ( |
Длина битового вектора ( |
single | shortreal | ||
double | real | ||
complex | Вы можете выбрать между SystemVerilog | ||
| векторы, матрицы | Можно выбрать массивы SystemVerilog или скалярные порты. Чтобы выбрать один из этих параметров, в левой панели диалогового окна Параметры конфигурации выберите Создание кода > SystemVerilog DPI, а затем выберите параметр Scalarize matrix and vector ports. Например, двухэлементный вектор типа input logic [31:0] vecInput [0:1] При выборе Scalarize matrix и vector ports созданный SystemVerilog включает эти два порта, каждый из которых имеет тип input logic [31:0] vecInput_0, input logic [31:0] vecInput_1 При генерации векторных портов и портов массива кодер выравнивает матрицы в порядке «основной столбец». | ||
| невиртуальная шина | Вы можете выбрать между SystemVerilog | ||
| перечислимые типы данных | enum | ||
Весь код SystemVerilog, генерируемый генератором SystemVerilog DPI, содержит следующие управляющие сигналы:
clk - синхросигнал
clk_enable - включить тактовый сигнал
reset - асинхронный сброс
Выберите между списком портов или объявлением интерфейса. Установите этот параметр в разделе Параметры конфигурации в разделе Создание кода > Порты SystemVerilog > Подключение.
Список портов - создает модуль SystemVerilog со списком портов в заголовке, представляющим его интерфейс.
Например:
module MyMod_dpi(
input bit clk,
input bit clk_enable,
input bit reset,
/* Simulink signal name: 'in1' */
input real in1 ,
/* Simulink signal name: 'out1' */
output real out1
);
...
endmoduleInterface - создает модуль SystemVerilog с именем интерфейса в заголовке и отдельным объявлением интерфейса.
Например:
interface simple_if;
bit clk;
bit clk_enable;
bit reset;
/* Simulink signal name: 'in1' */
real in1 ;
/* Simulink signal name: 'out1' */
real out1 ;
endinterface
module MyMod_dpi(
simple_if vif
);
...
endmodule
Альтернатива командной строки: set_param (Simulink) и установите DPIPortConnection для параметра: 'Interface' или 'Port List'.
Например:
set_param(bdroot, 'DPIPortConnection','Interface')
Код SystemVerilog, сгенерированный генератором SystemVerilog DPI, содержит следующие функции:
// Declare imported C functions
import "DPI" function chandle DPI_subsystemname_initialize(chandle existhandle);
import "DPI" function chandle DPI_subsystemname_reset(input chandle objhandle,...
input real In1, inout real Out1);
import "DPI" function void DPI_subsystemname_output(input chandle objhandle, ...
input real In1, inout real Out1);
import "DPI" function void DPI_subsystemname_update(input chandle objhandle, input real In1);
import "DPI" function void DPI_subsystemname_terminate(input chandle objhandle);
Здесь, subsystemname - имя подсистемы, для которой был создан код.
Если модель также содержит настраиваемые параметры, см. раздел Настройка параметров.
Инициализация функции - Initialize вызывается в начале моделирования.
Например, для подсистемы под названием dut:
initial begin
objhandle = DPI_dut_initialize(objhandle);
end
Функция сброса - вызов reset при необходимости сбросить моделирование в известное состояние сброса.
Например, для подсистемы под названием dut:
initial begin
objhandle = DPI_dut_reset(objhandle, 0, 0);
end
Функция вывода - на положительной границе тактового сигнала, если clk_enable высокий, функция вывода вызывается первой, за ней следует функция обновления.
Например, для подсистемы под названием dut:
if(clk_enable) begin
DPI_dut_output(objhandle, dut_In1, dut_Out1);
DPI_dut_update(objhandle, dut_In1);
end
Функция обновления
На положительной границе синхросигнала, если clk_enable высокий, функция обновления вызывается после функции вывода.
Например, для подсистемы под названием dut:
if(clk_enable) begin
DPI_dut_output(objhandle, dut_In1, dut_Out1);
DPI_dut_update(objhandle, dut_In1);
end
Завершить функцию
Установить конкретные условия для досрочного прекращения моделирования.
Например, для подсистемы под названием dut:
if (condition for termination) begin DPI_dut_terminate(objhandle); end
Подробные сведения о функции в коде SystemVerilog, сгенерированном в системе, различаются. Созданный код можно проверить на предмет специфики. Пример созданных функций в контексте см. в разделе Начало работы с генерацией компонентов DPI SystemVerilog.
Можно выполнять различные моделирования с различными значениями параметров в модели Simulink. Если система имеет настраиваемые параметры, сгенерированный код SystemVerilog также содержит функцию Set Parameter для каждого настраиваемого параметра.
Генератор компонентов DPI генерирует функцию Set Parameter для каждого настраиваемого параметра в формате DPI_.subsystemname_setparam_tunableparametername
В этом примере настраиваемый параметр усиления имеет свой собственный setparam_gain функция.
import "DPI" function void DPI_dut_setparam_gain(input chandle objhandle, input real dut_P_gain);
Созданный код SystemVerilog не вызывает эту функцию. Вместо этого используются параметры по умолчанию. Чтобы изменить эти параметры во время моделирования, явно вызовите определенный setparam функция. Например, в подсистеме под названием dut, вы можете изменить коэффициент усиления во время моделирования на значение 6, вставив следующий вызов:
DPI_dut_setparam_gain(objhandle, 6);
Чтобы сделать параметр настраиваемым, создайте объект данных из подсистемы перед созданием кода SystemVerilog. См. раздел Настройка параметра усиления во время моделирования.
Эта функция позволяет получать доступ к внутренним сигналам компонента SystemVerilog DPI в имитаторе HDL. Можно обозначить внутренние сигналы в модели как контрольные точки и настроить генератор SystemVerilog DPI для создания отдельных или сгруппированных функций доступа.
Также можно включить ведение журнала по контрольным точкам. При включенном протоколировании можно использовать созданный тестовый стенд для сравнения зарегистрированных данных Simulink со значениями, наблюдаемыми при выполнении компонента SystemVerilog.
См. раздел Доступ к тестовым точкам DPI в SystemVerilog и начало работы с генерацией компонентов DPI в SystemVerilog.
По сравнению с исходной моделью Simulink созданный модуль SystemVerilog вводит на выходе одну дополнительную задержку выборки. Например, в следующей модели Simulink выходной сигнал представляет собой задержанную версию входного сигнала с одной выборкой.

Сгенерированный код C сохраняет это поведение, и выходной сигнал содержит задержанную версию входного сигнала с одной выборкой. Однако в файле оболочки SystemVerilog тактовый сигнал используется для синхронизации входного и выходного сигналов:
always @(posedge clk) begin
DPI_blk2_output(blk2_In1, blk2_Out1);
DPI_blk2_update();
endВыходные данные модуля SystemVerilog могут обновляться только на переднем крае тактового сигнала. Это требование вводит дополнительную задержку выборки.

По умолчанию подсистемы Simulink имеют основную переменную времени выборки (FundST), которая указывает, когда во время моделирования подсистема выдает выходные данные и обновляет свое внутреннее состояние. В многоскоростных системах можно указать разное время выборки для различных портов. Дополнительные сведения см. в разделе Что такое время образца? (Симулинк).
Когда многоскоростная подсистема генерирует компонент DPI, компонент DPI работает во время выборки, равное наибольшему общему делителю из всех времен выборки в подсистеме.
Например, предположим, что подсистема имеет основное время выборки 0,01 (то есть FundST является 0.01) и время выборки ST1 и ST2 0,5 и 0,7 соответственно.
ST1=0.5, ST2=0.7. Компонент DPI работает во время выборки 0,1 (поскольку 0,1 является наибольшим общим делителем 0,5 и 0,7). Для успешного получения сигнала с временем выборки 0,5 (ST1) или 0,7 (ST2) тактовый сигнал HDL должен переключаться пять или семь раз соответственно.
Когда компонент DPI генерируется на верхнем уровне, компонент выполняется во время основной выборки.
На этой диаграмме показана взаимосвязь между входным синхросигналом HDL и временем выборки ST1 и ST2.

Созданную оболочку SystemVerilog можно настроить путем изменения шаблона, включенного в программу проверки HDL (svdpi_grt_template.vgt). Кроме того, можно создать собственный пользовательский шаблон. Укажите якоря для созданного кода в шаблоне, чтобы убедиться, что шаблон создает допустимый код SystemVerilog.
Шаблон SystemVerilog по умолчанию, предоставляемый средством проверки HDL, svdpi_grt_template.vgt. В этом шаблоне специальный clken_in и clken_out управляющие сигналы добавляются в интерфейс модуля SystemVerilog.
Можно генерировать DPI-компоненты SystemVerilog из нескольких подсистем и соединять их в имитаторе HDL. При этом эти управляющие сигналы определяют порядок выполнения этих компонентов. Они также минимизируют задержку между сигналом Simulink и сигналом SystemVerilog.
Можно также указать собственный файл шаблона со следующими условиями:
Файл должен находиться в пути MATLAB и доступен для поиска.
Файл должен иметь .vgt расширение.
Для настройки созданного кода можно использовать следующие дополнительные маркеры, вставляя их в инструкции comment по всему шаблону:
%<FileName>
%<PortList>
%<EnumDataTypeDefinitions>
%<ImportInitFunction>
%<ImportOutputFunction>
%<ImportUpdateFunction>
%<ImportSetParamFunction>
%<CallInitFunction>
%<CallUpdateFunction>
%<CallOutputFunction>
%<IsLibContinuous>
%<ObjHandle>
Инструкции по настройке кода см. в разделе Настройка сгенерированного кода SystemVerilog.
Примечание
Генератор компонентов SystemVerilog DPI не создает тестовые стенды для настраиваемых компонентов.
По умолчанию HDL Verifier преобразует матрицы и векторы в одномерные массивы в SystemVerilog. Например, матрица 4 на 2 в Simulink преобразует в одномерный массив из восьми элементов в SystemVerilog. Чтобы создать несколько скалярных портов в интерфейсе SystemVerilog, выберите в параметрах конфигурации Scalarize matrix и vector ports.
Генерация компонентов SystemVerilog DPI поддерживает следующие подсистемы только для генерации кода. Нет поддержки испытательного стенда для этих подсистем.
Срабатывающая подсистема
Включенная подсистема
Подсистема с портом действия
Для достижения наилучших результатов не экспортируйте несколько подсистем отдельно, поскольку может быть трудно выполнить правильный порядок выполнения. Вместо этого объедините несколько подсистем в одну и создайте код из вновь созданной единой подсистемы.