exponenta event banner

Создание компонентов DPI с помощью Simulink

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

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

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

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

Создание тестового стенда SystemVerilog в кодере HDL

На основе Coder™ HDL можно создать тестовый стенд SystemVerilog DPI. Используйте тестовый стенд для проверки созданного кода HDL с использованием кода C, созданного из всей модели Simulink, включая DUT и источники данных. Для использования этой функции вся модель должна поддерживать генерацию кода C с помощью Simulink Coder. Доступ к этой функции можно получить в мастере рабочего процесса HDL по пути Создание кода HDL (HDL Code Generation) > Задать параметры тестирования (Set Testbench Options) или в диалоговом окне Параметры конфигурации модели (Model Configuration Parameters) по пути Создание кода HDL (HDL Code Generation) > Испытательный стенд (Test Stench). Либо для доступа в командной строке установите значение GenerateSVDPITestBench имущество makehdltb (Кодер ЛПВП). См. раздел Проверка конструкции ЛПВП с помощью испытательного стенда с DPI SystemVerilog (кодер ЛПВП).

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

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

Можно выбрать битовый вектор, логический вектор или совместимый C-тип. Выберите в диалоговом окне Параметры конфигурации в разделе Создание кода > SystemVerilog DPI по пути SystemVerilog Ports > Ports type data.

Созданные типы 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. Чтобы выбрать один из этих параметров, в левой панели диалогового окна «Параметры конфигурации» выберите «Создание кода» > «SystemVerilog DPI», а затем задайте для параметра «Составной тип данных» значение structure или flattened.

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

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

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

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

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

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

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

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

Вы можете выбрать между SystemVerilog struct введите или распрямленные порты для сигналов отдельных компонентов в интерфейсе SystemVerilog. Чтобы выбрать один из этих параметров, в левой панели диалогового окна «Параметры конфигурации» выберите «Создание кода» > «SystemVerilog DPI» и задайте для параметра «Composite data type» значение structure или flattened.

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

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

Генерируемые сигналы управления

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

  • clk - синхросигнал

  • clk_enable - включить тактовый сигнал

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

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

Выберите между списком портов или объявлением интерфейса. Установите этот параметр в разделе Параметры конфигурации в разделе Создание кода > Порты SystemVerilog > Подключение.

  • Список портов - создает модуль 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

  • Interface - создает модуль 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, сгенерированном в системе, различаются. Созданный код можно проверить на предмет специфики. Пример созданных функций в контексте см. в разделе Начало работы с генерацией компонентов DPI SystemVerilog.

Настройка параметров

Можно выполнять различные моделирования с различными значениями параметров в модели Simulink. Если система имеет настраиваемые параметры, сгенерированный код SystemVerilog также содержит функцию Set Parameter для каждого настраиваемого параметра.

Генератор компонентов DPI генерирует функцию Set Parameter для каждого настраиваемого параметра в формате 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.

См. раздел Доступ к тестовым точкам DPI в SystemVerilog и начало работы с генерацией компонентов DPI в SystemVerilog.

Дополнительная задержка выборки

По сравнению с исходной моделью Simulink созданный модуль SystemVerilog вводит на выходе одну дополнительную задержку выборки. Например, в следующей модели Simulink выходной сигнал представляет собой задержанную версию входного сигнала с одной выборкой.

Сгенерированный код C сохраняет это поведение, и выходной сигнал содержит задержанную версию входного сигнала с одной выборкой. Однако в файле оболочки SystemVerilog тактовый сигнал используется для синхронизации входного и выходного сигналов:

always @(posedge clk) begin
    DPI_blk2_output(blk2_In1, blk2_Out1);
    DPI_blk2_update();
end

Выходные данные модуля SystemVerilog могут обновляться только на переднем крае тактового сигнала. Это требование вводит дополнительную задержку выборки.

Поведение многоскоростной системы

По умолчанию подсистемы Simulink имеют основную переменную времени выборки (FundST), которая указывает, когда во время моделирования подсистема выдает выходные данные и обновляет свое внутреннее состояние. В многоскоростных системах можно указать разное время выборки для различных портов. Дополнительные сведения см. в разделе Что такое время образца? (Симулинк).

Когда многоскоростная подсистема генерирует компонент 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 (svdpi_grt_template.vgt). Кроме того, можно создать собственный пользовательский шаблон. Укажите якоря для созданного кода в шаблоне, чтобы убедиться, что шаблон создает допустимый код SystemVerilog.

Шаблон SystemVerilog по умолчанию, предоставляемый средством проверки HDL, svdpi_grt_template.vgt. В этом шаблоне специальный clken_in и clken_out управляющие сигналы добавляются в интерфейс модуля SystemVerilog.

Можно генерировать DPI-компоненты SystemVerilog из нескольких подсистем и соединять их в имитаторе HDL. При этом эти управляющие сигналы определяют порядок выполнения этих компонентов. Они также минимизируют задержку между сигналом Simulink и сигналом SystemVerilog.

Можно также указать собственный файл шаблона со следующими условиями:

  • Файл должен находиться в пути MATLAB и доступен для поиска.

  • Файл должен иметь .vgt расширение.

Для настройки созданного кода можно использовать следующие дополнительные маркеры, вставляя их в инструкции comment по всему шаблону:

  • %<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 и vector ports.

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

    • Срабатывающая подсистема

    • Включенная подсистема

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

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

Связанные темы