如何在非连续采样点场景下实现SystemVerilog过渡覆盖率?
非连续跳变场景的过渡覆盖率实现方案
问题原因
你最初编写的(0=>1=>2=>...=>15)属于严格连续过渡规则:要求相邻两次clk采样的var_1值必须严格按照给定顺序依次变化,中间不允许同一个值重复出现。只要var_1在某个取值上保持超过1个采样周期,整个过渡序列就会被判定为中断,因此无法命中该bin。
可行解决方案
SystemVerilog的覆盖率语法支持使用重复序列符[*min:max]来描述同一个值连续出现的次数范围,你只需要给每个过渡节点添加[*1:$]修饰($表示无穷大),代表该值可以连续出现1次到任意多次,即可匹配「值可能停留任意个clk周期再跳变」的场景:
covergroup CG1 @(posedge clk); coverpoint var_1 { // 允许每个值停留任意个clk周期,只要按0→1→2…→15的顺序最终完成跳转即可命中 bins var_1_trans_bin = (0[*1:$] =>1[*1:$] =>2[*1:$] =>3[*1:$] =>4[*1:$] =>5[*1:$] =>6[*1:$] =>7[*1:$] =>8[*1:$] =>9[*1:$] =>10[*1:$] =>11[*1:$] =>12[*1:$] =>13[*1:$] =>14[*1:$] =>15[*1:$]); bins var_1_bin[] = {[0:15]}; } endgroup
效果验证
你提供的测试代码中clk周期为10ns,var_1每20ns才更新一次,所以每个var_1值会被连续采样2次,刚好命中了原始严格连续过渡的中断条件,替换上述代码后即可命中过渡bin,整体覆盖率可以达到100%。
内容的提问来源于stack exchange,提问作者sandywho
相关产品推荐
相关产品推荐

