主要内容

HDL编码器中HDL验证器协同仿真模型的生成

这个例子展示了如何重用现有的Simulink®模型来验证HDL Coder™生成的硬件设万博1manbetx计,使用HDL Verifier™联合仿真试验台。

简介

协同仿真是一项具有挑战性的任务,特别是使用自动生成的代码。在设置HDL Verifier联合仿真块和目标HDL模拟器时,保持源模型的各个方面同步是很重要的,包括采样率、前馈/馈通系统和代码生成过程中使用的其他各种参数和设置。

自动化的协同仿真模型生成通过解密所有已编译的模型和代码生成信息,将猜测工作从HDL协同仿真块和模拟器设置中去除。所有自动化设置都记录在生成的脚本中。最终的结果是一个可用于验证生成代码的联合仿真模型。

主要的例子显示使用Mentor Graphics®ModelSim®/Questa®,但其他支持的模拟器包括Cadence®Xcelium™(以前的I万博1manbetxncisive®)和Xilinx®Vivado™模拟器。具体的makehdltb最后给出了仿真实例。

HDL的生成与协同仿真模型

本节展示了Simulink中一个基本的乘法累加设计。万博1manbetx我们生成了HDL设计,并生成了一个联合仿真试验台模型。然后我们将详细介绍测试台架模型是如何运行的。

生成HDL设计

在Simulink中进行一个简单的蓄能器设计,自动生成蓄能器的联合仿真模万博1manbetx型,作为测试台架生成的一部分。

使用|makehdl|函数生成VHDL代码。makehdl (“hdl_cosim_demo1 / MAC”“targetlang”硬件描述语言(vhdl)的
为“hdl_cosim_demo1/MAC”生成HDL。使用模型的配置集hdl_cosim_demo1用于HDL代码生成参数。在模型'hdl_cosim_demo1'上运行HDL检查。开始编译“hdl_cosim_demo1”模型…在模型'hdl_cosim_demo1'上应用HDL优化…###正在…GenerateModel ###开始模型生成。模型生成完成。开始为“hdl_cosim_demo1”生成VHDL代码。 ### Working on hdl_cosim_demo1/MAC as hdlsrc/hdl_cosim_demo1/MAC.vhd. ### Code Generation for 'hdl_cosim_demo1' completed. ### Creating HDL Code Generation Check Report file:///tmp/Bdoc22b_2054784_3457288/tpcc7b2539/hdlcoder-ex48550583/hdlsrc/hdl_cosim_demo1/MAC_report.html ### HDL check for 'hdl_cosim_demo1' complete with 0 errors, 0 warnings, and 0 messages. ### HDL code generation complete.

生成协同仿真模型作为HDL试验台

使用用于创建Simulink设计的模型作为起点,生成一个用于作为HDL测试台万博1manbetx架的联合仿真模型。设置makehdl参数GenerateCosimModel选择HDL模拟器。万博1manbetx支持的值包括ModelSim敏锐的,或Vivado模拟器

生成MAC HDL的联合仿真测试台架。makehdltb (“hdl_cosim_demo1 / MAC”“targetlang”硬件描述语言(vhdl)的“GenerateCosimModel”“ModelSim”
开始生成TestBench。为'hdl_cosim_demo1/MAC'生成HDL测试平台。开始编译“hdl_cosim_demo1”模型…开始编译“gm_hdl_cosim_demo1”模型…###生成新的协同仿真模型:gm_hdl_cosim_demo1_mq。生成新的协同仿真tcl脚本:hdlsrc/hdl_cosim_demo1/gm_hdl_cosim_demo1_mq_tcl.m。生成新的协同仿真tcl脚本:hdlsrc/hdl_cosim_demo1/gm_hdl_cosim_demo1_mq_batch_tcl.m。##注意:选项“允许直接直通”已设置为“on”在“gm_hdl_cosim_demo1_mq/MAC_mq”上开始模拟“gm_hdl_cosim_demo1”模型…收集数据…生成测试台数据文件:hdlsrc/hdl_cosim_demo1/In1.dat。 ### Generating test bench data file: hdlsrc/hdl_cosim_demo1/In2.dat. ### Generating test bench data file: hdlsrc/hdl_cosim_demo1/Out1_expected.dat. ### Working on MAC_tb as hdlsrc/hdl_cosim_demo1/MAC_tb.vhd. ### Generating package file hdlsrc/hdl_cosim_demo1/MAC_tb_pkg.vhd. ### HDL TestBench generation complete.

新的代码生成消息

从命令窗口中附加的代码生成消息可以看出,这是一个协同仿真模型gm_hdl_cosim_demo1_mq生成;除了在目标目录中生成的代码之外,hdlsrc,一个额外的协同模拟脚本gm_hdl_cosim_demo1_mq_tcl.m为与Simulink进行协同仿真准备目标模拟器。万博1manbetx

# # #生成cosimulation模型:gm_hdl_cosim_demo1_mq# # #生成cosimulationtcl脚本:hdlsrc / gm_hdl_cosim_demo1_mq_tcl.m# # # Cosimulation模型一代完成了。

(可选)生成HDL代码覆盖率报告和数据库

为了使HDL模拟器生成一个代码覆盖率数据库,可以:

a)在HDL代码生成>测试台架窗格中,选择标记的复选框HDL代码覆盖率

b)当你打电话时makehdltb,设置HDLCodeCoverage.例如:

