当前位置:首页 > EDA > 电子设计自动化
[导读]在FPGA验证中,仅仅跑通仿真远远不够——代码覆盖率(Code Coverage) 才是衡量验证完备性的硬指标。ModelSim/Vivado Simulator内置的覆盖率工具可以帮助你快速定位“哪行代码从来没被执行过”。本文分享三个实战技巧,助你告别“盲测”。



在FPGA验证中,仅仅跑通仿真远远不够——代码覆盖率(Code Coverage) 才是衡量验证完备性的硬指标。ModelSim/Vivado Simulator内置的覆盖率工具可以帮助你快速定位“哪行代码从来没被执行过”。本文分享三个实战技巧,助你告别“盲测”。


一、技巧一:一键开启覆盖率收集


很多工程师不知道ModelSim可以直接在GUI或命令行中开启覆盖率收集,无需修改任何RTL代码。


1. GUI操作


在ModelSim的Transcript窗口输入:

vsim -coverage work.testbench


或者通过菜单:Simulate → Simulation Options → Coverage,勾选需要的类型(Statement, Branch, Condition, FSM, Toggle)。


2. 命令行批处理模式(推荐回归测试)


# compile.tcl

vlib work

vcom -cover bcsf testbench.vhd dut.vhd  # bcsf: branch+condition+statement+fsm

vsim -coverage work.testbench

run -all

coverage report -file coverage_report.txt -detail

quit -sim


关键点:-cover bcsf开关在编译阶段生效,如果不加,仿真时无法收集覆盖率。


二、技巧二:读懂覆盖率报告,找到“僵尸代码”


仿真结束后,输入coverage report -details会生成详细的文本报告。你需要重点关注以下三类问题:


1. 语句覆盖率(Statement Coverage)低于100%


未被覆盖的行通常意味着对应的功能从未被测试用例触发。

-- 示例:if语句的分支缺失

if cnt = "1111" then

   led <= '1';

else

   led <= '0';

end if;


排查:如果报告中led <= '1'所在行未被覆盖,说明你的测试从未让cnt达到最大值,需要补充边界测试。


2. 分支覆盖率(Branch Coverage)低于100%


VHDL中的case语句是分支覆盖的重灾区。

case state is

   when IDLE => ...

   when READ => ...

   when WRITE => ...

   when others => null;

end case;


排查:如果WRITE分支从未命中,说明你的验证环境中缺少“写操作”的激励。


3. FSM覆盖率(Finite State Machine)


ModelSim能自动识别枚举类型的状态机,并报告哪些状态转换未被覆盖。这是验证复杂控制逻辑最强大的武器。


三、技巧三:排除“无害”未覆盖项(Exclude)


并非所有未覆盖的代码都需要修复。以下情况可以合理排除(Exclude),以免干扰真正的问题定位。


1. 仿真专用的调试代码


-- synthesis translate_off

if debug_enable then

   report "DEBUG: counter = " & integer'image(cnt);

end if;

-- synthesis translate_on


这类代码在综合时会被删除,不需要覆盖。在GUI中右键点击未覆盖行,选择Add Exclusion,并注明原因。


2. 冗余的when others分支


当case语句已经穷举了所有合法状态时,when others只是为了语法完整而存在,永远不会被执行。同样可以Exclude。


3. 硬件复位后的初始状态


某些状态在复位后立即离开,但复位本身是异步的,仿真中可能无法覆盖。这类路径也可以合理排除。


四、避坑指南


1.  Toggle覆盖率慎用:Toggle覆盖率要求每个信号都发生0→1和1→0跳变。对于几百位宽的地址总线,这会带来巨大的仿真时间开销,建议仅在关键控制信号上开启。

2.  覆盖率不等于功能正确:100%覆盖率只说明每行代码都被执行过,但不代表逻辑正确。必须结合断言(Assertion)和Scoreboard共同验证。

3.  回归测试必须保留UCBD文件:每次仿真后生成的.ucbd文件记录了覆盖率数据,在多次仿真间使用coverage merge合并,才能得到完整的覆盖率报告。


五、结语


代码覆盖率是验证质量的“体检报告”。通过ModelSim的编译期开关、报告解读和合理排除这三个技巧,你可以快速定位未测试的逻辑分支,让每一次仿真都更有价值。记住:没有被覆盖的代码,就是潜在的Bug。


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读

在FPGA开发流程中,验证环节占据着关键地位。随着设计复杂度提升,传统验证方法效率逐渐降低,UVM(Universal Verification Methodology)验证方法学凭借其标准化、可复用和自动化特性,成为构...

关键字: UVM验证 FPGA验证

在现代电子设计自动化(EDA)工具链中,ModelSim作为一款功能强大的仿真软件,广泛应用于FPGA(现场可编程门阵列)和数字IC设计的验证阶段。特别是在与Xilinx FPGA结合使用时,ModelSim能够模拟复杂...

关键字: ModelSim Xilinx

在FPGA(现场可编程门阵列)设计的复杂流程中,仿真环节扮演着至关重要的角色。它不仅能够帮助设计师在物理实现之前发现并修正设计错误,还能通过模拟实际工作环境来评估设计的性能和稳定性。ModelSim作为业界领先的HDL(...

关键字: ModelSim FPGA设计 仿真
关闭