Чтобы выполнить шаги примера самостоятельно, сначала создайте модель примера.
Пример модели имеет один блок усиления с параметром усиления, который настраивается во время симуляции.
Откройте Simulink® «Библиотека блоков» и нажмите «Обычно используемые блоки».
Добавьте блок Inport.
Добавьте блок Gain. Дважды кликните, чтобы открыть маску блока и изменить значение в параметре Gain на gain
.
Дважды кликните Gain блок, чтобы открыть маску блока. На вкладке Signal Attributes и установите Output data type равным uint8
.
Примечание
Если вы оставляете Output data type как Inherit: Inherit via internal rule
Simulink Coder™ выбирает тип данных на основе значения по умолчанию Gain
параметр, который может не включать значение при настройке параметра после генерации DPI. Задайте конкретный тип выходного сигнала блока, чтобы избежать неправильной настройки типа Simulink Coder.
Добавьте блок Outport.
Соедините все блоки как показано на предыдущей схеме.
Создайте объект данных для параметра усиления:
В MATLAB® командная строка, введите:
gain = Simulink.Parameter
Далее введите:
open('gain')
Эта команда открывает диалоговое окно свойств для объекта параметра.
Введите или выберите следующие значения:
<reservedrangesplaceholder0> 2
Data type: double
<reservedrangesplaceholder1> <reservedrangesplaceholder0>
Нажмите OK.
Для получения дополнительной информации об использовании объектов параметров для генерации кода смотрите Строение Генерации кода C для Элементов Интерфейса Модели (Simulink Coder).
Примечание
Установка значения Storage class Auto
оптимизирует параметр во время генерации кода. Рекомендуемые значения при генерации настраиваемых параметров DPI:
Model default
SimulinkGlobal
ExportedGlobal
Использование Model default
когда ваш параметр специфичен для экземпляра и выбирает между SimulinkGlobal
и ExportedGlobal
чтобы сгенерировать глобальную переменную.
На вкладке Apps Simulink нажмите HDL Verifier. Затем на вкладке HDL Verifier нажмите C Code Settings. Диалоговое окно Configuration Parameters откроется на Code Generation.
При System target file кликните Browse и выберите systemverilog_dpi_grt.tlc
.
Если у вас есть лицензия для Embedded Coder®можно выбрать целевую systemverilog_dpi_ert.tlc
. Эта цель позволяет вам получить доступ к дополнительным опциям генерации кода (на панели Генерация кода в параметрах конфигурации модели).
В Toolchain, под Build process, выберите набор инструментов, который вы хотите использовать в списке. Инструкции по выбору набора инструментальных средств см. в разделе «Генерация кросс-платформенных компонентов DPI».
Вы можете выбрать флаги для компиляции. В группе Build Configuration выберите Specify
из раскрывающегося списка. Нажмите кнопку Show Settings, чтобы отобразить текущие флаги.
В группе Генерация кода щелкните SystemVerilog DPI.
Оставьте Generate test bench и Customize generated SystemVerilog code очищенными (поскольку этот пример изменяет сгенерированный код SystemVerilog, любой сгенерированный при этом испытательный стенд не имеет правильных результатов).
Щелкните OK, чтобы принять эти настройки и закрыть диалоговое окно Параметры конфигурации.
В модели примера щелкните правой кнопкой мыши по блокам усиления и задержки и выберите Create Subsystem from Selection. В данном примере переименуйте подсистему dut
.
На панели инструментов Simulink, на вкладке HDL Verifier, нажмите Generate DPI Component.
В диалоговом окне Код сборки для подсистемы нажмите Build.
Компонент SystemVerilog генерируется следующим dut_build/dut_dpi.sv
в текущей рабочей папке.
Откройте файл dut_build/dut_dpi.sv
и исследуйте сгенерированный код.
В этом примере после вызова reset
function, вызовите DPI_dut_setparam_gain
функция с новым значением параметров. Для примера здесь коэффициент усиления изменяется на 6:
DPI_dut_setparam_gain(objhandle, 6);
Если сигнал асинхронного сброса высок (переходит от 0 до 1), вызовите reset
снова функция.
if(reset == 1'b1) begin DPI_dut_reset(objhandle, dut_U_In1, dut_Y_Out1); DPI_dut_setparam_gain(objhandle, 6); end
Код SystemVerilog теперь выглядит следующим образом:
module dut_dpi( input clk, input clk_enable, input reset, input real dut_U_In1, output real dut_Y_Out1 ); chandle objhandle=null; // Declare imported C functions import "DPI" function chandle DPI_dut_initialize(chandle existhandle); import "DPI" function void DPI_dut_reset(input chandle objhandle, input real dut_U_In1, inout real dut_Y_Out1); import "DPI" function void DPI_dut_output(input chandle objhandle, input real dut_U_In1, inout real dut_Y_Out1); import "DPI" function void DPI_dut_update(input chandle objhandle, input real dut_U_In1); import "DPI" function void DPI_dut_terminate(input chandle objhandle); import "DPI" function void DPI_dut_setparam_gain(input chandle objhandle, input real dut_P_gain); initial begin objhandle = DPI_dut_initialize(objhandle); DPI_dut_setparam_gain(objhandle, 6); end final begin DPI_dut_terminate(objhandle); end always @(posedge clk or posedge reset) begin if(reset == 1'b1) begin DPI_dut_reset(objhandle, dut_U_In1, dut_Y_Out1); DPI_dut_setparam_gain(objhandle, 6); end else if(clk_enable) begin DPI_dut_output(objhandle, dut_U_In1, dut_Y_Out1); DPI_dut_update(objhandle, dut_U_In1); end end endmodule
Чтобы запустить симуляцию, создайте общую библиотеку и экспортируйте компонент, как объяснено в следующих разделах:
Перестроите общую библиотеку, как описано в Build Libraries.