Генерация компонента DPI с Simulink

Обзор генерации DPI

Если у вас есть Simulink® Лицензия Coder™, можно сгенерировать компоненты SystemVerilog DPI с помощью одного из двух методов.

Экспортируйте компонент SystemVerilog DPI для подсистемы

HDL Verifier™ объединяется с Simulink Coder, чтобы экспортировать подсистему как сгенерированный код C в компоненте SystemVerilog с интерфейсом программирования на машинном языке (DPI). Можно интегрировать этот компонент в симуляцию HDL как поведенческая модель. Кодер предоставляет возможности настраивать сгенерированную структуру SystemVerilog. Генератор компонента поддерживает доступ к тестовой точке и настраиваемые параметры. Кодер опционально генерирует испытательный стенд SystemVerilog, который проверяет сгенерированный компонент DPI по векторам данных от вашей Подсистемы Simulink. Эта функция доступна в диалоговом окне Model Configuration Parameters под Code Generation. Смотрите Генерируют Компонент SystemVerilog DPI.

Сгенерируйте испытательный стенд SystemVerilog в HDL Coder

От 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 Coder). Смотрите проверяют проект HDL Используя испытательный стенд (HDL Coder) SystemVerilog DPI.

Поддерживаемые типы данных Simulink

Поддерживаемые типы данных Simulink преобразованы в типы данных SystemVerilog, как показано в этой таблице.

Можно выбрать немного вектора, логического вектора или совместимый тип C. Выберите в диалоговом окне Configuration Parameters, в разделе Code Generation> SystemVerilog DPI, под SystemVerilog Ports> Ports data type.

Сгенерированные типы SystemVerilog

MATLAB®SystemVerilog
Совместимый тип CЛогический векторБитовый вектор
uint8byte unsignedlogic [7:0] bit [7:0]
uint16shortint unsignedlogic [15:0] bit [15:0]
uint32int unsignedlogic [31:0]bit [31:0]
uint64longint unsignedlogic [63:0]bit [63:0]
int8bytelogic signed [7:0]bit signed [7:0]
int16shortintlogic signed [15:0]bit signed [15:0]
int32intlogic signed [31:0]bit signed [31:0]
int64longintlogic signed [63:0]bit signed [63:0]
booleanbyte unsignedlogic [0:0]bit [0:0]
фиксированная точка

Порт является знаком, расширенным к встроенному типу C, такому как int, int unsigned, byte, byte unsigned, и т.д.

logic [n-1:0]

logic signed [n-1:0]

Логическая длина вектора (n) равно wordlength. Знак наследован от типа фиксированной точки.

bit [n-1:0]

bit signed [n-1:0]

Длина битового вектора (n) равно wordlength. Знак наследован от типа фиксированной точки.

singleshortreal
doublereal
complex

Можно выбрать между SystemVerilog struct тип данных или сглаженные порты для действительных и мнимых частей в интерфейсе SystemVerilog. Чтобы выбрать между этими опциями, на левой панели диалогового окна Configuration Parameters, выбирают Code Generation> SystemVerilog DPI, и затем устанавливают параметр Composite data type на structure или flattened.

векторы, матрицы

Можно выбрать между массивами SystemVerilog или скалярными портами. Чтобы выбрать между этими опциями, на левой панели диалогового окна Configuration Parameters, выбирают Code Generation> SystemVerilog DPI, и затем выбирают параметр Scalarize matrix and vector ports.

Например, двухэлементный вектор из типа uint32 в Simulink генерирует этот порт вектора SystemVerilog:

input logic [31:0] vecInput [0:1]

Когда вы выбираете Scalarize matrix and vector ports, сгенерированный SystemVerilog включает эти два порта, каждый тип logic [31:0]:

input logic [31:0] vecInput_0,
input logic [31:0] vecInput_1

При генерации векторных и портов массива кодер сглаживает матрицы в порядке развертывания по столбцам.

невиртуальная шина

Можно выбрать между SystemVerilog struct введите или сглаженные порты для отдельных сигналов компонента в интерфейсе SystemVerilog. Выбрать между этими опциями, на левой панели диалогового окна Configuration Parameters, избранного раздела Code Generation> SystemVerilog DPI, и установить Composite data type на structure или flattened.

перечислимые типы данныхenum

Сгенерированная обертка SystemVerilog

Сгенерированные управляющие сигналы

Весь код SystemVerilog, сгенерированный генератором SystemVerilog DPI, содержит эти управляющие сигналы:

  • clk – часы синхронизации

  • clk_enable – часы включают

  • reset – асинхронный сброс

Сгенерированный интерфейс модуля SystemVerilog

Выберите между списком портов или объявлением интерфейса. Установите эту опцию в Параметрах конфигурации под 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 (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, сгенерированном от вашей системы, варьируются. Можно исследовать сгенерированный код на специфические особенности. Для примера сгенерированных функций в контексте смотрите Начало работы с Генерацией Компонента 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, выберите Scalarize matrix and vector ports в параметрах конфигурации.

  • Генерация компонента SystemVerilog DPI поддерживает следующие подсистемы для генерации кода только. Нет никакой поддержки испытательного стенда этих подсистем.

    • Триггируемая подсистема

    • Enabled подсистема

    • Подсистема с портом действия

Для лучших результатов постарайтесь не экспортировать несколько подсистем отдельно, потому что это может затруднить, чтобы достигнуть правильного порядка выполнения. Вместо этого объедините несколько подсистем в одну и сгенерируйте код от недавно созданной, одной подсистемы.

Похожие темы