如果你有金宝app®编码器™您可以使用以下两种方法之一生成SystemVerilog DPI组件。
HDL验证器™ 结合金宝app仿真软件编码器在SystemVerilog组件中使用直接编程接口(DPI)将子系统作为生成的C代码导出。您可以将此组件作为行为模型集成到您的HDL模拟中。编码器提供了定制生成的SystemVerilog结构的选项。组件生成器支持测试点访问和可调参数。金宝app编码器可选地生成一个SystemVerilog测试台,该测试台根据来自Simulink子系统的数据向量验证生成的DPI组件。金宝app下面的“模型配置参数”对话框中有此特性代码生成.看到生成SystemVerilog DPI组件.
来自HDL编码器™, 您可以生成SystemVerilog DPI测试台。使用测试台使用从整个Simulink模型(包括DUT和数据源)生成的C代码验证生成的HDL代码。要使用此功能,您的整个模型必须支持使用金宝app金宝app金宝app仿真软件编码器.您可以在下面的HDL Workflow Advisor中访问此功能HDL代码生成>设置测试台选项,或在“模型配置参数”对话框中,在HDL代码生成>试验台.或者,对于命令行访问,设置生成VDP测试台
的属性makehdltb
(高密度脂蛋白编码器).看到使用SystemVerilog DPI测试台验证HDL设计(高密度脂蛋白编码器).
金宝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类型,例如 |
逻辑向量长度( |
位向量长度( |
单一的 |
shortreal |
||
双 |
真实的 |
||
复杂的 |
您可以选择SystemVerilog |
||
向量、矩阵 | 您可以选择SystemVerilog阵列或标量端口。要在这些选项中进行选择,请在配置参数对话框的左侧窗格中选择代码生成>SystemVerilog DPI,然后选择矩阵和向量端口的标量化参数。 例如,类型为的两元素向量 输入逻辑[31:0]向量输入[0:1] 当您选择矩阵和向量端口的标量化,生成的SystemVerilog包括这两个端口,每个端口的类型 输入逻辑[31:0]vecInput_0,输入逻辑[31:0]vecInput_1 生成向量和数组端口时,编码器按列主顺序展平矩阵。 |
||
非虚拟总线 | 您可以选择SystemVerilog |
||
枚举数据类型 | 枚举 |
由SystemVerilog DPI生成器生成的所有SystemVerilog代码包含以下控制信号:
clk
——同步时钟
clk_enable
——时钟使
重置
——异步复位
在端口列表或接口声明之间进行选择。在“配置参数”下设置此选项代码生成>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
与原始的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
)和采样时间ST1和ST2分别为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_in
和clken_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
触发子系统
启用子系统
带动作端口子系统
为了获得最佳结果,应避免分别导出多个子系统,因为很难实现正确的执行顺序。相反,将多个子系统组合成一个子系统,并从新创建的单个子系统生成代码。