代码覆盖率和功能覆盖.pdf

上传人:暗伤 文档编号:96228248 上传时间:2023-09-27 格式:PDF 页数:5 大小:1.77MB
返回 下载 相关 举报
代码覆盖率和功能覆盖.pdf_第1页
第1页 / 共5页
代码覆盖率和功能覆盖.pdf_第2页
第2页 / 共5页
点击查看更多>>
资源描述

《代码覆盖率和功能覆盖.pdf》由会员分享,可在线阅读,更多相关《代码覆盖率和功能覆盖.pdf(5页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、2023/9/21 21:32覆盖率验证代码覆盖率+功能覆盖率_代码覆盖率和功能覆盖率_SD.ZHAI的博客-CSDN博客覆盖率验证代码覆盖率+功能覆盖率VIP文章SD.ZHAI41178 收藏 979分类专栏:SystemVerilog 文章标签:代码覆盖率 网络 服务器已于 2023-09-10 17:54:56 修改版权文章目录一、基于覆盖率驱动的验证技术二、代码覆盖率与功能覆盖率三、功能覆盖率建模3.1.覆盖组covergroup3.2.覆盖点coverpoint3.3.覆盖点元素隐式bin与显式bins3.4.覆盖点的状态跳转=与?通配符3.4.覆盖点之间的交叉覆盖率cross3.6

2、.覆盖率的选项与方法四、代码code约束与覆盖率的运用4.1.通过修改随机化次数提高覆盖率(覆盖点变量取值范围小)4.2.通过添加约束constraint、自定义bins提高覆盖率(覆盖点变量取值范围大)4.3.通过权重dist调整hit次数分布一、基于覆盖率驱动的验证技术 采用覆盖率驱动的验证方式可以量化验证进度,保证验证的完备性。一般在验证计划中会指定具体的覆盖率目标。通过覆盖率验证可以确定验证是否达到要求。当然,达到目标覆盖率并不意味着验证就通过了,因为功能覆盖率是由人为定义的,有时候即便达到100%,也未必将所有的功能场景全部覆盖了,因为人为主观定义的功能场景有时候可能存在遗漏,所以还

3、需要对测试用例进行迭代。二、代码覆盖率与功能覆盖率1.代码覆盖率:工具会自动搜集已经编写好的代码,常见的代码覆盖率如下:行覆盖率(line coverage):记录程序的各行代码被执行的情况。条件覆盖率(condition coverage):记录各个条件中的逻辑操作数被覆盖的情况。跳转覆盖率(toggle coverage):记录单bit信号变量的值为0/1跳转情况,如从0到1,或者从1到0的跳转。分支覆盖率(branch coverage):又称路径覆盖率(path coverage),指在if,case,for,forever,while等语句中各个分支的执行情况。状态机覆盖率(FSM

4、coverage):用来记录状态机的各种状态被进入的次数以及状态之间的跳转情况。2.功能覆盖率:是一种用户定义的度量,主要是衡量设计所实现的各项功能,是否按预想的行为执行,即是否符合设计说明书的功能点要求,功能覆盖率主要有两种如下所示:面向数据的覆盖率(Data-oriented Coverage)-对已进行的数据组合检查.我们可以通过编写覆盖组(coverage groups)、覆盖点(coveragepoints)和交叉覆盖(cross coverage)获得面向数据的覆盖率.面向控制的覆盖率(Control-oriented Coverage)-检查行为序列(sequences of b

5、ehaviors)是否已经发生.通过编写SVA来获得断言覆盖率(assertion coverage).需要指出的是:代码覆盖率达到要求并不意味着功能覆盖率也达到要求,二者无必然的联系。而为了保证验证的完备性,在收集覆盖率时,要求代码覆盖率和功能覆盖率同时达到要求。三、功能覆盖率建模功能覆盖率主要关注设计的输入、输出和内部状态,通常以如下方式描述信号的采样要求;对于输入,它检测数据端的输入和命令组合类型,以及控制信号与数据传输的组合情况。对于输出,它检测是否有完整的数据传输类别,以及各种情况的反馈时序。对于内部设计,需要检查的信号与验证计划中需要覆盖的功能点相对应。通过对信号的单一覆盖、交叉覆

6、盖或时序覆盖来检查功能是否被触发,以及执行是否正确。3.1.覆盖组covergroup 使用覆盖组结构(covergroup)定义覆盖模型,覆盖组结构(covergroup construct)是一种用户自定义的结构类型,一旦被定义就可以创建多个实例就像类(class)一样,也是通过new()来创建实例的。覆盖组可以定义在module、program、interface以及class中。每一个覆盖组(covergroup)都必须明确一下内容:一个时钟事件以用来同步对覆盖点的采样;一组覆盖点(coverage points),也就是需要测试的变量;覆盖点之间的交叉覆盖;可选的形式参数;覆盖率选项

7、;covergroup cov_grp(posedge clk);/用时钟明确了覆盖点的采样时间,上升沿采样覆盖点,也可省略clk,在收集覆盖率时在根据情况注明 cov_p1:coverpoint a;/定义覆盖点,cov_p1为覆盖点名,a为覆盖点中的变量名,也就是模块中的变量名endgroupcov_grp cov_inst=new();/实例化覆盖组上述例子用时钟明确了覆盖点的采样时间,上升沿采样覆盖点,也可省略clk,在收集覆盖率时在根据情况注明,如下示例:covergroup cov_grp;cov_p1:coverpoint a;/cov_p1为覆盖点名,a为覆盖点中的变量名,也就

8、是模块中的变量名endgroupcov_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)(posedge ce);ADDRESS:coverpoint address bins low =0,low;bins med =low,high;endgroupaddress_cov acov_low =

