Если у вас есть лицензия Simulink® Coder™, можно сгенерировать компоненты SystemVerilog DPI с помощью одного из двух методов.
HDL Verifier™ объединяется с Simulink Coder, чтобы экспортировать подсистему как сгенерированный код C в компоненте SystemVerilog с интерфейсом программирования на машинном языке (DPI). Можно интегрировать этот компонент в симуляцию HDL как поведенческая модель. Кодер предоставляет возможности настраивать сгенерированную структуру SystemVerilog. Генератор компонента поддерживает доступ к тестовой точке и настраиваемые параметры. Кодер опционально генерирует испытательный стенд SystemVerilog, который проверяет сгенерированный компонент DPI по векторам данных от вашей Подсистемы Simulink. Эта функция доступна в диалоговом окне Model Configuration Parameters под Code Generation. Смотрите Генерируют Компонент SystemVerilog DPI.
От HDL Coder™ можно сгенерировать испытательный стенд SystemVerilog DPI. Используйте испытательный стенд, чтобы проверить ваш сгенерированный HDL-код с помощью кода С, сгенерированного из целой модели Simulink, включая DUT и источники данных. Чтобы использовать эту функцию, ваша целая модель должна поддержать генерацию кода C с Simulink Coder. Можно получить доступ к этой функции в HDL Workflow Advisor под HDL Code Generation> Set Testbench Options, или в диалоговом окне Model Configuration Parameters, под HDL Code Generation> Test Bench. В качестве альтернативы для доступа из коммандной строки, набор GenerateSVDPITestBench
свойство makehdltb
. Смотрите проверяют проект HDL с большим набором данных Используя испытательный стенд (HDL Coder) SystemVerilog DPI.
Поддерживаемые типы данных Simulink преобразованы в типы данных SystemVerilog, как показано в этой таблице.
Simulink | SystemVerilog |
---|---|
uint8 | byte unsigned |
uint16 | shortint unsigned |
uint32 | int unsigned |
uint64 | longint unsigned |
int8 | byte |
int16 | shortint |
int32 | int |
int64 | longint |
single | shortreal |
double | real |
boolean | byte unsigned |
complex | Можно выбрать между SystemVerilog |
векторы, матрицы | массивы Например, 4 2 матрица в Simulink преобразована в одномерный массив восьми элементов в SystemVerilog. Кодер сглаживает матрицы в порядке развертывания по столбцам. |
невиртуальная шина | Можно выбрать между SystemVerilog |
перечислимые типы данных | enum |
фиксированная точка | Можно выбрать немного вектора, логического вектора или совместимый тип C. Выберите в диалоговом окне Configuration Parameters, в разделе Code Generation> SystemVerilog DPI, под SystemVerilog Ports> Fixed-point data type. |
Весь код SystemVerilog, сгенерированный генератором SystemVerilog DPI, содержит эти управляющие сигналы:
clk
– часы синхронизации
clk_enable
– часы включают
reset
– асинхронный сброс
Выберите между списком портов или объявлением интерфейса. Установите эту опцию в Параметрах конфигурации под Code Generation> SystemVerilog ports> Connection.
Список портов - генерирует модуль 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 ); ... endmodule
Интерфейс - генерирует модуль 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
функция и набор 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, сгенерированном от вашей системы, варьируются. Можно исследовать сгенерированный код на специфические особенности. Для примера сгенерированных функций в контексте смотрите Начало работы с Генерацией Компонента SystemVerilog DPI.
Можно запустить различные симуляции с различными значениями для параметров в модели Simulink. Если ваша система имеет настраиваемые параметры, сгенерированный код SystemVerilog также содержит функцию Параметра Набора для каждого настраиваемого параметра.
Генератор компонента DPI генерирует функцию Параметра Набора для каждого настраиваемого параметра в формате 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.
Смотрите тестовую точку компонента SystemVerilog DPI доступ и начинающий с генерацией компонента SystemVerilog DPI.
По сравнению с исходной моделью Simulink сгенерированный модуль SystemVerilog вводит одну дополнительную демонстрационную задержку при выходе. Например, в следующей модели Simulink, выход является задержанной версией с одной выборкой входного сигнала.
Сгенерированный код C сохраняет это поведение, и выход включает задержанную версию с одной выборкой входного сигнала. Однако в файле обертки SystemVerilog, сигнал часов используется, чтобы синхронизировать сигналы ввода и вывода:
always @(posedge clk) begin DPI_blk2_output(blk2_In1, blk2_Out1); DPI_blk2_update(); end
Выход модуля SystemVerilog может только быть обновлен на фронте. Это требование вводит дополнительную демонстрационную задержку.
По умолчанию Подсистемы Simulink имеют основную переменную шага расчета (FundST), который указывает, когда в процессе моделирования подсистема производит выходные параметры и обновляет ее внутреннее состояние. С многоскоростными системами можно задать различные шаги расчета для различных портов. Для получения дополнительной информации смотрите то, Что Шаг расчета? (Simulink).
Когда многоскоростная подсистема генерирует компонент 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 Verifier (svdpi_grt_template.vgt
). В качестве альтернативы можно создать собственный шаблон. Обеспечьте привязки для сгенерированного кода в вашем шаблоне, чтобы проверить, что шаблон генерирует допустимый код SystemVerilog.
Шаблоном SystemVerilog по умолчанию, обеспеченным HDL Verifier, является svdpi_grt_template.vgt
. В этом шаблоне, специальном clken_in
и clken_out
управляющие сигналы добавляются к интерфейсу модуля SystemVerilog.
Можно сгенерировать компоненты SystemVerilog DPI от нескольких подсистем и соединить их вместе в симуляторе HDL. Когда вы делаете так, эти управляющие сигналы определяют порядок выполнения тех компонентов. Они также минимизируют задержку между Сигналом Simulink и сигналом SystemVerilog.
Можно также задать собственный файл шаблона со следующими условиями:
Файл должен быть на пути MATLAB® и доступен для поиска.
Файл должен иметь .vgt
расширение.
Можно использовать эти дополнительные лексемы, чтобы настроить сгенерированный код путем вставки их в операторах комментария в шаблоне:
%<FileName>
%<PortList>
%<EnumDataTypeDefinitions>
%<ImportInitFunction>
%<ImportOutputFunction>
%<ImportUpdateFunction>
%<ImportSetParamFunction>
%<CallInitFunction>
%<CallUpdateFunction>
%<CallOutputFunction>
%<IsLibContinuous>
%<ObjHandle>
Смотрите Настраивают Сгенерированный Код SystemVerilog для получения инструкций относительно настройки вашего кода.
Генератор компонента SystemVerilog DPI не генерирует испытательные стенды для индивидуально настраиваемых компонентов.
HDL Verifier преобразует матрицы и векторы к одномерным массивам в SystemVerilog. Например, 4 2 матрица в Simulink преобразована в одномерный массив восьми элементов в SystemVerilog.
Генерация компонента SystemVerilog DPI поддерживает следующие подсистемы для генерации кода только. Нет никакой поддержки испытательного стенда этих подсистем.
Инициированная подсистема
Enabled подсистема
Подсистема с портом действия
Для лучших результатов постарайтесь не экспортировать несколько подсистем отдельно, потому что это может затруднить, чтобы достигнуть правильного порядка выполнения. Вместо этого объедините несколько подсистем в одну и сгенерируйте код от недавно созданной, одной подсистемы.