主要内容

使用Cosimulation比较HD金宝appL和Simulink代码覆盖率

这个例子展示了如何使用Simulink®和HDL模拟器实现HDL巡航控制器设计的完整代码覆盖。金宝app

简介

与该模型相关的HDL代码是通过HDL Coder™从巡航控制器的Simulink行为模型中生成的。金宝app通过将HDL协同仿真块的输出结果与原始行为块的输出结果进行比较,提供了一个测试台架模型来验证HDL代码的正确性。测试台架模型中的测试用例是通过Simulink Design Verifier™从原始行为模型生成的,以实现完整的模型覆金宝app盖。这个例子显示了那些自动生成的测试用例也实现了完整的HDL代码覆盖。运行此示例不需要安装Simuli金宝appnk Design Verifier。

打开Simulin金宝appk模型

如果您正在使用ModelSim或QuestaSim,则模型cruise_control_modelsim.slx应该是开放的。如果您正在使用Incisive或Xcelium,请关闭ModelSim模型并打开该模型cruise_control_incisive.slx

注意,代码覆盖函数是ModelSim PE中的可选特性。确保您的ModelSim版本具有运行此示例所需的适当代码覆盖许可。

%对于ModelSim:modelName =“cruise_control_modelsim”;open_system (modelName);
%为精雕细琢:modelName =“cruise_control_incisive”;open_system (modelName);

在HDL模拟中设置时钟,重置和时钟启用

时钟、复位和时钟使能信号不是Simulink仿真的一部分。金宝app我们使用cosimulation block mask的Simulation选项卡中的“Pre-simulation Tcl commands”为它们定义驱动程序。我们还设置了“在共同模拟开始之前运行HDL模拟器的时间”,以便在交换任何输入和输出数据值之前,HDL已经成功地脱离了重置。

ModelSim:

深刻的:

在HDL中产生的波形:

Tcl force命令用于为控制信号生成波形:

  1. 时钟周期为10ns

  2. 时钟使能信号在37ns激活。

  3. 复位信号被断言从0到27ns。

协同模拟开始时间应该与HDL时钟的下降沿对齐,以避免竞态条件,因为HDL信号在HDL时钟的上升沿改变它们的值。因此,该参数的值应该是10ns时钟周期的整数倍。

我们还希望在重置之后运行HDL设计,但在clk_enable启用的第一个活动时钟边缘之前停止。这是为了匹配行为块,后者在模拟开始后立即更新其内部状态。

基于上述考虑,选项“在共同模拟开始之前运行HDL模拟器的时间”被设置为40 ns。在运行每个测试用例时,首先在HDL模拟器中应用“预模拟Tcl命令”。然后,HDL模拟器将其时间提前40 ns,在联合模拟开始之前应用reset、clock和clk_enable信号。

启动HDL模拟器进行协同仿真

Modelsim:

用于在启用代码覆盖的情况下编译和调用Modelsim的命令。tclCmds = {“vlib工作”...创建ModelSim库'vcom +cover cruise_hdlsrc/PI_Controller.vhd'...编译启用代码覆盖的VHDL代码'vcom +cover cruise_hdlsrc/Controller.vhd'...编译启用代码覆盖的VHDL代码'v金宝appsimulink -覆盖工作。控制器的...%负载模拟“准备好共同模拟…”...};现在我们启动HDL模拟器并等待它准备好。。vsim (“tclstart”, tclCmds);disp (“等待HDL模拟器启动……”);processid = pingHdlSim(240);disp (“HDL模拟器已准备好进行协同模拟。”);

深刻的:

%用于在启用代码覆盖的情况下编译和调用incizve的命令。tclCmds = {'exec ncvhdl -64bit -v93 cruise_hdlsrc/PI_Controller.vhd'...编译VHDL代码'exec nvhdl -64bit -v93 cruise_hdlsrc/Controller.vhd'...编译VHDL代码'exec ncelab -64bit -coverage all -vhdl_time_precision 1ns -access +wc Controller'...%精心设计,覆盖启用覆盖控制金宝app器...%负载模拟“准备好共同模拟…”...};现在我们启动HDL模拟器并等待它准备好。。nclaunch (“tclstart”tclCmds,“runmode”“CLI”“libfile”“liblfihdls_gcc44.so”);disp (“等待HDL模拟器启动……”);processid = pingHdlSim(240);disp (“HDL模拟器已准备好进行协同模拟。”);

运行仿真

在测试台模型中有9个测试用例。这个例子在所有测试用例中运行这个模型,以产生代码覆盖结果。在完成每个共同模拟会话之后,不需要重新启动HDL模拟器,因为HDL信号在每个模拟开始时都被正确重置。在每次模拟之后,添加一个短暂的暂停,以确保HDL模拟器在下一次迭代之前有时间更新覆盖结果。

运行cosimulationk = 1: 9 signalbuilder([modelName .' /输入'),“activegroup”、k);选择一个测试用例sim (modelName);%运行模拟暂停(5);%暂停用于向数据库写入覆盖率结束

观察代码覆盖结果

当我们遍历所有测试用例时,HDL模拟器会累积覆盖率。当模拟完成时,代码覆盖率达到100%。

ModelSim:您可以在UI的“coverage”选项卡中检查覆盖率结果。

深刻的:我们转储覆盖率结果,并使用“imc”工具将结果可视化。

转储和可视化覆盖结果tclHdlSim (“覆盖-转储测试”);系统('imc -gui -load test &');