这个例子展示了如何使用Simulink®和一个HDL模拟器实现一个HDL巡航控制器设计的完整代码覆盖。金宝app
与此模型相关联的HDL代码是由巡航控制器的Simulink行为模型通过HDL Coder™生成的。金宝app提供了一个测试平台模型,通过比较HDL协同仿真块的输出和原始行为块的输出来验证HDL代码的正确性。测试台模型中的测试用例是通过Simulink Design Verifier™从原始行为模型生成的,以实现完整的模型覆盖金宝app。这个例子显示了那些自动生成的测试用例也实现了完整的HDL代码覆盖。你不需要安装Simulink设计金宝app验证器来运行这个例子。
如果您使用的是ModelSim或QuestaSim,则模型cruise_control_modelsim.slx应该开放。如果您正在使用Incisive或Xcelium,请关闭ModelSim模型并打开模型cruise_control_incisive.slx.
请注意,代码覆盖函数是ModelSim PE中的一个可选特性。确保您的ModelSim版本具有运行此示例所需的适当代码覆盖许可。
%对于ModelSim:型号名称=“cruise_control_modelsim”;开放式系统(型号名称);
%的:型号名称=“巡航控制”精辟;开放式系统(型号名称);
时钟、复位和时钟使能信号不是Simulink仿真的一部分。金宝app我们在协同仿真块掩码的“Simulation”选项卡中使用“Pre-simulation Tcl命令”为它们定义驱动程序。我们还设置了“在联合仿真开始之前运行HDL模拟器的时间”,以便在交换任何输入和输出数据值之前,HDL已经成功地退出了重置。
ModelSim:
深刻的:
在HDL中产生的波形:
Tcl force命令用于生成控制信号的波形:
时钟周期为10纳秒
时钟启用信号在37纳秒时激活。
复位信号被断言在0到27ns之间。
协同模拟开始时间应与HDL时钟的下降沿对齐,以避免竞争条件,因为HDL信号在HDL时钟的上升沿改变其值。因此,此参数的值应为10 ns时钟周期的整数倍。
我们还希望通过重置运行HDL设计,但在clk_enable启用的第一个活动时钟边缘之前停止。这是为了匹配行为块,行为块在模拟开始后立即更新其内部状态。
基于上述考虑,选项“在联合仿真开始之前运行HDL模拟器的时间”被设置为40纳秒。在运行每个测试用例时,首先在HDL模拟器中应用“预模拟Tcl命令”。然后,HDL模拟器将其时间提前40纳秒,以便在联合仿真开始之前应用复位、时钟和clk_enable信号。
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-负载测试&');