9、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 bit2:

10、0 hdr_len;/取值:07 rand bit3:0 payload_len;/取值:015 .endclassTransaction tr;covergroup Cov;len16:coverpoint(tr.hdr_len+tr.payload_len);/注:取值范围为015 len32:coverpoint(tr.hdr_len+tr.payload_len+5b0);/注:取值范围为031endgroup当进行仿真后,len16的覆盖点覆盖率最高可达100%,而覆盖点len32的覆盖率最高只能达到23/32=71.87%。由于总的bins数量为32个,而实际最多只能产生产生len

11、_0,len_1,len2,len22共23个bins,所以覆盖率永远不可能达到100%。如果要使覆盖点len32达到100%的覆盖率,可以手动添加自定义bins,代码如下:2023/9/21 21:32覆盖率验证代码覆盖率+功能覆盖率_代码覆盖率和功能覆盖率_SD.ZHAI的博客-CSDN博客covergroup Cov;len32:coverpoint(tr.hdr_len+tr.payload_len+5b0);/注:取值范围为031 bins len=0:22;endgroup此时将覆盖点的范围限定在022之间,符合覆盖点的实际取值范围,故覆盖率可以达到100%。3.3.覆盖点元素隐式

12、bin与显式bins隐式或自动bin:覆盖点变量,其取值范围内的每一个值都会有一个对应的bin,这种称为自动或隐式的bin。例如,对于一个位宽为nbit的覆盖点变量,若不指定bin个数,2n个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;/定义覆盖组,未添加时钟信号,此时需要使用sam

13、ple()函数采集覆盖率 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 5-6)。显示定义bins时,可通过关键字default将未分配到的数值进行分配。covergroup Cov;coverpoint tr.data /data变量的取值范围为015,不设置显示bins时,理论上会有16个bin bins zero=0;

14、/取值:0 bins lo=1:3,5;/取值:1,2,3,5 bins hi=8:$;/取值:815,使用动态数组方法时相当于创建了hi0,hi1,.,hi7一共8个bins bins misc=default;/余下的所有值:4,6,7 其部分覆盖率报告如下:3.4.覆盖点的状态跳转=与?通配符除了在bins中定义数值,还可以定义数值之间的跳转,操作符(=),如下所示:bit2:0 v;covergroup sg(posedge clk);coverpoint vbins b1=(3=4),(4=5),(5=6);bins b2=(3=4=5);/跳转次序为 3-4-5,如果没有执行这个次

15、序,则这个bins没有覆盖 bins b3=(1,5=6,7);/(1=6)、(1=7)、(5=6)、(5=7)bins b5=(5*3);/3 consecutive 5s(连续重复,数值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.=4.=4=5(跟随重复,4出现3次,可以不连续,但在最后一个4出现后,下一个数值为5)bins b8=(2=3=5);/.=2.=2.=2.=5(非连续重复,数值2出现3次)bins anothers=default_sequence;endgroup除操

16、作符外,还可使用关键词wildcard和通配符?来表示状态和状态跳转;wildcard bins abc=2b1?;/覆盖10,11wildcard bins abc=(2b1x=2bx0;/覆盖 10=00,10=10,11=00,11=10covergroup address_cov()(posedge ce);ADDRESS:coverpoint addr /Normal transition bibs2023/9/21 21:32覆盖率验证代码覆盖率+功能覆盖率_代码覆盖率和功能覆盖率_SD.ZHAI的博客-CSDN博客 wildcard bins adr0 =3b11?;/We ca

17、n use wildcard in transition bins also wildcard bins adr1 =(3b1x0=3bx00);wildcard bins adr2 =(3b1?0=3b?00);endgroup原文链接:https:/ 3:0 a,b;covergroup cg(posedge clk);c1:coverpoint a;c2:coverpoint b;c1Xc2:cross c1,c2;/1.定义交叉覆盖使用关键字cross,利用*覆盖点名字*定义交叉覆盖endgroup:cg/通过变量名来定义交叉覆盖bit 3:0 a,b;covergroup cov(p

18、osedge 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(posedge clk);BC :coverpoint b+c;aXb:cross a,BC;endgroup上例的交叉覆盖总共有256个交叉积(cross product),

19、也对应256个bin.3.6.覆盖率的选项与方法at_least覆盖阈值,定义一个bin在执行代码过程中至少触发的次数,低于这个触发次数的话,这个bin不算覆盖,默认值是1;auto_bin_max当没有bin为显示创建时,定义一个覆盖点的自动bin的最大数量,默认值为64;cross_auto_bin_max定义一个交叉覆盖的交叉积(cross product)的自动bin的最大数量,没有默认值;covergroup cg(posedge clk);c1:coverpoint addr option.auto_bin_max=128;/addr自动bin的数目最大为128 c2:coverp

20、oint wr_rd option.at_least=2;/wr_rd的每个bin至少要触发两次,否则不算覆盖 c1Xc2:cross c1,c2 option.cross_auto_bin_max=128;/交叉积的自动bin数目最大为128endgroup:cg/覆盖选项如果是在某个coverpoint中定义的,那么其作用范围仅限于该coverpoint;/如果是在covergroup中定义的,那么其作用范围是整个covergroup;四、代码code约束与覆盖率的运用void sample():Triggers the sampling of covergroup 触发覆盖组的采样rea

21、l get_coverage():Calculate coverage number,return value will be 0 to 100 返回覆盖组覆盖率real get_inst_coverage():Calculate coverage number for given instance,return value will be 0 to 100 返回覆盖组实例的覆盖率void set_inst_name(string):Set name of the instance with given string 设置实例名void start():Start collecting cov

22、erage 开启覆盖率收集void stop():Stop collecting coverage 结束收集覆盖率module test();logic 2:0 addr;wire 2:0 addr2;assign addr2=addr+1;covergroup address_cov;ADDRESS:coverpoint addr option.auto_bin_max=10;ADDRESS2:coverpoint addr2 option.auto_bin_max=10;endgroupaddress_cov my_cov=new;initial begin my_cov.ADDRESS.

23、option.at_least=1;my_cov.ADDRESS2.option.at_least=2;/start the coverage collection my_cov.start();/Set the coverage group name my_cov.set_inst_name(ASIC-WORLD);$monitor(addr 8h%x addr2 8h%x,addr,addr2);repeat(10)begin addr=$urandom_range(0,7);/Sample the covergroup my_cov.sample();#10;end/Stop the c

24、overage collection my_cov.stop();/Display the coverage$display(Instance coverage is%e,my_cov.get_coverage();endendmodule4.1.通过修改随机化次数提高覆盖率(覆盖点变量取值范围小)1)、在不添加约束constraint、不使用自定义bins,的情况下:module cov_demo();class transaction;rand bit31:0 data;/232种可能 rand bit2:0 port;/07,一共8种可能 endclass covergroup cov_

25、port;port_bin:coverpoint tr.port;data_bin:coverpoint tr.data;endgroup transaction tr=new;/声明类的句柄,创建对象 cov_port ck=new;/声明覆盖组的句柄,创建对象;covergroup和class类似 initial begin repeat(4)begin /生成得数据包的数量会影响覆盖率,也可以通过添加约束constraint来提升覆盖率,或者自定义bins。tr.randomize;/随机化生成数据 ck.sample();/搜集覆盖率 end end endmodule2023/9/2

26、1 21:32覆盖率验证代码覆盖率+功能覆盖率_代码覆盖率和功能覆盖率_SD.ZHAI的博客-CSDN博客 覆盖率如下:使用Makefile实例三即可。可以看出,两个覆盖点cport和cdata的覆盖率都较低,这是由于产生的随机化数据次数太少,可以通过提高产生随机化的重复次数进一步提高覆盖率2)、在不添加约束constraint、不使用自定义bins,*改变随机化次数*的情况下:repeat(32)begin /生成得数据包的数量会影响覆盖率,也可以通过添加约束constraint来提升覆盖率,或者自定义bins。在将repeat(4)改为repeat(32)后:覆盖率如下:需要指出的是,提高

27、随机化次数来提高覆盖率的方法只适用于,覆盖点的变量本身取值范围不大(如cport)的情况,如cdata自身取值范围太大,此方法便不再适用。此时可以通过添加约束constraint提高覆盖率。4.2.通过添加约束constraint、自定义bins提高覆盖率(覆盖点变量取值范围大)1)、在自定义bins,而不添加约束constraint的情况下:module cov_demo();class transaction;rand bit31:0 data;/232种可能 rand bit2:0 port;/07,一共8种可能 endclass covergroup cov_port;port_bin

28、:coverpoint tr.port;data_bin:covergroup tr.data bins min=0:100;/此时,随机化生成该范围内任意一个数,该bins便被覆盖 bins mid=101:9999;bins max=10000:$;/$-表示最大的边界 endgroup transaction tr=new;/声明类的句柄,创建对象 cov_port ck=new;/声明覆盖组的句柄,创建对象;covergroup和class类似 initial begin repeat(32)begin /生成得数据包的数量会影响覆盖率,也可以通过添加约束constraint来提升覆盖

29、率,或者自定义bins。tr.randomize;/随机化生成数据 ck.sample();/搜集覆盖率 end end endmodule2)、在自定义bins,添加约束constraint的情况下:module cov_demo();class transaction;rand bit31:0 data;/232种可能 rand bit2:0 port;/07,一共8种可能 constraint data_c1 data inside 0:100,101:9999,10000:12000;/由于data的可能性太多,故对其施加约束 endclass covergroup cov_port;

30、port_bin:coverpoint tr.port;data_bin:covergroup tr.data bins min=0:100;/此时,随机化生成该范围内任意一个数,该bins便被覆盖 bins mid=101:9999;bins max=10000:$;/$-表示最大的边界 endgroup transaction tr=new;/声明类的句柄,创建对象 cov_port ck=new;/声明覆盖组的句柄,创建对象;covergroup和class类似 initial begin repeat(32)begin /生成得数据包的数量会影响覆盖率,也可以通过添加约束constra

31、int来提升覆盖率,或者自定义bins。tr.randomize;/随机化生成数据 ck.sample();/搜集覆盖率 end end endmodule将随机化的次数改为320次后,repeat(320):覆盖率的hit次数变化分布不明显,如下图:可以通过施加权重调整hit的次数分布.2023/9/21 21:32覆盖率验证代码覆盖率+功能覆盖率_代码覆盖率和功能覆盖率_SD.ZHAI的博客-CSDN博客4.3.通过权重dist调整hit次数分布将代码中的constraint约束调整为权重dist处理后,其各个bins的hit次数分布更加均匀,如下所示:constraint data_c1 data dist 0:100:/100,101:9999:/100,10000:12000:/120;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 技术方案

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com