功能覆盖率

覆盖率组可以在程序、模块或者类中定义,一般情况下为了方便管理统一在类中定义.
1.限制自动创建仓的数目
默认情况下system verilog支持的最大仓的数目是64个,如果超过64个会将其均匀的分给auto_bin_max.在covergroup中可以设置option.auto_bin_max来控制建仓的个数.
a.对4bit的m_pkt_len设置auto_bin_max=2
从下图中可以看到coverpoint被分为了0-7和8-15两个仓,其中仓8-15被覆盖,因此score是50%
功能覆盖率_第1张图片
b.对4bit的m_pkt_len不设置auto_bin_max
从下图中可以看到coverpoint被分成了0-15共16个仓,auto_max_bin是64,而实际当中仓的个数是16,而且只有8这个仓被覆盖到,因此得分是1/16,即6.25%.
功能覆盖率_第2张图片
c.针对性设置
从下图可以看出,m_pkt_len设置了auto_bin_max仓数是2,而m_test_len没有设置其仓数是16.
功能覆盖率_第3张图片
d.修改名字
创建coverpoint时,默认名字便是后面跟的变量的名字;但是,可以通过在其前面添加名字和:来设置.
功能覆盖率_第4张图片
2.自定义建仓
默认情况下,system verilog会均匀的建仓.但是,分析可知有一些仓它们时等价的,只要覆盖其中一个便认为其都覆盖了,所以有时候我们可以通过自动建仓来实现.从图中可以看出bins test_len = {[0:15]}是一个仓,只要其中一个值覆盖了它便100%覆盖;但是如果建仓的目的是0-15这16个数值各建一个仓,可以修改为bins test_len[] = {[0:15]}
功能覆盖率_第5张图片
3.覆盖点细化
在收集覆盖时,可以对收集的数据命名细化,从而方便知道哪些点被覆盖,哪些点没有被覆盖.自定义建仓之后,会将覆盖率限制在我们感兴趣的范围内,只有当自定义的仓都被命中了,才能得到100%的覆盖率.
test_len:coverpoint m_test_len{
bins zero = {0};
bins mid = {[1:14]};
bins max = {15};
}
功能覆盖率_第6张图片
4.条件覆盖率
收集覆盖率时,有些数据的收集有前置条件,只有当前置条件满足了才可以收集数据,那么我们可以通过关键字iff给覆盖点添加相应的条件来实现.
test_len:coverpoint m_test_len iff(m_pkt_len >=6){
bins mid = {[6:10]};
}
功能覆盖率_第7张图片
5.通配符
在bins前面添加wildcard,那么在表达式中,任何x、z或者?都会被当成0或者1,例如下面创建两个仓,一个代表奇数值,一个代表偶数值.
test_len:coverpoint m_test_len{
wildcard bins even = {4’b???0};
wildcard bins odd = {4’b???1};

}
6.忽略数值
在收集覆盖率时,由于数据本身一些值无法达到,如果用system verilog自动建仓,那么始终会导致覆盖率达不到100%.一种方法是显示定义仓值,另一种办法是通过设置ignore_bins实现.从而缩小数据的范围.
test_len:coverpoint m_test_len{
ignore_bins low = {[0:1]};
}
那么在收集时,原本收集0-15,现在改为收集2-15.
7.不合法的仓
收集覆盖率时,有些数值是非法值,出现了应该立马报错排查原因.可以通过设置illgal_bins实现.
test_len:coverpoint m_test_len{
illegal_bins low = {[0:1]};
}
8.设置采样点
获取采样数据时,一种是通过在covergroup中添加诸如@(posedge clk)等采样方式,new之后,当条件满足之后自动采样,不需要调用sample函数;一种是covergroup中没有添加采样方式,new之后,需要显式调用sample函数.
功能覆盖率_第8张图片
9.参数化
对于一些通用的covergroup,我们可以通过参数化设置,实现重复利用.
功能覆盖率_第9张图片
10.交叉
交叉覆盖是在覆盖点或变量之间指定的,必须先指定覆盖点,然后才能定义覆盖点之间的交叉覆盖,可以通过覆盖点名或者变量名来定义交叉覆盖.
功能覆盖率_第10张图片
11.自定义cross bins
binsof和intersect实现交叉场景自定义bins.binsof用来选择交叉的coverpoint,intersect用来选择其对应的数值或者bins名字.

你可能感兴趣的:(功能覆盖率)