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

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

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

Simulink SystemVerilog
uint8byte unsigned
uint16shortint unsigned
uint32int unsigned
uint64longint unsigned
int8byte
int16shortint
int32int
int64longint
singleshortreal
doublereal
booleanbyte unsigned
complex

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

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

массивы

Например, 4 2 матрица в Simulink преобразована в одномерный массив восьми элементов в SystemVerilog. Кодер сглаживает матрицы в порядке развертывания по столбцам.

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

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

перечислимые типы данныхenum
фиксированная точка

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

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

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

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

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

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

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

Сгенерированный интерфейс модуля 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 и установите параметр 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 DPI поддерживает следующие подсистемы для генерации кода только. Нет никакой поддержки испытательного стенда этих подсистем.

    • Инициированная подсистема

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

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

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

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте