主要内容

DPI组件生成金宝app

DPI代概述

如果你有金宝app®编码器™您可以使用以下两种方法之一生成SystemVerilog DPI组件。

导出子系统的SystemVerilog DPI组件

HDL验证器™ 结合金宝app仿真软件编码器在SystemVerilog组件中使用直接编程接口(DPI)将子系统作为生成的C代码导出。您可以将此组件作为行为模型集成到您的HDL模拟中。编码器提供了定制生成的SystemVerilog结构的选项。组件生成器支持测试点访问和可调参数。金宝app编码器可选地生成一个SystemVerilog测试台,该测试台根据来自Simulink子系统的数据向量验证生成的DPI组件。金宝app下面的“模型配置参数”对话框中有此特性代码生成.看到生成SystemVerilog DPI组件

在中生成SystemVerilog测试台高密度脂蛋白编码器

来自HDL编码器™, 您可以生成SystemVerilog DPI测试台。使用测试台使用从整个Simulink模型(包括DUT和数据源)生成的C代码验证生成的HDL代码。要使用此功能,您的整个模型必须支持使用金宝app金宝app金宝app仿真软件编码器.您可以在下面的HDL Workflow Advisor中访问此功能HDL代码生成>设置测试台选项,或在“模型配置参数”对话框中,在HDL代码生成>试验台.或者,对于命令行访问,设置生成VDP测试台的属性makehdltb(高密度脂蛋白编码器).看到使用SystemVerilog DPI测试台验证HDL设计(高密度脂蛋白编码器)

金宝app支持金宝app数据类型

金宝app支持的Simulin金宝appk数据类型转换为SystemVerilog数据类型,如下表所示。

您可以选择位向量、逻辑向量或兼容的C类型。在“配置参数”对话框中选择代码生成>SystemVerilog DPI第节,下SystemVerilog港口>端口数据类型

生成SystemVerilog类型

MATLAB® 系统验证日志
兼容C型 逻辑向量 位向量
uint8 无符号字节 逻辑(7:0) 位(7:0)
uint16 短整型无符号 逻辑15:0 位(15:0)
uint32 int无符号 逻辑[31:0] 位(31:0)
uint64 长无符号 逻辑[63:0] 比特[63:0]
int8 字节 逻辑(7:0)签署 位符号[7:0]
int16 矮子 逻辑签名[15:0] 位签署(15:0)
int32 int 逻辑(31:0)签署 位签署(31:0)
int64 longint 逻辑签名[63:0] 位签署(63:0)
布尔 无符号字节 逻辑0时 位[0:0]
定点

端口被符号扩展为内置的C类型,例如intint无符号字节无符号字节

逻辑(n-1:0)

逻辑符号[n-1:0]

