一:覆盖率计算方法:sv参考手册上给出的计算方法如下:
其中merge of coverage of coverpoint from all instace的计算方法是(所有实例中,该coverpoint的仓命中总和)/(该coverpoint的总仓数);
比如:某个coverpoint一共有7个bins:如在covergroup实例1中该coverpoint的bins_1和bins_2命中,在covergroup实例2中bins2和bins_3命中。则该coverpoint一共有bins_1,bins_2,bins_3命中,那么,merge of coverage of coverpoint from all instace=3/7.
上述Type g1的覆盖计算方法的前提是使用type_option.merge_instances = 1的情况下。当type_option.merge_instances = 0时,Type g1的覆盖率计算方法如下:
Note:仿真中发现,VCS不支持type_option.merge_instances,但是在覆盖率报告中仍然两种类型的type coverage。接下来我们还是使用type_option.merge_instances区分两种覆盖率。仿真结果如下:
二:测试代码
program cov_test;
class transaction;
bit[3:0] parama;
bit[3:0] paramb;
bit[3:0] paramc;
bit[3:0] paramd;
endclass
covergroup CovPort(ref transaction tr,input int num);
option.per_instance=1;
option.weight = num;
parama:coverpoint tr.parama{
option.auto_bin_max = 1;
}
paramb:coverpoint tr.paramb{
bins lo = {[0:2]};
bins mid = {[3:5]};
bins hi = {[6:8]};
}
paramc:coverpoint tr.paramc[1:0]{
bins staus[] = (0,1,2 =>0);
}
paramd:coverpoint tr.paramd{
type_option.weight = 0;
option.auto_bin_max =3 ;
type_option.comment="don't care this coverpoint";
}
endgroup
initial begin
CovPort ck1 ;
CovPort ck2 ;
transaction tr ;
tr =new();
ck1=new(tr,1);
ck2=new(tr,2);
begin
#1ns;
tr.parama=1;
tr.paramb=2;
tr.paramc=1;
tr.paramd=1;
ck1.sample();
#1ns
tr.parama=2;
tr.paramb=4;
tr.paramc=0;
tr.paramd=5;
ck1.sample();
ck2.sample();
end
end
endprogram
三:仿真结果:
1:覆盖率报告主界面
使用$get_coverage函数,得到覆盖率58.33.
上图只作为解释含义使用,与下面的覆盖率报告无关联。
上图中:Group中的goal使用type_option指定。Instances在的goal使用option指定。两者均在covergroup层次。
2:covergroup不同实例的覆盖率报告
3:covergroup整体覆盖率报告
上图中,goal参数也由type_option.goal指定
四:覆盖率函数
常见的覆盖率相关的函数如下
get_coverage和get_inst_coverage两个函数都可以用于covergroup,coverpoint和cross层次。首先讨论get_coverage的用法:
1:get_coverage(ref int , ref int)的用法
1.1在covergroup层次调用,返回的是type coverage。此外,该函数的第一个ref参数返回的是所有实例下已经命中的仓,第二个参数返回的是所有实例下仓的个数。
1.2在coverpoint、cross层次调用:返回的是所有实例中该coverpoint/cross的覆盖率。第一个参数返回的是所有实例下该coverpoint/cross的命中仓数,第二个参数返回的是所有实例下该coverpoint/cross的仓数。同一covergroup类型的不同实例调用get_coverage(),得到的结果均一样的。
2:get_inst_coverage(ref int,ref int)的用法
2.1:在covergroup层次调用,返回的是单个实例的覆盖率。第一个参数返回的在该实例下,仓的命中个数;第二个参数是在该实例下,仓的总数。
2.2:在covergpoint/cross层次调用,返回的是该实例的某个coverpoint/cross的覆盖率。第一个参数返回的是该实例下某coverpoint/cross的仓的命中个数,第二个参数返回的是该实例下某coverpoint/cross的仓的总数。