makehdltb (“hdl_cosim_demo1 / MAC”“targetlang”“vh”“GenerateCosimModel”“ModelSim”“HDLCodeCoverage”“上”);

模拟测试台架后,在源目录中生成HDL代码覆盖率工件。

联合仿真模型试验台特性研究

刺激和反应捕获

从联合仿真模型中可以看到,被测原始设备(DUT)被两个子系统拦截ToCosimSrc而且ToCosimSink.这两个子系统的目的是捕获DUT的刺激和响应,并利用它来驱动协同仿真使用转到块。的数量转到下面每个子系统中的块与DUT的输入和输出数量相匹配。

ToCosimSrc

ToCosimSink

刺激HDL共模拟块

最初驱动DUT的刺激被馈送到完全配置的HDL协同模拟块,使用如下所示。在某些情况下,输入刺激信号不能直接馈送到HDL协同仿真块。例如,HDL设计可能有扁平的结构化数据类型,如复杂信号和矢量信号,而HDL协同模拟块反映RTL接口。在这种情况下,输入刺激信号的进一步转换是自动完成的。在当前模型中,块直接给相应的内容转到块。

FromCosimSrc

结果比较

使用Simulink提供的Sink块,将来自原始DUT的响应与来自HDL验证器中HDL协同仿真块的响应进行比较,以可视化响应数据。万博1manbetx

比较

生成模型中的断言检查

对于被测设备子系统的每个输出,生成以下断言检查模型,检查原始输出(dut裁判)与共模拟输出(cosim),并在断言块的输入检测到不匹配时生成断言消息。

Assert_Out1

使用断言块

断言在断言块中启用,但不停止模拟。如果作为协同的一部分,有来自以下块的任何断言,你应该看到来自Assertion块的警告:

警告:在时间1.000000的“gm_hdl_cosim_demo1_mq/Compare/Assert_Out1/AssertEq”中检测到断言

检查HDL模拟器的特定支持万博1manbetx

HDL联合仿真块设置

HDL Cosimulation块被DUT编译后的输入输出接口自动填充。的港口面板完全填充HDL全名样品时间而且数据类型信息。类似地,各种HDL Cosimulation块设置参数如时间尺度而且tcl港口窗格将自动填充。请注意,连接方法的值总是配置为共享内存

MAC_mq

警告:期望localHostName是行向量。

目标模拟器启动和设置

现在看看与目标模拟器(ModelSim/Questa、Incisive/Xcelium或Vivado模拟器)的启动和设置相关的自动化。可以在生成的模型的顶层看到,一个子系统的名称为启动模拟器由以下回调函数生成。该子系统用于启动所选的目标模拟器。

OpenFcn

ans = 'try cosimDirName = pwd;cd“hdlsrc / hdl_cosim_demo1”;vsim (tclstart, gm_hdl_cosim_demo1_mq_tcl);cd (cosimDirName);清楚cosimDirName;catch me disp('用"vsim"启动cosimulator失败');disp (me.message);cd (cosimDirName);清楚cosimDirName;结束的

协同仿真模型的仿真

与回调相关的代码是特定于模拟器的,并执行必要的命令来启动和运行HDL模拟器。对ModelSim/Questa的调用vsim是由。对于Incisive/Xcelium,调用nclaunch是由。对于Vivado Simulator,没有单独的进程或调试环境;相反,一个系统命令将设计编译为一个共享库,用于协同仿真。

下面显示了ModelSim/Questa的详细信息。

vsim (“tclstart”gm_hdl_cosim_demo1_mq_tcl)

MATLAB命令vsimfor ModelSim从MATLAB环境中启动目标模拟器,并进行必要的联合仿真设置。的vsim命令调用tclstart选项,该选项接受在模拟器启动时配置模拟器的TCL字符串。该文件gm_hdl_cosim_demo1_mq_tcl是由HDL Coder自动生成的协同仿真模型。

生成的tclstart命令文件的内容