逻辑向量长度(n等于.符号继承自固定点类型。

位(n-1:0)

位签署(n-1:0)

位向量长度(n等于.符号继承自固定点类型。

单一的 shortreal
真实的
复杂的

您可以选择SystemVerilog结构体SystemVerilog接口中的实部和虚部的数据类型或平坦端口。要在这些选项中进行选择,请在配置参数对话框的左侧窗格中选择代码生成>SystemVerilog DPI,然后设置复合数据类型参数到结构夷为平地

向量、矩阵

您可以选择SystemVerilog阵列或标量端口。要在这些选项中进行选择,请在配置参数对话框的左侧窗格中选择代码生成>SystemVerilog DPI,然后选择矩阵和向量端口的标量化参数。

例如,类型为的两元素向量uint32在Si金宝appmulink中生成SystemVerilog矢量端口:

输入逻辑[31:0]向量输入[0:1]

当您选择矩阵和向量端口的标量化,生成的SystemVerilog包括这两个端口,每个端口的类型逻辑[31:0]

输入逻辑[31:0]vecInput_0,输入逻辑[31:0]vecInput_1

生成向量和数组端口时,编码器按列主顺序展平矩阵。

非虚拟总线

您可以选择SystemVerilog结构体SystemVerilog接口中单独组件信号的类型或平坦端口。要在这些选项中进行选择,请在配置参数对话框的左侧窗格中选择代码生成>SystemVerilog DPI节,并设置复合数据类型结构夷为平地

枚举数据类型 枚举

生成的SystemVerilog包装器

产生控制信号

由SystemVerilog DPI生成器生成的所有SystemVerilog代码包含以下控制信号:

  • clk——同步时钟

  • clk_enable——时钟使

  • 重置——异步复位

生成的SystemVerilog模块接口

在端口列表或接口声明之间进行选择。在“配置参数”下设置此选项代码生成>SystemVerilog港口>联系

  • 端口列表-生成一个SystemVerilog模块,在头中有一个端口列表,代表它的接口。

    例如:

    模块MyMod_dpi(输入位时钟,输入位时钟启用,输入位复位,/*模拟链路信号名称:'in1'*/输入实in1,/*模拟链路信号名称:'out1'*金宝app/输出实out1);…endmodule

  • 接口-生成一个SystemVerilog模块,在头文件中包含一个接口名称,并单独声明接口。

    例如:

    接口simple_if;位时钟;位clk_enable;位复位;/* 金宝appSimulink信号名:'in1' */真实in1;/* 金宝appSimulink信号名:'out1' */真实的out1;endinterface模块MyMod_dpi(simple_if vif);...endmodule

选择命令行:使用设置参数(金宝app模型)函数并设置DPIPortConnection参数是“界面”的端口列表

例如:

set_参数(bdroot,'DPIPortConnection','Interface')

生成的组件功能

由SystemVerilog DPI生成器生成的SystemVerilog代码包含以下函数:

//声明导入的C函数导入“DPI”函数chandle DPI_子系统名_初始化(chandle existhandle);导入“DPI”函数chandle DPI_子系统名_reset(输入chandle objhandle,……input real In1, inout real Out1);import“DPI”函数void DPI_子系统名_output(input chandle objhandle,…)input real In1, inout real Out1);import“DPI”函数void DPI_子系统名_更新(输入chandle objhandle,输入实数In1);导入“DPI”功能无效DPI_子系统名_terminate(输入chandle objhandle);

在这里子系统名为其生成代码的子系统的名称。

如果您的模型还包含可调参数,请参见参数调优

  • 初始化函数-初始化函数在模拟开始时调用。

    例如,对于标题为dut

    初始化objhandle = DPI_dut_initialize(objhandle);结束
  • Reset函数-调用重置当您希望将模拟重置为已知重置状态时,此函数将起作用。

    例如,对于标题为dut

    初始化objhandle = DPI_dut_reset(objhandle, 0, 0);结束
  • 输出功能-在时钟的正边缘,如果clk_enable时,首先调用输出函数,然后调用更新函数。

    例如,对于标题为dut

    如果(clk_enable)开始DPI_dut_output(objhandle, dut_In1, dut_Out1);DPI_dut_update (objhandle dut_In1);结束
  • 更新功能

    在时钟的正边缘,如果clk_enable时,更新函数在输出函数之后调用。

    例如,对于标题为dut

    如果(clk_enable)开始DPI_dut_output(objhandle, dut_In1, dut_Out1);DPI_dut_update (objhandle dut_In1);结束
  • 终止函数

    设定模拟提前终止的具体条件。

    例如,对于标题为dut

    DPI_dut_terminate(objhandle); / /终止的条件结束

系统生成的SystemVerilog代码中的函数详细信息各不相同。您可以检查生成的代码以了解详细信息。有关上下文中生成函数的示例,请参阅开始SystemVerilog DPI组件生成

参数调优

您可以使用Simulink模型中的各种参数值运行不同的模拟。如果您的系统具有可调参数,则生成的SystemVerilog代码还包含每个可调参数的Set Param金宝appeter函数。

DPI组件生成器为格式中的每个可调参数生成一个设置参数函数DPI_子系统名_setparam_tunableparametername

在这个例子中,可调增益参数有它自己的setparam_增益函数。

导入“DPI”函数void DPI_dut_setparam_gain(输入chandle objhandle,输入实际dut_P_gain);

生成的SystemVerilog代码不调用这个函数。相反,使用默认参数。要在模拟过程中更改这些参数,显式地调用特定的setparam函数。例如,在标题为dut,您可以通过插入以下调用将模拟期间的增益更改为6:

DPI_dut_setparam_gain (objhandle 6);

要使参数可调,请在生成SystemVerilog代码之前从子系统创建数据对象。看到仿真过程中调谐增益参数

测试点访问功能

该特性使您能够在您的HDL模拟器中访问SystemVerilog DPI组件的内部信号。您可以将模型中的内部信号指定为测试点,并配置SystemVerilog DPI生成器来创建单独的或分组的访问函数。

您还可以在测试点上启用日志记录。启用日志记录后,您可以使用生成的测试台将来自Simulink的日志数据与运行SystemVerilog组件时观察到的值进行比较。金宝app

看到SystemVerilog DPI组件测试点访问开始SystemVerilog DPI组件生成

额外采样延迟

与原始的Simulink模型相比,生成的SystemV金宝apperilog模块在输出时引入了一个额外的样本延迟。例如,在下面的Simulink模型中,输出是输入信号的一个样金宝app本延迟版本。

生成的C代码保留了这种行为,输出包含输入信号的一个样本延迟版本。然而,在SystemVerilog包装文件中,时钟信号用于同步输入和输出信号:

始终@(posedge clk)开始DPI_blk2_输出(blk2_输入1,blk2_输出1);DPI_blk2_更新();结束

SystemVerilog模块的输出只能在时钟上升沿更新。这个要求引入了额外的采样延迟。

多重速率的系统行为

默认情况下,Simuli金宝appnk子系统有一个基本的样本时间变量(基金会),指示在模拟期间,子系统何时产生输出并更新其内部状态。使用多速率系统,您可以为不同的端口指定不同的采样时间。有关更多信息,请参见什么是样本时间?(金宝app模型)

当多速率子系统生成DPI组件时,DPI组件的采样时间等于子系统中所有采样时间的最大公约数。

例如,假设子系统的基本采样时间为0.01(即,基金会0.01)和采样时间ST1ST2分别为0.5和0.7。

相约= 0.5,ST2 = 0.7.DPI组件在0.1的采样时间运行(因为0.1是0.5和0.7的最大公约数)。成功获取采样时间为0.5的信号(ST1)或0.7 (ST2), HDL的时钟信号必须分别切换5或7次。

当从顶层生成DPI组件时,该组件将在基本示例时间执行。

这个图显示了HDL输入时钟和采样时间之间的关系ST1,及ST2

定制

您可以通过修改包含在HDL验证器中的模板来定制生成的SystemVerilog包装器(svdpi_grt_template.vgt)。或者,您可以创建自己的自定义模板。为模板中生成的代码提供锚定,以验证模板是否生成有效的SystemVerilog代码。

由HDL verilog提供的默认SystemVerilog模板是svdpi_grt_template.vgt.在此模板中,特别clken_inclken_out控制信号被添加到SystemVerilog模块接口。

您可以从多个子系统生成SystemVerilog DPI组件,并在一个HDL模拟器中将它们连接在一起。当您这样做时,这些控制信号将决定这些组件的执行顺序。它们还最小化了Simulink信号和SystemVerilog信号之间的延迟。金宝app

您还可以在以下条件下指定自己的模板文件:

  • 该文件必须在MATLAB路径和可搜索。

  • 该文件必须具有.vgt扩展。

你可以使用这些可选标记自定义生成的代码,将它们插入到整个模板的注释语句中:

  • %

  • % < PortList >

  • % < EnumDataTypeDefinitions >

  • %

  • %

  • %

  • % < ImportSetParamFunction >

  • % < CallInitFunction >

  • % < CallUpdateFunction >

  • %

  • %

  • % < ObjHandle >

看到自定义生成的SystemVerilog代码有关自定义代码的说明。

请注意

SystemVerilog DPI组件生成器不会为定制组件生成测试台。

局限性

  • 默认情况下,HDL验证器在SystemVerilog中将矩阵和向量转换为一维数组。例如,Simulink中的4 × 2矩阵在SystemVeril金宝appog中转换为一个由8个元素组成的一维数组。要在SystemVerilog接口中生成多个标量端口,请选择矩阵和向量端口的标量化配置参数中。

  • SystemVerilog DPI组件生成仅支持以下子系统进行代码生成。金宝app这些子系统没有测试台支持。金宝app

    • 触发子系统

    • 启用子系统

    • 带动作端口子系统

为了获得最佳结果,应避免分别导出多个子系统,因为很难实现正确的执行顺序。相反,将多个子系统组合成一个子系统,并从新创建的单个子系统生成代码。

相关话题