Dskpimc? · 2023年03月01日 · 北京市

Systemverilog覆盖率的合并和计算方式

在systemverilog中,对于一个covergroup来说,可能会有多个instance,我们可能需要对这些instance覆盖率进行操作。

只保存covergroup type的覆盖率,不需要保存instance-specified的覆盖率
coverage type和instance-specified的覆盖率都保存
选择coverage type总体覆盖率的计算方式
对于以上的3个问题,可以使用sv里covergroup自带的以下几个控制选项来完成:

image.png
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覆盖率结果页面如下:
image.png
 我们在这个例子里例化了两份cg_dcu_tag covergroup。但最后显示的就单单是covergroup type的结果。

解决第二个问题

可以把option.per_instance设置为1。这样我们看到的questasim覆盖率结果页面如下:
image.png
  我们在这个例子里例化了两份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的结果或起来。
image.png
 我们在这个例子里例化了两份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()内置函数的结果一样。所以读者要根据使用场景自行配置。
image.png

覆盖率计算方式

 既然这节提到了覆盖率合并,那也顺便说下sv里覆盖率的计算方式。

image.png

 说明下,coverpoint有两种,1种是用户自动指定bins,另1种是系统自动生成bins。1个bin如果没有转换或者值,那么这个bin的结果会从Ci计算公式里的分母和分子中去掉。也就是不参与计算了。

对于cross覆盖率的计算:
image.png
 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。公式如下:

 
image.png

文章来源:谷公子

推荐阅读

更多IC设计技术干货请关注IC设计技术专栏。
迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。
推荐阅读
关注数
20218
内容数
1308
主要交流IC以及SoC设计流程相关的技术和知识
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息