覆盖率是衡量哪些设计特征已经被测试程序测试过的指标。可使用一个反馈环路分析覆盖的结果,并决定采取哪种行动达到100%的覆盖率。首要选择是使用更多种子运行现有的测试程序,其次是建立新约束。只有在确实需要时才会创建定向测试。
一个项目实施期间,应保持追踪每周有多少个漏洞被发现。一开始创建测试程序时,通过观察可能就会发现很多漏洞。
下面对于功能覆盖率增长的描述正确的有:BCD
A、功能覆盖率达到100%可以说明验证的完备性;
B、如果覆盖率稳定增长,则只需要修改种子或增加测试时间;
C、如果覆盖率增长放缓,则需要修改约束;
D、如果覆盖率停止增长且不足100%,则需要考虑添加新的测试用例。
1、收集信息而非数据
2、只测量需要的内容
3、验证的完备性
下面对于功能覆盖率策略的描述哪些是正确的:CD
A、应尽可能监测并采样更多的信号;
B、应在每个时钟上升沿都采样感兴趣的信号;
C、如果采样的数值域数量过大,可切分为有限多的数值域,便于分析数据;
D、如果代码覆盖率100%而功能覆盖率不足100%,设计可能没有实现某部分功能;
class Transaction;
Transaction tr;
mailbox mbx_in;
covergroup CovPort;
coverpoint tr.port;
endgroup
function new(mailbox mbx_in);
CovPort = new(); //例化,建议采用Covport cg1 = new();的例化方式
this.mbx_in = mbx_in;
endfunction
task main;
forever begin
tr = mbx_in.get(); //获取下一个事务
ifc.cb.port <= tr.port; //发送到待测设计中
ifc.cb.data <= tr.data;
CovPort.sample(); //采样——收集覆盖率
end
endtask
endclass
sample()
函数完成,也可在covergroup中采用阻塞表达式或使用wait或@实现在信号或事件上的阻塞;sample()
方法。若借助已有事件或信号触发covergroup,可在covergroup声明中使用阻塞语句。event trans_ready; //覆盖组CovPort在测试平台触发trans_ready事件时进行采样
covergroup CovPort @(trans_ready);
coverpoint ifc.cb.port; //测量覆盖率
endgroup
与直接调用sample方法相比,使用事件触发的好处在于能够借助已有事件进行采样。
auto_bin_max
来指定自动创建bin的最大数目。实际操作中自动创建bin的方法不实用,建议用户自行定义bin,或减小auto_bin_max的数值。covergroup CovPort;
options.auto_bin_max = 8; //所有coverpoint auto_bin数量=8
coverpoint tr.port
{options.auto_bin_max = 2;} //特殊部分coverpoint auto_bin数量=2
endgroup
//对一个4比特变量kind进行采样
covergroup CovKind;
coverpoint tr.kind{
bins zero = {0}; //1个仓代表对kind采样值为0进行计数
bins lo = {[1:3],5}; //1个仓代表1-3和5的值
bins hi[] = {[8:$]}; //8个独立的仓8-15,分别保存
bins misc = default; //一个仓用来保存没有被选中的值
} //注意coverpoint定义使用{ }而不是begin...end。
//大括号结尾没有分号,和end一样
endgroup //根据结果,覆盖率为10/11
iff
给coverpoint添加条件。·这种做法常用于在复位期间关闭覆盖以忽略不合理的条件触发;start
和stop
函数控制covergroup各个独立实例。initial begin
CovPort ck = new(); //实例化覆盖组
//复位期间停止收集覆盖率数据
#1ns ;
ck.stop();
bus_if.reset = 1;
#100ns bus_if.reset = 0;
ck.start();
...
end
covergroup CoverPort;
//当reset=1时不要收集覆盖率数据
coverpoint port iff(!bus_if.reset);
endgroup
covergroup CoverPort;
coverpoint port{
bins t1 = (0 => 1), (0 => 2), (0 => 3);
}
endgroup
bit[2:0] port;
covergroup CoverPort;
coverpoint port{
wildcard bins even = {3'b??0}; //只关心最低位,实现判断奇偶
wildcard bins odd = {3'b??1};
}
在某些coverpoint可能始终无法得到全部域值;对于那些不计算功能的域值可用ignore_bins
排除,最终它们并不会计入coverpoint的覆盖率。
bit[2:0] low_ports_0_5; //只使用数值0-5
covergroup CoverPort;
coverpoint low_ports_0_5 {
ignore_bins hi = {[6,7]}; //忽略掉6,7两个仓
}
endgroup
illegal_bins
对特定的bin进行标示。bit[2:0] low_ports_0_5; //只使用数值0-5
covergroup CoverPort;
coverpoint low_ports_0_5{
illegal_bins hi = {[6,7]}; //如果出现6,7两个仓就会报错
}
endgroup
coverpoint是记录单个变量或表达式的观测值。如果想记录在某一时刻多个变量之间值的组合情况,需要使用交叉(cross)覆盖率;cross语句只允许带coverpoint或简单的变量名。
class Transaction;
rand bit [3:0] kind;
rand bit [2:0] port;
endclass
Transaction tr;
covergroup CovPort;
kind: coverpoint tr. kind;
port: coverpoint tr. port;
cross kind, port;
endgroup
通过使用ignore_bins、binsof和intersect分别指定coverpoint和值域,这样可以清除很多不关心的cross bin。
covergroup Covport;
port: coverpoint tr.port
{bins port[] = {[0:$]}; //8
}
kind: coverpoint tr.kind {
bins zero = {0}; //1
bins lo = {[1:3]}; //1
bins hi [] = {[8:$]}; //8
bins misc = default; //1
}
cross kind, port {
ignore bins hi = binsof(port) intersect {7};
ignore bins md = binsof(port) intersect {0} &&
binsof (kind) intersect {[9:11]}; //排除port的0、7、[9:11]
ignore bins lo = binsof (kind.lo); //排除kind的[1:3]
}
endgroup
{a==0,b==0}
、{a==1,b==0}
和{b==1}
。class Transaction;
rand bit a, b;
endclass
covergroup CrossBinNames;
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;} //不计算覆盖率
ab:cross a, b;
{ bins a0b0 = binsof(a.a0) && binsof(b.b0);
bins a1b0 = binsof(a.al)&& binsof(b.b0);
bins bl = binsof(b.b1);}
endgroup
class Transaction;
rand bit a, b;
endclass
covergroup CrossBinsofIntersect;
a: coverpoint tr.a
{ option.weight=0; }
b: coverpoint tr.b
{ option. weight=0; }
ab: cross a, b;
{ bins a0b0 = binsof(a) intersect {0} &&
binsof (b) intersect {0};
bins a1b0 = binsof (a) intersect {1} &&
binsof (b) intersect {0};
bins b1 = binsof (b) intersect {1}; }
endgroup
下面关于bin的描述哪些是正确的:ABC
A、coverpoint中可以指定多个ignore_bins;
B、如果采样到illegal_bins,则仿真会停止;
C、cross覆盖率可以监测三个变量的值的组合情况;
D、如果CP_A有4个bin,CP_B有6个bin,那么cross CP_A,CP_B会自动分配24个bin;
解析:D——前提是得CP_A和CP_B涵盖了所有值。
covergroup CoverLength;
coverpoint tr.length;
option.per_instance = 1;
endgroup
covergroup CoverPort(int lo,hi, string comment);
option.comment = comment;
option.per_instance = 1;
coverpoint port
{ bins range = {[lo:hi]};
}
endgroup
...
CoverPort cp_lo = new (0,3, "Low port numbers");
CoverPort cp_hi = new (4,7, "High port numbers");
at_least
修改每个bin的数值最少的采样次数,如果低于at_least数值,则不会被计入bin中;covergroup CoverPort;
coverpoint port;
option.goal = 90;
endgroup
sample()
:采样;get_coverage()/get_inst_coverage()
:获取覆盖率,返回0-100的real数值;set_inst_name(string)
:设置covergroup的名称;start()/stop()
:使能或关闭覆盖率的收集。$get_coverage()
——得到总的覆盖率;covergroup_inst.get_inst_coverage()
——获取单个covergroup实例的覆盖率;