1.覆盖率收集的分类
1.代码覆盖率:由仿真器收集
2.功能覆盖率
3.断言覆盖率
2.功能覆盖率收集策略
1.收集信息而非数据
2.只测量你会使用的数据
3.测量的完备性
3.功能覆盖率的简单例子
1.在类中定义覆盖组
2.覆盖组的触发
3.覆盖组的采样
4.数据组采样
1.个体仓库和总体覆盖率
2.自动建仓
3.限制建仓的数目:auto_bin_max
covergroup CovPort;
coverpoint tr.port {
option.auto_bin_max=2;
}
endcovergroup
//上面的只针对tr.port的数目起作用,下面的对于port和data都有作用
covergroup CovPort;
option.auto_bin_max=2;
coverpoint tr.port;
coverpoint tr.data;
endcovergroup
4.使用用户自定义的仓库来发现漏洞
covergroup CovPort;
len:coverpoint(tr.hdr_len+tr.playload+5'h0)
{
bins len[]={[0:125]};
}
endcovgroup
5.命名覆盖率的仓
1.对data[0:16]进行收集
covergroup CovPort;
coverpoint tr.data {
bins lo = {[0]};
bins mid = {[4:1]};
bins max[] = {[9:5]};
bins misc = default;
}
endcovergroup
2.使用通配符
covergroup CovPort;
coverpoint tr.data {
bins lo = {[2:$]};
bins mid = {[3]};
bins max = {[$:4]};
}
endcovport
3.为枚举创建
typedef enum{RED,BLUE,GREEN} color_e
color_e pcolor;
covergroup CovPort;
coverpoint pcolor;
endcovergroup
4.状态翻转率
covergroup CovPort;
coverpoint t1 = {0=>1; 0=>2; 0=>3};
endcovport
5.在状态和翻转中使用通配符
covergroup CovPort;
coverpoint tr.data {
wildcard bins lo = {3'b??0};
wildcard bins mid = {3'11?};
}
endcovport
6.忽略数值
covergroup CovPort;
coverpoint tr.data_0_3 {
ignore_bins lo = {[0]};
ignore_bins mid = {[3]};
}
endcovport
covergroup CovPort;
coverpoint tr.data_0_3 {
option.aotu_bin_max = 4;
ignore_bins mid = {[6,7]};
}
endcovport
7.不合法的仓
covergroup CovPort;
coverpoint tr.data_0_3 {
illegal_bins lo = {[0]};
illegal_bins mid = {[3]};
}
endcovport
8.状态机覆盖率
6.交叉覆盖率
1.基本的交叉覆盖率
class transaction;
rand bit[3:0] kind;
rand bit[4:0] port;
endclass
covergroup CovPort;
kind: coverpoint tr.kind;
port: coverpoint tr.port;
cross kind,port;
endcovergroup
2.对于交叉覆盖仓进行标号
covergroup CovPort;
kind: coverpoint tr.kind {
bins lo[] = {[0:3]};
}
port: coverpoint tr.port;
bins lo = {[2:4]};
bins mid = {[0:1]};
cross kind,port;
endcovergroup
3.排除部分的交叉覆盖仓
covergroup CovPort;
kind: coverpoint tr.kind {
bins lo[] = {[0:3]};
}
port: coverpoint tr.port;
bins lo = {[2:4]};
bins mid = {[0:1]};
cross kind,port {
ignore_bins lo = binsof(kind)intersect{2};
ignore_bins mid = binsof(kind)intersect{2} && binsof(port)intersect{[1:2]};
ignore_bins hi = binsof(kind.lo[2]);
}
endcovergroup
4.从整体排除部分的覆盖仓
1.指明交叉覆盖率的权重
covergroup CovPort;
kind: coverpoint tr.kind {
bins zero = {0};
bins lo = {[1:3]};
bins hi[] = {[8:$]};
bins misc = default;
option.weight = 0;
}
port: coverpoint tr.port {
bins port[] = {[0:$]};
option.weight = 0;
}
cross kind,port {
option.weight = 10;
}
endcovergroup
5.精准的交叉覆盖仓
class transaction;
rand bit a,b;
endclass
covergroup CovPort;
a: coverpoint tr.a {
bins a0 = {0};
bins a1 = {1};
option.weight = 0;
}
b: coverpoint tr.b {
bins b0 = {0};
bins b1 = {1};
option.weight = 0;
}
cross a,b {
bins a0b0 = binsof(a.a0) && binsof(b.b0);
bins a0b1 = binsof(a.a0) && binsof(b.b1);
bins b1 = bins(b.b1);
}
endcovergroup
7:通用覆盖着
1.通过数值传递覆盖组参数
2.通过引用传递覆盖组参数
8:覆盖率选项
1.单个实例的覆盖率
option.per_instance = 1;
只能用于覆盖组中,不能用于覆盖点和交叉点;
2.覆盖组的注释
option.comment = comment;
covergroup CovPort(int lo,hi, string comment);
option.comment = comment;
option.per_instance = 1;
coverpoint port {
bins rang = {[lo:hi]};
}
endcovergroup
3.覆盖阈值
option.at_least
4.打印空仓
option.cross_num_print_missing = 1000;
5.覆盖组目标
covergroup CovPort;
coverpoint port;
option.goal = 90;
endcovergroup