断言触发但Questasim覆盖率报告中Pass计数为0的原因排查咨询
断言触发但Questasim覆盖率报告中Pass计数为0的原因排查咨询
嘿,我来帮你拆解这个让人摸不着头脑的问题——明明看到断言的前后件都触发了打印日志,覆盖率里的Pass计数却始终是0,这种情况确实挺绕的。
先理清楚你的核心现象:
- 第一次运行时,断言的前件、后件打印都正常输出,说明断言逻辑确实触发且成功通过,但覆盖率报告里
Pass Count是0,Vacuous Count(空成功计数)是4,Attempt Count(总尝试次数)是5。 - 把后件改成
1!=1后,断言触发了错误日志,覆盖率里Failure Count直接变成了1,完全符合预期。
核心原因:恒真后件被Questasim归类为「空成功」
Questasim的断言覆盖率统计规则里,Pass Count只统计非空成功(Non-Vacuous Pass)——也就是那些真正验证了设计信号状态的成功断言。而如果你的断言后件是一个不依赖任何设计信号的恒真表达式(比如1==1),哪怕前件匹配成功,Questasim也会把这次成功判定为空成功,计入Vacuous Count而非Pass Count。
为什么会有这种区分?因为空成功本质上没有验证任何设计行为,只是因为表达式本身恒真而通过,不属于有效功能验证的范畴。反过来,当你把后件改成恒假的1!=1时,这是一个明确的失败判定,属于非空失败,所以会被正常计入Failure Count。
验证方法
你可以修改后件,让它依赖一个实际的设计信号,比如把:
(1==1, $display("consequent happended at time=%t", $time))
改成:
(EN == 1, $display("consequent happended at time=%t", $time))
在你的测试用例中,EN始终为1,所以断言依然会成功,但这次后件实际验证了设计信号的状态。重新运行覆盖率统计,你会看到Pass Count变成1,Vacuous Count则减少为3。
额外说明
你断言里的逗号操作符用法是没问题的——SVA中(表达式, 系统任务)的写法会先执行表达式判断,再执行系统任务(比如打印),整个结构的真值由前面的表达式决定,所以前件匹配后触发后件评估的逻辑是完全符合预期的。
备注:内容来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

