01
覆盖率是衡量验证进度的重要数据;是衡量设计验证精度和完备性的数据指标;
覆盖率需要解决的两个问题:
按照覆盖率生成方法:
常见三种覆盖率:
注意:
02
代码覆盖率,可以识别在验证设计中已执行的代码;
不是所有被覆盖的代码都会得到监测,由于没有得到足够的监测,因此一些即使被触发的漏洞也会在传播过程中没有到达监测点上。
if (dtack==1’b1)begin :acked //只要if语句表达式为true,就执行acked块
as <=1’b0;
data <=16’hzzzz;
bus_rq<=1’b0;
state <=IDLE;
end:acked //因此计算该块的执行等同于计算该块中的四个单独语句的执行
分支覆盖率是用来对条件语句(if/else,case,?:),指出其执行的分支轨迹;
if (parity==ODD||parity==EVEN)begin //判断分支的布尔表达式为true或者false
用来衡量一些布尔表达式中各个条件真伪判断的执行轨迹;
if (parity==ODD||parity==EVEN)begin //两个条件是否各自衡量为true、false
Parity==ODD或者parity!=ODD
Parity==EVEN或者parity!=EVEN
记录寄存器跳转的次数(从0到1,从1到0的次数);
03
功能覆盖率
验证设计中的功能描述是否全部实现;
覆盖组可以由covergroup 、endgroup来定义:
enum{red,green,blue} color;
bit [3:0] pixel_adr,pixel_offset,pixel_hue;
covergroup g2@(posedge clk);
Hue: coverpoint pixel_hue;
Offset :coverpoint pixel_offset;
Axc :cross color,pixel_adr; //cross 2variables
all :cross color,Hue ,Offset; //cross 1 VARs and 2CPs
endgroup
g2 cg_inst=new();
class xyz; //声明一个覆盖组类型cov1和他的实例c1
bit[3:0] m_x;
int m_y;
bit m_z;
covergroup cov1 @m_z; //embeded covergroup
coverpoint m_x;
coverpoint m_y;
endgroup
function new();
cov1 c1 =new();
endfunction
endclass
covergroup g4 //通过if禁止coverpoint的采集
coverpoint s0 if(!reset);
endgroup
covergroup cg(ref int x,ref int y,input int c);
coverpoint x; //创建覆盖点x
b:coverpoint y; //创建覆盖点b
cx :coverpoint x; //创建覆盖点cx
d:coverpoint y[31:24] ;//创建覆盖点d
cross x,y; //创建交叉覆盖点
endgroup
关键词bins可以用来将每个感兴趣的数值均对一个独立的bin,或者将所有值对应到一个共同的bin;
bit [9:0] v_a;
covergroup cg @(posedge clk);//覆盖组cg会在每个时钟的上升沿对变量v_a做采样
coverpoint v_a{
bins_a{[0:63],65}; //表示v_a变量只要在采样时刻等于0-63或者65中任意一个值,那么该仓即被采样到一次
bins_b[]={[127:150],[148,191]};//表示一个数组,从127-150以及从148-191中的每一给数值都将被独立采样,放置到独立的仓中
bin_c[]={200,201,202};
bins d={[1000:$]};
bins others[] =default;//除了列举的数值之外放置在others数组
}
endgroup
覆盖仓除了可以覆盖数值,也可以覆盖数值的变化;
value1=>value2
1.5=>6.7
trans_item[*repeat_range]
3 [*5] 表示3=>3=>3=>3=>3
3 [* 3:5] 表示(3=>3=>3). (3=>3=>3=>3)或(3=>3=>3=>3=>3)
如果覆盖点没有指定任何bin,SV会自动生成bin,生成原则:
covergroup cg23:
coverpoint a{
ignore_bins ignore_vals={7,8};
ignore_bins ignore_trans=(1=>3=>5);
}
endgroup
covergroup cg3;
coverpoint b{
illegal_bins bad_vals={1,2,3};
illegal_bin bad_trans=(4=>5=>6);
}
endgroup
交叉覆盖率:对两个或者多个覆盖点或者变量之间定义数值组合覆盖情况;
bit [3:0] a,b;//每个覆盖点自动产生16个bin
covergroup cov @(posedge clk);
aXb:cross a.b:
endgroup //两个覆盖点交叉后生成256个交叉的bin
bit [31:0] a_var;
bit [3:0] b_var; b_var有16个bin
covergroup cov3 @(posedge clk);
A:coverpoint a_var {bins yy[]={[0:9]}:} //A有10个bin
CC : cross b_var.A; //故CC有10*16=160个bin
endgroup
注意:
被声明为default/ignore/illegal的bin将不会参与交叉覆盖率的运算;
交叉覆盖率只允许在同一个covergroup中定义的覆盖点参与运算;
END