Чтобы выполнить шаги в качестве примера самостоятельно, сначала создайте модель в качестве примера.
Модель в качестве примера имеет один блок усиления параметром усиления, который настраивается в процессе моделирования.
Откройте Simulink® Block Library и нажмите Commonly Used Blocks.
Добавьте блок 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')
Эта команда открывает диалоговое окно свойства для объекта параметра.
Введите или выберите следующие значения:
Value: 2
Data type: дважды
Storage class:
Model default
Нажмите OK.
Для получения дополнительной информации об использовании объектов параметра для генерации кода смотрите, Применяют Классы памяти к Отдельному Сигналу, состоянию и Элементам данных Параметра (Simulink Coder).
Установка Storage class к Auto
оптимизирует параметр во время генерации кода. Рекомендуемые значения, когда генерирующие настраиваемые параметры DPI:
Model default
SimulinkGlobal
ExportedGlobal
Используйте Model default
когда ваш параметр будет специфичен для экземпляра, и выберите между SimulinkGlobal
и ExportedGlobal
сгенерировать глобальную переменную.
Откройте свою модель, и на вкладке Modeling, в разделе Setup, нажмите Model 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, чтобы принять эти настройки и закрыть диалоговое окно Configuration Parameters.
В модели в качестве примера щелкните правой кнопкой по усилению и блокам задержки и выберите Create Subsystem from Selection. В данном примере переименуйте подсистему dut
.
Щелкните правой кнопкой по подсистеме и выберите C/C++ Code> Build this subsystem.
В коде Сборки для диалогового окна подсистемы нажмите Build.
Компонент SystemVerilog сгенерирован как dut_build/dut_dpi.sv
в вашей текущей рабочей папке.
Откройте файл dut_build/dut_dpi.sv
и исследуйте сгенерированный код.
В этом примере, после того, как вы вызываете reset
функция, вызовите 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
Чтобы запустить вашу симуляцию, создайте разделяемую библиотеку и экспортируйте компонент, как объяснено в следующих темах:
Восстановите совместно использованную библиотеку как описано в Библиотеках Сборки.