主要内容

使用cyimulation比较HDL金宝app和Simulink代码覆盖率

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

介绍

与该模型相关联的HDL代码通过HDL Coder™从巡航控制器的Simulink行为模型生成。金宝app提供测试台模型以通过将HDL Cosimulation块的输出与原始行为块的输出进行比较来验证HDL代码的正确性。测试台模型中的测试序列通过Simulink Design Verifier™从原始行为模型生成,以实现完整的模型覆盖范围金宝app。此示例显示,这些示例会自动生成的测试程序也实现完整的HDL代码覆盖范围。您不需要安装Simulink设计金宝app验证程序以运行此示例。

打开Simulin金宝appk模型

如果您使用的是Modelsim或Questasim,该模型cruise_control_modelsim.slx.应该是开放的。如果您使用的是InciSive或Xcelium,请关闭模型模型并打开模型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我们使用“Cyimulation块掩码的”模拟“选项卡中使用”预仿真TCL命令“来定义驱动程序。我们还设置“在Cosimulation之前运行HDL模拟器的时间”,使得HDL在交换任何输入和输出数据值之前成功地退出了复位。

对于Modelsim:

incisive:

HDL中产生的波形:

TCL力命令用于为控制信号生成波形:

  1. 时钟周期为10 ns

  2. 时钟使能信号在37 ns处有效。

  3. 复位信号从0到27 ns置位。

Cyimulation开始时间应与HDL时钟的下降沿对齐以避免竞争状态,因为HDL信号在HDL时钟的上升沿改变它们的值。因此,该参数的值应该是10NS时钟周期的整数倍数。

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

根据上述考虑,选项“在Cosimulation之前运行HDL Simulator的时间”设置为40 ns。运行每个测试箱时,首先在HDL模拟器中应用“预仿真TCL命令”。然后,HDL模拟器在Cosimulation启动之前将其时间达到40 ns以应用重置,时钟和CLK_ENABLE信号。

启动HDL模拟器以进行化妆

对于Modelsim:

批量编译和调用Modelim的%命令,启用代码覆盖范围。tclcmds = {'vlib工作'......%create modelsim库'vcom +封面cruise_hdlsrc / pi_controller.vhd'......%编译VHDL代码,启用代码覆盖率'vcom +封面cruise_hdlsrc / controller.vhd'......%编译VHDL代码,启用代码覆盖率'v金宝appsimulink -coverage work.controller'......%负载模拟'准备好cosimulation ......“'......};%现在我们启动了HDL模拟器并等待它准备就绪。VSIM('tclstart',TCLCMDS);DISP('等待HDL模拟器开始......');processid = pinghdlsim(240);DISP('HDL模拟器已准备好削皮。);

incisive:

通过启用代码覆盖率,编译和调用inchive的%命令。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 -covoverwrite controller'......%负载模拟'准备好cosimulation ......“'......};%现在我们启动了HDL模拟器并等待它准备就绪。nclaunch('tclstart',tclcmds,'runmode''cli''libfile''liblfihdls_gcc44.so');DISP('等待HDL模拟器开始......');processid = pinghdlsim(240);DISP('HDL模拟器已准备好削皮。);

运行模拟

测试台模型中有九个试验箱。此示例使用所有测试程序运行此模型以产生代码覆盖结果。完成每个Cosimulation会话后,不需要重新启动HDL模拟器,因为HDL信号在每个模拟开始时正确复位。在每次模拟后,添加短暂暂停以确保HDL模拟器在下次迭代之前更新覆盖结果的时间。

%运行cosimulation为了k = 1:9 signalBuilder([ModelName'/输入'],'活跃群',k);%选择一个测试箱sim(modelname);%运行模拟暂停(5);将覆盖范围暂停到数据库结尾

观察代码覆盖结果

HDL模拟器随着我们迭代所有测试序列而累积覆盖范围。当仿真结束时,实现了100%的代码覆盖率。

对于Modelsim:您可以检查UI的“Coverage”选项卡中的覆盖结果。

incisive:我们转储覆盖结果并使用“imc”工具可视化结果。

%转储并可视化覆盖结果tclhdlsim('Coverage -dump测试');系统('imc -gui -load test&');