如何在QuestaSim中生成功能覆盖率详细报告?
我来帮你梳理下在QuestaSim里生成详细功能覆盖率报告的完整流程,结合你现有的命令,咱们一步步拆解优化:
一、编译阶段:开启覆盖率收集开关
首先你的编译命令已经做了核心配置,但我帮你把每个参数的作用理清楚,确保你知道为什么这么用:
vlog -64 -work work -vopt +notimingchecks +cover +fcover -f pcie_jammer.f
-64:启用64位模式编译,适配大工程场景-work work:指定编译后的文件存到work库中-vopt:启用代码优化,不影响覆盖率收集但能提升仿真效率+notimingchecks:关闭时序检查,专注功能验证阶段的覆盖率收集+cover:开启基础覆盖率收集(代码覆盖率+功能覆盖率的总开关)+fcover:专门开启功能覆盖率收集,包括断言(assertion)、状态机(FSM)、表达式覆盖率等核心功能覆盖项-f pcie_jammer.f:通过文件列表批量编译设计文件,适合大型工程
二、仿真阶段:配置并保存覆盖率数据
你的仿真命令框架已经对了,但有几个关键细节要补全,我先把完整的仿真脚本给出来:
vsim -novopt -c <CODE SPECIFIC ARGS> -t ps work.tb_top work.glbl -vopt -do " # 关闭信号过滤,确保所有信号的覆盖率都被收集 set WildcardFilter None; # 配置退出时自动保存覆盖率数据,指定收集的类型 coverage save -onexit -directive -cvg -codeAll pcie_cov_${1}_gen${speed}_X${width}; # 记录所有层级的信号日志,方便后续排查未覆盖场景 add log -r /*; # 执行完整仿真(这步你原脚本没写,必须加上!否则没有覆盖率数据) run -all; # 生成文本格式的详细报告 coverage report -file pcie_cov_${1}_gen${speed}_X${width}.txt -byfile -detail -noannotate -assertion -fsm; # 额外生成HTML格式报告(可视化更强,推荐用这个快速定位未覆盖点) coverage report -html pcie_cov_${1}_gen${speed}_X${width}.html -byfile -detail -assertion -fsm; # 强制退出仿真 quit -force; "
重点解释下覆盖率相关的核心参数:
coverage save -onexit:指定仿真退出时自动保存覆盖率数据库-directive:收集指令覆盖率(比如covergroup、coverpoint定义的覆盖项)-cvg:收集功能覆盖率(状态机跳转、断言触发情况等)-codeAll:收集所有代码覆盖率分支(语句、分支、条件等)
coverage report的关键参数:-byfile:按文件维度分类展示覆盖率,方便定位哪个模块覆盖不足-detail:显示最细粒度的覆盖信息(比如具体哪行代码没被执行)-assertion:单独列出断言的触发覆盖率-fsm:单独展示状态机的跳转覆盖情况-html:生成网页版报告,可视化程度远高于文本,能快速点击定位未覆盖代码
三、常见优化与问题排查
- 如果报告里没有功能覆盖率数据:检查编译时是否加了
+fcover,仿真时coverage save是否带了-cvg参数 - 想排除无关代码的覆盖:可以在仿真do文件里加
coverage exclude -src "testbench/*",过滤掉testbench中不需要覆盖的冗余代码 - 多次仿真合并覆盖率:如果跑了多个测试用例,用
coverage merge merged_cov.ucdb cov1.ucdb cov2.ucdb把多个覆盖率数据库合并,再生成整体报告 - 查看实时覆盖率:如果不是批量仿真,去掉
-c(命令行模式),在GUI里通过View > Coverage Report实时查看覆盖情况
内容的提问来源于stack exchange,提问作者Himanshu Khandelwal




