1.覆盖率类型及意义:
代码覆盖率:以下覆盖率的综合
- 行覆盖率:哪些可执行的行被执行过
- 路径覆盖率:有哪些路径被执行过
- 翻转覆盖率:有哪些状态有过0,1翻转
- 有限状态机覆盖率:状态机中哪些状态和状态转换被访问过
功能覆盖率:哪些功能已经被覆盖
断言覆盖率:测量断言被触发的频繁程度
2.覆盖组的格式
1)不指定仓名的覆盖组
covergroup covport;
coverpoint tr.port;
endgroup
2)指定仓名的覆盖组
covergroup covkind;
coverpoint tr.kind{
bins zero = {0}; // 一个仓,名为zero
bins low = {[1:3], 5}; // 一个仓,名为low
bins high[] = {[8:$]}; // 多个独立仓,名为high_8,high_9,...
bins misc = default; // 一个仓,名为misc
}
endgroup
3)指定覆盖率数据收集条件
covergroup covport;
coverpoint tr.port iff(!bus_if.reset); // reset时,不收集覆盖率数据
endgroup
4)覆盖组的触发——使用 .sample()
// 使用 .sample() 触发覆盖组的数据收集
covport = new();
covport.sample(); // 采集覆盖率数据
5)使用事件触发的覆盖组
covergroup covport@(trans_ready); // 当事件trans_ready被触发,则覆盖率数据开始收集
coverpoint tr.port;
endgroup
6)覆盖率数据收集的启动与停止
covport ck = new(); // 在启用覆盖组前,需要先实例化覆盖组
#1ns ck.stop(); // 在reset前,停用覆盖组
bus_if.reset = 1;
#100ns bus_if.reset = 0;
ck.start(); // reset结束后,启用覆盖组
7)翻转覆盖率
covergroup covport;
coverpoint tr.port{
bins t1=(0=>1),(0=>2),(0=>3) // 一个仓,当发生0=>1,0=>2,0=>3任一翻转,该仓hit一次
bins t2=(1,2=>3,4) // 等价于 bins t2=(1=>3),(1=>4),(2=>3),(2=>4)
bins t3=(0=>1[*3]=>2) // 等价于 bins t3=(0=>1=>1=>1=>2)
bins t4=(0=>1[*3:5]=>2) // 等价于 bins t4=(0=>1[*3]=>2),(0=>1[*4]=>2),(0=>1[*5]=>2)
}
endgroup
8)应忽略的仓 和 不合法的仓
covergroup covport;
coverpoint tr.port{
ignore_bins low={[0, 1]}; // 不会收集这个仓内数值
illegal_bins high={[6, 7]}; // 当仓内数值出现,立即报错
}
endgroup
9)交叉覆盖仓
交叉覆盖仓的数据是基于 单个覆盖点 和 交叉覆盖组 的。
covergroup covport;
kind: coverpoint tr.kind;
port: coverpoint tr.port;
cross kind, port;
endgroup
10)指定交叉覆盖仓的名称
covergroup covport;
kind: coverpoint tr.kind{
bins .....;
.....;
}
port: coverpoint tr.port{
bins .....;
.....;
}
cross kind, port;
endgroup
11)在覆盖率度量中废除部分覆盖点
covergroup covport;
kind: coverpoint tr.kind{
bins .....;
.....;
option.weight = 0; // 这样就不会计入单个覆盖点的数据
}
port: coverpoint tr.port{
bins .....;
.....;
option.weight = 0; // 这样就不会计入单个覆盖点的数据
}
cross kind, port; // 只会计算交叉覆盖组的数据
endgroup
12)排除掉部分交叉覆盖仓
使用binsof()intersect{},注意 binsof 后面是小括号,intersect 后面是大括号
covergroup covport;
kind: coverpoint tr.kind{
bins .....;
.....;
}
port: coverpoint tr.port{
bins .....;
.....;
}
cross kind, port{
ignore_bins high=binsof(port)intersect{7}; // 忽略掉 port 中的 数值 7
ignore_bins mid=binsof(port)intersect{0} && binsof(kind)intersect{[9:11]}; // 忽略掉 port 中的 数值 0 和 kind 中的 数值 9 ~ 11 。
ignore_bins low=binsof(kind.low); // 忽略掉 kind 中的整个 low 仓
}
endgroup