主要内容

使用协同仿真比较HDL和Simuli金宝appnk代码覆盖

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

介绍

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

打开Simulin金宝appk模型

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

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

%对于ModelSim:型号名称=“cruise_control_modelsim”;开放式系统(型号名称);
%的:型号名称=“巡航控制”精辟;开放式系统(型号名称);

在HDL仿真中设置时钟,复位和时钟启用

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

ModelSim:

深刻的:

在HDL中产生的波形:

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

  1. 时钟周期为10纳秒

  2. 时钟启用信号在37纳秒时激活。

  3. 复位信号被断言在0到27ns之间。

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

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

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

启动HDL模拟器进行联合仿真

Modelsim:

%编译和调用Modelsim并启用代码覆盖的命令。tclCmds={“vlib工作”...创建ModelSim库“威科姆公司+封面cruise_hdlsrc / PI_Controller.vhd '...%编译启用代码覆盖的VHDL代码“威科姆公司+封面cruise_hdlsrc / Controller.vhd '...%编译启用代码覆盖的VHDL代码“v金宝appsimulink报道工作。控制器的...%负载模拟’就会变成‘准备好协同模拟……’”。...};%现在我们启动HDL模拟器并等待它准备就绪。vsim (“tclstart”,tclCmds);disp('等待HDL模拟器启动…');processid = pingHdlSim (240);disp (“HDL模拟器已准备好进行联合模拟。”);

深刻的:

%编译和调用Incisive的命令,并启用代码覆盖。tclCmds={'exec ncvhdl -64bit -v93 cruise_hdlsrc/PI_Controller.vhd'...%编译VHDL代码'exec ncvhdl -64bit -v93 cruise_hdlsrc/Controller.vhd'...%编译VHDL代码'exec ncelab -64bit -coverage all -vhdl_time_precision 1ns -access +wc Controller'...%精心设计,支持覆盖范围“hdl金宝appsimulink-覆盖控制器”...%负载模拟’就会变成‘准备好协同模拟……’”。...};%现在我们启动HDL模拟器并等待它准备就绪。nclaunch (“tclstart”tclCmds,“运行模式”“CLI”“libfile”“liblfihdls_gcc44.so”);disp ('等待HDL模拟器启动…');processid = pingHdlSim (240);disp (“HDL模拟器已准备好进行联合模拟。”);

运行仿真

测试台模型中有九个测试用例。此示例使用所有测试用例运行此模型,以生成代码覆盖率结果。在完成每个联合模拟会话后,无需重新启动HDL模拟器,因为HDL信号在每个模拟开始时已正确重置。在每次模拟之后,会添加一个短暂的暂停,以确保HDL模拟器在下一次迭代之前有时间更新覆盖率结果。

%运行联合模拟[modelName . k] = 1: 9“/输入”],“活动组”、k);%选择一个测试用例sim (modelName);%运行仿真暂停(5);%暂停将覆盖率写入数据库结束

观察代码覆盖结果

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

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

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

% Dump并可视化覆盖结果tclHdlSim (覆盖您测试的);系统('imc-gui-负载测试&');