Если требуется выполнить шаги в качестве примера сами, сначала создайте модель в качестве примера.
Модель в качестве примера имеет один блок усиления параметром усиления, который настраивается в процессе моделирования.
Откройте Simulink® Block Library и нажмите Commonly Used Blocks.
Добавьте блок Inport.
Добавьте блок Gain. Дважды кликните, чтобы открыть маску блока и изменить значение в параметре Gain к gain
.
Добавьте блок Outport.
Соедините все блоки как показано в предыдущей схеме.
Создайте объект данных для параметра усиления:
В командной строке MATLAB® введите:
gain = Simulink.Parameter
Затем тип:
open('gain')
Эта команда открывает диалоговое окно свойства для объекта параметра.
Введите или выберите следующие значения:
Value: 2
Data type: дважды
Storage class:
Model default
Нажмите OK.
Для получения дополнительной информации об использовании объектов параметра для генерации кода смотрите, Применяют Классы памяти к Отдельному Сигналу, состоянию и Элементам данных Параметра (Simulink Coder).
С открытой моделью усиления выберите Simulation> Model 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
и исследуйте сгенерированный код.
В этом примере, после того, как вы вызываете initialize
функция, вызовите DPI_dut_setparam_gain
функция с новым значением параметров. Например, здесь усиление изменяется на 6:
DPI_dut_setparam_gain(objhandle, 6);
Если асинхронный сигнал сброса высок (идет от 0 до 1), вызовите Initialize
снова.
if(reset == 1'b1) begin objhandle = DPI_dut_initialize(objhandle); DPI_dut_setparam_gain(objhandle, 6); end
Код SystemVerilog теперь выглядит так:
// File: dut_build\dut_dpi.sv // Created: 2015-01-21 13:58:40 // Generated by MATLAB 8.5 and HDL Verifier 4.6 `timescale 1ns / 1ns 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_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 always @(posedge clk or posedge reset) begin if(reset == 1'b1) begin objhandle = DPI_dut_initialize(objhandle); 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
Чтобы запустить вашу симуляцию, создайте разделяемую библиотеку и экспортируйте компонент, как объяснено в следующих темах:
Восстановите совместно использованную библиотеку как описано в Библиотеках Сборки.