使用with而非iff时SystemVerilog功能覆盖率不显示的问题排查
SystemVerilog功能覆盖率问题:
with与iff语句的误用 测试代码
module tb; logic [1:0] a,b; logic sel; covergroup c; option.per_instance = 1; coverpoint a{ wildcard bins a_={2'b??} with (sel); } coverpoint b{ wildcard bins b_={2'b??} iff (!sel); } endgroup c ci; initial begin ci=new(); repeat(10) begin a=$random; b=$random; sel=$random; $display("%d %d %d",a,b,sel); ci.sample(); #1; end end endmodule
问题描述
我编写了上述SystemVerilog测试代码,对coverpoint a的wildcard bins使用with语句(条件为sel)时功能覆盖率无法显示;替换为iff后覆盖率统计正常,请问操作错误在哪里?
问题分析与解答
你核心的错误是混淆了with和iff语句的作用场景:
with语句:是用于bin级别的值过滤,它的条件只能基于当前coverpoint的变量(这里是a),不能直接引用外部信号(比如sel)。你写的with (sel),工具会认为这个条件是基于a的属性,但sel和a无关,导致这个条件永远不成立,所以a_这个bin永远不会被命中,覆盖率自然无法统计。iff语句:是用于coverpoint级别的采样控制,它可以引用外部信号,决定整个coverpoint是否在当前采样时刻被触发。当iff (sel)作用于coverpoint a时,只有sel为真的时刻,a的采样值才会被计入覆盖率统计,这正好符合你想要的逻辑。
简单来说,如果你需要根据外部信号控制是否对某个coverpoint进行采样,就要用iff;如果只是想从coverpoint的变量值里筛选一部分计入某个bin,才用with。
内容的提问来源于stack exchange,提问作者Ankit Kaushik
相关产品推荐
相关产品推荐

