在systemverilog中,对于一个covergroup来说,可能会有多个instance,我们可能需要对这些instance覆盖率进行操作。
只保存covergroup type的覆盖率,不需要保存instance-specified的覆盖率
coverage type和instance-specified的覆盖率都保存
选择coverage type总体覆盖率的计算方式
对于以上的3个问题,可以使用sv里covergroup自带的以下几个控制选项来完成:
option.per_instance, type_option.merge_instances和option.get_inst_coverage的默认值都是1。要注意的是merge_instances是type_option,也就是说这个coverage group不管例化多少份,merge_instances都是一样的,也可以理解为class里的static变量 (The identifier type_option is a built-in static member of every covergroup, coverpoint, and cross)。其它两个是instanceoption,也就是说在例化covergroup的时候可以更改它们的值,从而造成各种类型的instances,可以理解为内部变量 (Instance-specific option assignment statements in the covergroup definition are evaluated at the time that the covergroup is instantiated. Each instance of a covergroup can initialize an instance-specific option to a different value. The initialized option value affects only that instance.)。
结合上述3个options的功能,我们来看如何解决最开始提出的3个问题。
解决第一个问题
可以把option.per_instance设置为0,或者不配置,因为它的default值是0。这样我们看到的questasim覆盖率结果页面如下:
我们在这个例子里例化了两份cg_dcu_tag covergroup。但最后显示的就单单是covergroup type的结果。
解决第二个问题
可以把option.per_instance设置为1。这样我们看到的questasim覆盖率结果页面如下:
我们在这个例子里例化了两份cg_dcu_data covergroup。因为per_instance=1,所以最后收集到的coverage信息包含covergroup type和covergroup instances的。而且可以看出merge_instances=0,所以covergroup type的覆盖率结果是INST dcu_data和INST dcu_data#1这两个instance的加权平均得到的。(45.15%*1 + 45.12*1)/2 ≈ 45.14%
解决第三个问题
把type_option.merge_instances设置为1或0,会影响covergroup type的覆盖率值。如果设置为0,那么是将各个instance按weight进行加权平均。如果设置为1,是把各个instances的结果或起来。
我们在这个例子里例化了两份cg_dcu_counter covergroup。因为per_instance=1,所以会看到coverage type和coverage instances的结果。还有就是merge_instances=1,所以最后coverage type覆盖率的结果是INST dcu_counter和INST dcu_counter#1的或起来。
其实option.per_instance和type_option.merge_instances各自独立,可以任意组合,上面例子只是组合了3种场景,还有一种场景就是option.per_instance=0,type_option.merge_instances=1。读者可以自行分析。
然后再说下option.get_inst_coverage,这个选项会影响covergroup内置函数get_inst_coverage()的返回结果。如果option.get_inst_coverage=1,那么返回每个特定instance的coverage结果。如果option.get_inst_coverage=0,那么返回总得结果,也就是和get_coverage()内置函数的结果一样。所以读者要根据使用场景自行配置。
覆盖率计算方式
既然这节提到了覆盖率合并,那也顺便说下sv里覆盖率的计算方式。
说明下,coverpoint有两种,1种是用户自动指定bins,另1种是系统自动生成bins。1个bin如果没有转换或者值,那么这个bin的结果会从Ci计算公式里的分母和分子中去掉。也就是不参与计算了。
对于cross覆盖率的计算:
covergroup type覆盖率的计算:
刚才上述也讲过,covergroup type覆盖率的计算有两种方式,如果type_option.merge_instances等于0(false),那么type coverage的计算方式是所有instances的加权平均(weight average)。如果type_option.merge_instances等于1(true),那么type coverage的计算方式是把所有instance的覆盖率结果合并(merge)在一起。因此,当采用加权平均计算方式时,covergroup type coverage的结果单单取决于每个instance,而不是instance内的coverpoints或cross。公式如下:
文章来源:谷公子
推荐阅读
- PCIe 6.0:在有损HVM通道中使用PAM4实现64GT/s的挑战
- Wi-R 一种全新的通信方式,让你的身体充当媒介!芯片已推出!
- 科普:DDR
- 用于探测中微子的超低温(液氩)ADC设计
- 在IC设计/验证中怎么应用ChatGPT?
更多IC设计技术干货请关注IC设计技术专栏。
迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。