覆盖率验证——代码覆盖率+功能覆盖率

更新时间:2023-06-13 00:52:45 阅读: 评论:0

覆盖率验证——代码覆盖率+功能覆盖率
⽂章⽬录
⼀、基于覆盖率驱动的验证技术
  采⽤覆盖率驱动的验证⽅式可以量化验证进度,保证验证的完备性。⼀般在验证计划中会指定具体的覆盖率⽬标。通过覆盖率验证可以确定验证是否达到要求。当然,达到⽬标覆盖率并不意味着验证就通过了,因为功能覆盖率是由⼈为定义的,有时候即便达到100%,也未必将所有的功能场景全部覆盖了,因为⼈为主观定义的功能场景有时候可能存在遗漏,所以还需要对测试⽤例进⾏迭代。
⼆、代码覆盖率与功能覆盖率
1. 代码覆盖率:⼯具会⾃动搜集已经编写好的代码,常见的代码覆盖率如下:
⾏覆盖率(line coverage):记录程序的各⾏代码被执⾏的情况。
条件覆盖率(condition coverage):记录各个条件中的逻辑操作数被覆盖的情况。
跳转覆盖率(toggle coverage):记录单bit信号变量的值为0/1跳转情况,如从0到1,或者从1到0的跳转。
分⽀覆盖率(branch coverage):⼜称路径覆盖率(path coverage),指在if,ca,for,forever,while等语句中各个分⽀的执⾏情况。
状态机覆盖率(FSM coverage):⽤来记录状态机的各种状态被进⼊的次数以及状态之间的跳转情况。
2. 功能覆盖率:`是⼀种⽤户定义的度量,主要是衡量设计所实现的各项功能,是否按预想的⾏为执⾏,即是否符合设计说明书的功能点
要求,功能覆盖率主要有两种如下所⽰:
⾯向数据的覆盖率(Data-oriented Coverage)-对已进⾏的数据组合检查.我们可以通过编写覆盖组(coverage groups)、覆盖点(coverage points)和交叉覆盖(cross coverage)获得⾯向数据的覆盖率.
⾯向控制的覆盖率(Control-oriented Coverage)-检查⾏为序列(quences of behaviors)是否已经发⽣.通过编写SVA来获得断⾔覆盖率(asrtion coverage).
需要指出的是: 代码覆盖率达到要求并不意味着功能覆盖率也达到要求,⼆者⽆必然的联系。⽽为了保证验证的完备性,在收集覆盖率时,要求代码覆盖率和功能覆盖率同时达到要求。
三、功能覆盖率建模
功能覆盖率主要关注设计的输⼊、输出和内部状态,通常以如下⽅式描述信号的采样要求;
对于输⼊,它检测数据端的输⼊和命令组合类型,以及控制信号与数据传输的组合情况。
对于输出,它检测是否有完整的数据传输类别,以及各种情况的反馈时序。
对于内部设计,需要检查的信号与验证计划中需要覆盖的功能点相对应。通过对信号的单⼀覆盖、交叉覆盖或时序覆盖来检查功能是否被触发,以及执⾏是否正确。
服兵役条件
3.1.覆盖组——covergroup
  使⽤覆盖组结构(covergroup)定义覆盖模型,覆盖组结构(covergroup construct)是⼀种⽤户⾃定义的结构类型,⼀旦被定义就可以创建多个实例就像类(class)⼀样,也是通过new()来创建实例的。覆盖组可以定义在module、program、interface以及class中。
每⼀个覆盖组(covergroup)都必须明确⼀下内容:
⼀个时钟事件以⽤来同步对覆盖点的采样;
⼀组覆盖点(coverage points),也就是需要测试的变量;
覆盖点之间的交叉覆盖;
可选的形式参数;
覆盖率选项;
covergroup cov_grp @(podge clk);//⽤时钟明确了覆盖点的采样时间,上升沿采样覆盖点,也可省略clk,在收集覆盖率时在根据情况注明
cov_p1: coverpoint a;//定义覆盖点,cov_p1为覆盖点名,a为覆盖点中的变量名,也就是模块中的变量名
endgroup
cov_grp cov_inst =new();//实例化覆盖组
  上述例⼦⽤时钟明确了覆盖点的采样时间,上升沿采样覆盖点,也可省略clk,在收集覆盖率时在根据情况注明,如下⽰例:
covergroup cov_grp;
cov_p1: coverpoint a;//cov_p1为覆盖点名,a为覆盖点中的变量名,也就是模块中的变量名
endgroup
cov_grp cov_inst =new();
cov_inst.sample();//sample函数收集覆盖率
拼音格式怎么写  上⾯的例⼦通过内建的sample()⽅法来触发覆盖点的采样.
logic [7:0] address;
covergroup address_cov (ref logic [7:0] address,//添加形式参数
input int low,int high) @ (podge ce);
ADDRESS : coverpoint address {
bins low    ={0,low};
bins med    ={low,high};
}
endgroup
address_cov acov_low  =new(addr,0,10);
address_cov acov_med  =new(addr,11,20);
address_cov acov_high =new(addr,21,30);
  覆盖组中允许带形式参数,外部在引⽤覆盖组时可以通过传递参数,从⽽对该覆盖组进⾏复⽤。
3.2.覆盖点——coverpoint
  ⼀个覆盖组可以包含多个覆盖点,每个覆盖点有⼀组显式bins值,bins值可由⽤户⾃⼰定义,每个bins值与采样的变量或者变量的转换有关。⼀个覆盖点可以是⼀个整型变量也可以是⼀个整型表达式。覆盖点为整形表达式的⽰例如下:注意覆盖点表达式写法。
class Transaction();
rand bit[2:0]  hdr_len;//取值:0~7
rand bit[3:0]  payload_len;//取值:0~15
...
endclass
Transaction  tr;
covergroup Cov;
寻宝的拼音len16:coverpoint(tr.hdr_len + tr.payload_len);//注:取值范围为0~15
len32:coverpoint(tr.hdr_len + tr.payload_len +5'b0);//注:取值范围为0~31
endgroup
  当进⾏仿真后,len16的覆盖点覆盖率最⾼可达100%,⽽覆盖点len32的覆盖率最⾼只能达到23/32=71.87%。由于总的bins数量为32个,⽽实际最多只能产⽣产⽣len_0,len_1,len2,…,len22共23个bins,所以覆盖率永远不可能达到100%。
  如果要使覆盖点len32达到100%的覆盖率,可以⼿动添加⾃定义bins,代码如下:
covergroup Cov;
len32:coverpoint(tr.hdr_len + tr.payload_len +5'b0);//注:取值范围为0~31
清算报告{bins  len[]={[0:22]};}
endgroup
  此时将覆盖点的范围限定在0~22之间,符合覆盖点的实际取值范围,故覆盖率可以达到100%。
3.3.覆盖点元素——隐式bin与显式bins
隐式或⾃动bin:覆盖点变量,其取值范围内的每⼀个值都会有⼀个对应的bin,这种称为⾃动或隐式的bin。例如,对于⼀个位宽为nbit的覆盖点变量,若不指定bin个数,2^n个bin将会由系统⾃动创建,需要注意的是⾃动创建bin的最⼤数⽬由auto_bin_max内置参数决定,默认值64。
program automatic test(busifc.TB ifc);//接⼝例化
class Transaction;
rand bit [3:0]  data;
rand bit [2:0]  port;
endclass
covergroup Cov;//定义覆盖组,未添加时钟信号,此时需要使⽤sample()函数采集覆盖率
coverpoint  tr.port;//设置覆盖点
endgroup
initial begin
Transaction  tr=new();//例化数据包
Cov          ck=new();//例化覆盖组
repeat(32) begin
tr.randomize();液化天然气
ifc.cb.port <= tr.port;
ifc.cb.data <= tr.data;
ck.sample();//采集覆盖率
@ifc.cb;
end
end
endprogram
对于覆盖点tr.port,如果覆盖率达到100%,那么将会有auto[0],auto[1],auto[2] … auto[7]等8个bin被⾃动创建。其实际功能覆盖率报告如下:
显式bins:"bins"关键字被⽤来显⽰定义⼀个变量的bin,⽤户⾃定义bin可以增加覆盖的准确度,它属于功能覆盖率的⼀个衡量单位。
在每次采样结束时,⽣成的数据库中会包含采样后的所有bins,显⽰其收集到的具体覆盖率值。最终的覆盖率等于采样的bins值除以总的bins值。
covergroup 覆盖组名 @(podge clk);//时钟可以没有
覆盖点名1: coverpoint 变量名1{ bins bin名1={覆盖点取值范围}(iff(expression));//iff结构可以指定采样条件
bins bin名2={覆盖点取值范围};
bins bin名3={覆盖点取值范围};
.......
}//⼀般会将bin的数⽬限制在8或16
。。。。。。
endgroup :覆盖组名
iff结构的运⽤实例如下:
bit[1:0]  s0;
covergroup  g4;
cover1: coverpoint s0 iff(!ret);//当ret=0时,表达式为真开始采样
endgroup
//注意对coverpoint的bin的声明使⽤的是{},这是因为bin是声明语句⽽⾮程序语句,⽽且{}后也没有加分号
  针对某⼀变量,我们关⼼的可能只是某些区域的值或者跳转点,因此我们可以在显⽰定义的bins中指定⼀组数值(如3,5,6)或者跳转序列(如3->5->6)。显⽰定义bins时,可通过关键字default将未分配到的数值进⾏分配。
covergroup  Cov;
瑜伽瘦腿coverpoint  tr.data{//data变量的取值范围为0~15,不设置显⽰bins时,理论上会有16个bin
bins  zero ={0};//取值:0
bins  lo ={[1:3],5};//取值:1,2,3,5
bins  hi[]={[8:$]};//取值:8~15,使⽤动态数组⽅法时相当于创建了hi[0],hi[1],...,hi[7]⼀共8个bins
bins  misc =default;//余下的所有值:4,6,7
}
其部分覆盖率报告如下:
3.4.覆盖点的状态跳转——=> 与 ?通配符
  除了在bins中定义数值,还可以定义数值之间的跳转,操作符(=>),如下所⽰:
bit[2:0]    v;
covergroup  sg@(podge clk);
coverpoint  v{bins b1=(3=>4),(4=>5),(5=>6);
bins b2=(3=>4=>5);//跳转次序为 3->4->5,如果没有执⾏这个次序,则这个bins没有覆盖
bins b3=(1,5=>6,7);//(1=>6)、(1=>7)、(5=>6)、(5=>7)
bins b5=(5[*3]);//3 concutive 5's(连续重复,数值5的3次重复连续)
bins b6=(3[*3:5]);//(3=>3=>3)、(3=>3=>3=>3)、(3=>3=>3=>3=>3)
bins b7=(4[->3]=>5);//...=&=&=>4=>5(跟随重复,4出现3次,可以不连续,但在最后⼀个4出现后,下⼀个数值为5)
bins b8=(2[=3]=>5);//...=&=&=&=>5(⾮连续重复,数值2出现3次)
bins anothers=default_quence;
}
endgroup
  除操作符外,还可使⽤关键词wildcard和通配符?来表⽰状态和状态跳转;
wildcard bins abc ={2'b1?};//覆盖10,11
wildcard bins abc =(2'b1x => 2'bx0};
文明施工措施//覆盖 10=>00 ,10=>10 ,11=>00 ,11=>10
covergroup address_cov () @ (podge ce);
ADDRESS : coverpoint addr {
// Normal transition bibs
wildcard bins adr0  ={3'b11?};
// We can u wildcard in transition bins also
wildcard bins adr1  =(3'b1x0 => 3'bx00);
wildcard bins adr2  =(3'b1?0 => 3'b?00);
}
endgroup
————————————————
原⽂链接:blog.csdn/bleauchat/article/details/90445713
3.4.覆盖点之间的交叉覆盖率——cross
  交叉覆盖是在覆盖点或变量之间指定的,必须先指定覆盖点,然后通过关键字cross定义覆盖点之间的交叉覆盖。
//通过覆盖点来定义交叉覆盖
bit [3:0] a, b;
covergroup cg @(podge clk);
c1: coverpoint a;
c2: coverpoint b;
c1Xc2: cross c1,c2;//1. 定义交叉覆盖使⽤关键字cross,利⽤**覆盖点名字**定义交叉覆盖
endgroup : cg
//通过变量名来定义交叉覆盖
bit [3:0] a, b;
covergroup cov @(podge clk);
aXb : cross a, b;//2. 定义交叉覆盖使⽤关键字cross,直接利⽤**变量名字**定义交叉覆盖
endgroup
//交叉覆盖的通⽤定义格式:
交叉覆盖名:cross 交叉覆盖点名1,交叉覆盖点名2;
  由于上⾯每个覆盖点都有16个bin,所以它们的交叉覆盖总共有256(16*16)个交叉积(cross product),也就对应256个bin。
bit [3:0] a, b, c;
covergroup cov @(podge clk);
BC  : coverpoint b+c;
aXb : cross a, BC;
试用期协议
endgroup

本文发布于:2023-06-13 00:52:45,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/941130.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:覆盖   覆盖率   功能   定义
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图