生成的tclstart文件包含配置启动模拟器的命令,以及关于如何生成Cosimulation模型的各种设置的注释。

hdlsrc / hdl_cosim_demo1 / gm_hdl_cosim_demo1_mq_tcl

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 自动生成cosimulation tclstart脚本  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 源模型:hdl_cosim_demo1生成模型:gm_hdl_cosim_demo1 % Cosimulation模型:gm_hdl_cosim_demo1_mq % % DUT来源:gm_hdl_cosim_demo1_mq / MAC % Cosimulation DUT: gm_hdl_cosim_demo1_mq / MAC_mq % %文件位置:hdlsrc / hdl_cosim_demo1 / gm_hdl_cosim_demo1_mq_tcl。m %创建:2022-08-31 08:40:54 % %由MATLAB 9.13和4.0 HDL编码器  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % ClockName: clk % ResetName:重置% ClockEnableName: clk_enable % % ClockLowTime: 5 ns % ClockHighTime: 5 ns % ClockPeriod: 10 ns % % ResetLength: 20 ns % ClockEnableDelay: 10 ns % HoldTime:2 ns  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % OverClockFactor DutBaseSampleTime ModelBaseSampleTime: 1%: 1%:1  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 的映射DutBaseSampleTime ClockPeriod % % N = (ClockPeriod / DutBaseSampleTime) * OverClockFactor % 1秒10 ns模型对应的HDL模拟器(万博1manbetxN = 10 ) % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % ResetHighAt:(ClockLowTime + ResetLength + HoldTime) % ResetRiseEdge: 27ns % ResetType: async % ResetAssertedLevel: 1% % ClockEnableHighAt: (ClockLowTime + ResetLength + ClockEnableDelay + HoldTime) % ClockEnableRiseEdge: 37ns %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function tclCmds = gm_hdl_cosim_demo1_mq_tcl tclCmds = {'do MAC_compile.do',…编译生成的代码'vsimulink -voptargs=+ac万博1manbetxc work.MAC',…%启动协同模拟'add wave /MAC/clk',…为芯片输入信号添加wave命令' Add wave /MAC/reset',…'add wave /MAC/clk_enable',…'add wave /MAC/In1',…'add wave /MAC/In2',…'add wave /MAC/ce_out',…为芯片输出信号添加wave命令' Add wave /MAC/Out1',… 'set UserTimeUnit ns',...% Set simulation time unit 'puts ""',... 'puts "Ready for cosimulation..."',... }; end

tclstart文件中的头注释

文章中的评论tclstart文件指定源模型、生成模型、协同仿真模型以及源和协同仿真DUT子系统。联合仿真DUT与联合仿真模型中的源模型DUT并行放置,以捕获生成的HDL代码与源模型DUT之间的任何差异。联合仿真模型验证了生成代码的周期精确和位真行为。

可视化HDL信号

所有顶级接口信号都添加了Wave命令。

Pre-simulation命令

在HDL Cosimulation块中,预仿真Tcl命令参数包含驱动时钟包的强制命令(clock, clock-enable, reset)。的在共同仿真开始之前运行HDL模拟器的时间参数启动模拟,并使用使芯片脱离复位所必需的运行时。

Cosim块TclPreSimCommand

ans = 'put "Running S万博1manbetximulink Cosimulation block.";put "Chip Name:——> hdl_cosim_demo1/MAC";设置“目标语言:——> vhdl”;把“目标目录:——> hdlsrc/hdl_cosim_demo1”;put [clock format [clock seconds]];#时钟强制命令;force /MAC/clk 0 0ns, 1 5ns -r 10ns;#时钟启动强制命令;force /MAC/clk_enable 0 0ns, 1 37ns;# Reset force命令; force /MAC/reset 1 0ns, 0 27ns; '

影响协同仿真模型生成的试验台选择

tclstart脚本文件的下一部分显示了HDL Coder支持的所有makehdltb测试台参数及其在协同模拟脚本中使用的初始值。万博1manbetx

ClockName, ResetName, clockkenablename ClockLowTime, ClockHighTime, ClockPeriod ResetLength, clockkenabledelay, HoldTime

模型采样时间和DutBaseSampleTime到ClockPeriod的映射

评论部分的下一部分将涵盖模型中的样本时间以及它们如何影响HDL验证器中HDL协同仿真块的计时。

N = (ClockPeriod / DutBaseSampleTime) * OverClockFactor在Simulink中万博1manbetx的1秒对应于HDL模拟器中的10ns (N = 10)

生成的tclstart脚本输出

的函数gm_hdl_cosim_demo1_mq_tcl生成必要的tcl命令字符串(tclCmds)。

如果EDAScriptGeneration选项已打开和编译的一部分为ModelSim生成文件makehdl,然后是一个命令生成。如果EDAScriptGeneration选项已打开,然后添加显式编译命令,为DUT编译生成的HDL代码。

启动模拟器并运行协同仿真测试台架

双击Start Simulator块,启动带有tcl命令的模拟器tclstartMATLAB脚本。一旦模拟器启动,所有生成的代码都被编译,HDL Cosimulation块就准备好进行模拟了。

要运行测试台架,请按运行按钮。原始的Simulink设计和HDL设计之间的任何数据值或周期时间差异都通过断言标记出来。万博1manbetx

万博1manbetx支持其他HDL接口翻译

万博1manbetx对复杂信号的支持

该模型hdl_cosim_demo2包含一个使用复杂数据类型的MAC子系统。协同仿真测试台架生成自动处理转换Simulink类型以匹配HDL端口接口。万博1manbetx

为使用复杂数据类型的MAC设计生成HDL%对应的协同仿真试验台模型:bdclose所有;load_system (“hdl_cosim_demo2”);open_system (“hdl_cosim_demo2 /复杂的MAC”);makehdl (“hdl_cosim_demo2 /复杂的MAC”“targetlang”“vh”);makehdltb (“hdl_cosim_demo2 /复杂的MAC”“targetlang”“vh”“GenerateCosimModel”“ModelSim”

观察FromCosimSrc子系统:在驱动HDL Cosimulation块之前,输入的复杂信号被自动分解为真实和虚的片段。

观察比较部分分别检查复输出的实部和虚部的结果。

万博1manbetx支持向量信号

该模型hdl_cosim_demo3包含一个使用矢量数据信号的MAC子系统。协同仿真测试台架生成自动处理转换Simulink类型以匹配平坦的HDL端口接口。万博1manbetx

使用矢量信号及其生成MAC设计的HDL%对应的协同仿真试验台模型:bdclose所有;load_system (“hdl_cosim_demo3”);open_system (“hdl_cosim_demo3 /矢量MAC”);makehdl (“hdl_cosim_demo3 /矢量MAC”“targetlang”“已经”);makehdltb (“hdl_cosim_demo3 /矢量MAC”“targetlang”“已经”“GenerateCosimModel”“ModelSim”

观察FromCosimSrc和Compare子系统中是如何处理矢量信号的。

万博1manbetx支持本地多速率

该模型hdl_cosim_demo4包含一个MAC子系统,其中包含一个Sum of Elements块,该块配置了Cascade实现,需要超频,这可以在代码生成消息中看到。协同仿真测试台架生成自动处理将Simulink中的计时接口转换为HDL实现所需的接口。万博1manbetx

生成HDL的MAC设计与5倍超频及其%对应的协同仿真试验台模型:bdclose所有;load_system (“hdl_cosim_demo4”);open_system (“hdl_cosim_demo4 / LocalMR MAC”);makehdl (“hdl_cosim_demo4 / LocalMR MAC”“targetlang”“vh”);makehdltb (“hdl_cosim_demo4 / LocalMR MAC”“targetlang”“vh”“GenerateCosimModel”“ModelSim”);

请注意,在多速率系统中,时间刻度设置如何更改以抵消超频。

代码生成消息显示了超频,相对于模型的基本速率,该超频需要快5倍的时钟。这个信息被封装在联合仿真模型中,作为时间刻度设置的一部分,如下所示:

N = (ClockPeriod / DutBaseSampleTime) * OverClockFactor 1秒万博1manbetx对应50纳秒高密度脂蛋白模拟器(N = 50)

万博1manbetx支持Incisive/Xcelium

以下是为第一个模型创建Incisive/Xcelium联合仿真试验台的具体命令。

生成Incisive/Xcelium的HDL和联合仿真模型bdclose所有;load_system (“hdl_cosim_demo1”) makehdl (“hdl_cosim_demo1 / MAC”“targetlang”“vh”) makehdltb (“hdl_cosim_demo1 / MAC”“targetlang”“vh”“GenerateCosimModel”“尖锐”)类型hdlsrc / hdl_cosim_demo1 / gm_hdl_cosim_demo1_in_tcl

万博1manbetx支持Vivado模拟器

以下是为第一个模型创建Vivado Simulator联合仿真测试台架的具体命令。

生成Vivado模拟器的HDL和联合仿真模型bdclose所有;load_system (“hdl_cosim_demo1”) makehdl (“hdl_cosim_demo1 / MAC”“targetlang”“vh”) makehdltb (“hdl_cosim_demo1 / MAC”“targetlang”“vh”“GenerateCosimModel”“Vivado模拟器”)类型hdlsrc / hdl_cosim_demo1 / gm_hdl_cosim_demo1_vs.tcl