【SystemVerilog基础】9.功能覆盖率

覆盖率是衡量设计验证完备性的重要指标,包括代码覆盖率和功能覆盖率。代码覆盖率关注执行的代码行数、路径、翻转和状态机状态,而功能覆盖率则侧重验证设计功能的全面性。覆盖组和coverpoint是收集覆盖率数据的关键,通过交叉覆盖率和条件覆盖率可以更细致地评估设计。在验证过程中,应不断优化测试,确保达到预设的覆盖率目标。
摘要由CSDN通过智能技术生成

覆盖率类型

什么是覆盖率?覆盖率是衡量设计验证完备性的一个通用词语,覆盖率工具会在仿真过程中收集信息,通过后续处理得到覆盖率报告,通过这个报告会找到覆盖之外的盲区。采取后续修改测试或者创建新的测试可以填补这些盲区,这是一个可以不断迭代的过程,直到覆盖率达到我们的要求为止。

覆盖率反馈回路
覆盖率反馈回路

 可以使用一个反馈回路来分析覆盖率的结果,并决定采取哪种行动来达到百分百的覆盖率,优先考虑的是使用更多的种子来运行现有的测试程序,如果更多的种子对覆盖率增长没有帮助的时候,就需要建立新的约束,只有在必要的时候才会使用创建定向测试。

代码覆盖率

不添加任何额外的HDL代码,工具会通过分析源代码和增加隐藏代码来自动完成代码覆盖率的统计,测试完成以后代码覆盖率工具便会创建相应的数据库,覆盖率数据被转换为以下的可读格式。代码覆盖率是衡量验证进展的最简易的方式。

行覆盖率:多少行代码已经被执行。

路径覆盖率:在穿过代码和表达式的路径中有哪些被执行过。

翻转覆盖率:哪些单位比特变量的值为0后者为1。

状态机覆盖率:状态机有哪些状态和状态转换已经被访问过。

代码覆盖率的最终结果用于衡量执行了设计中的多少代码,所以关注点应该放在设计代码的分析上,而不是测试平台。没有经过测试的代码可能含有隐藏的硬件漏洞,即使代码覆盖率到达了百分百,也并不意味着验证工作的完成,但是代码覆盖率达到百分百是验证工作性的必要条件

断言覆盖率

断言覆盖率是用于一次性的或者一段时间对一个或者多个设计信号在逻辑上或者时序上的声明性代码,断言最常用于查找错误,例如两个信号是否应该互斥,或者请求与许可信号之间的时序等等,一旦检查到问题,仿真就会立刻停止。

有些断言可以用于查找感兴趣的信号值或者设计状态,可以使用cover property来测量这些感兴趣的信号值或者状态是否翻转。仿真结束以后,仿真工具可以自动生成断言覆盖率数据,断言覆盖率数据和其他覆率数据会被集成在同一个覆盖率数据中。

漏洞率曲线

在开始创建测试的时候,通过观察就可以发现很多漏洞,当设计逐渐稳定的时候,就需要利用自动化的检查方法来协助发现可能的漏洞,即使在临近流片的时候漏洞率会下降,有望为零,但是验证工作仍然不能结束。每当漏洞率下降的时候,就应该寻找各种不同的方法去测试可能的边界情况。楼浮动率每周都会不同,这和很多因素相关。

功能覆盖率

验证的目的就是确保设计在实际环境中的行为正确,验证计划列出的相应功能应该如何激励、验证和测量都应该和功能描述文档相匹配,收集哪些功能已经被覆盖其实就是在收集设计的覆盖率。如果某个功能在设计中被遗漏,代码覆盖率可能发现不了这个问题,但是功能覆盖率可以发现。改进功能覆盖率一个简单的方法是仅仅增加仿真时间或者尝试新的随机种子。

 每一次仿真就会产生一个带有覆盖率信息的数据库,所有的信息整合到一起就可以得到功能覆盖率,可以衡量整体的进展程度。通过分析覆盖率数据得到修改回归测试集的方法:如果覆盖率在稳定增长,添加新的种子或者加长测试就可以了;覆盖率增长缓慢,添加额外的约束来产生更多激励;覆盖率停止增长,说明某些测试点没有被覆盖到,那么就需要创建新的测试了;如果覆盖率为百分百但是依然有新的设计漏洞,那么覆盖率可能没有覆盖到某些设计功能区域。

功能覆盖率策略

完备的覆盖率测量结果和漏洞增长曲线,可以帮助确认设计是否被完整的验证过。 如果功能覆盖率低但代码覆盖率高,这说明验证计划不完,测 测试没有执行设计的所有代码。 如果代码覆盖率高但功能覆盖率低,这说明即使测试平台很好地执行了设计的所有代码,但是测试还是没有把设计定位到所有感 兴趣的状态上。 最终的目标是同时驱动高的代码覆盖率和功能覆盖率。

覆盖组

覆盖组与类相似,在定义后可以实现多次实例化,covergroup可以包含一个或者多个coverpoint,都是在同一时间进行采集。covergroup可以定义在类里面,也可以定义在interface或者module里面,covergroup可以采样任何可见的变量:程序变量、接口信号、设计端口等等。一个类里面可以包含多个covergroup,当拥有多个独立的covergroup时,每个covergroup可以根据需要自行使能或者停止。每个covergroup可以定义氮素的采样触发事件,允许从多个源头收集数据,前提是covergroup需要被例化。

covergroup由采样的数据和数据被采样的事件构成,当两个条件都具备的时候就会触发covergroup,这个过程可以通过使用sample()函数来完成,或者采用阻塞表达式、wait、@来实现信号或者事件上的阻塞。

sample()方法:希望在代码中显示的触发covergroup采样,或者不存在采样时刻的信号和事件,或者一个covergroup被例化了多个实例且需要单独触发

 

阻塞语句方法:希望借助已有事件后者信号触发covergroup

 数据采样

数据采样的对象是变量或者表达式,SV会创建很多的“bin”来记录每个数值被捕捉到的次数,bin是什么东西?是衡量功能覆盖率的基本单位。

covergroup中可以定义很多个coverpoint,coverpoint里面可以自己定义或者SV自动定义很多个cover bin,每当covergroup采样,SV都会在cover bin中留下标记,用来记录采样时变量的数值和匹配的cover bin。仿真之后就会生成覆盖率报告内容,可以通过分析工具来进行读取。

coverpoint和bin

覆盖率的计算:首先需要确定可能数值的个数,称之为域,然后进行采样值的数目除以bin的数目。例如:一个三比特变量的域为0:7,一般自动分配的是8个bin,假设仿真过程中有7个值被采样到,那么coverpoint的覆盖率为7/8。最终所有的coverpoint的覆盖率构成covergroup的覆盖率,所有的covergroup构成整体的功能覆盖率。

bin的创建

bin的创建分为自动创建和用户自定义,如果采样变量的范围过大而且还没有指定bin,那么系统会默认分配64个bin,实际操作中自动创建bin的方法不建议使用,推荐用户自定义。用户可以通过covergroup的选项auto_bin_max来指定自动创建bin的最大数值。

 命名coverpoint和bin

 条件覆盖率

可以使用关键词iff给covergroup添加条件,常用于在复位期间关闭覆盖以忽略不合理的条件出发。除此之外还可以使用start和stop来直接控制covergroup各个独立的实例。

 翻转覆盖率

covergroup可以用来记录变量的跳转情况,还可以确定任何长度的翻转次数。

 在状态和翻转中使用通配符

可以使用关键字wildcard来创建多个状态或者翻转。在表达式中,任何的X、Z或者?都会被当做0/1的通配符

 忽略bin

在某些covergroup中可能无法得到全部的阈值,对此我们可以使用ignore_bins来进行排除,目的是使得他们不会计入coverpoint的覆盖率中。

 非法bin

部分采样值如果出现的话应该报错,可以使用illegal_bins对特定的bin进行标示。

 交叉覆盖率

coverpoint是记录单个变量或者表达式的观测值,如果需要记录某一个时刻多个变量的组合情况,需要使用交叉覆盖率cross,cross只允许带coverpoint或者简单的变量名

排除部分cross bin

可以通过ignore_bins、binsof和intersect分别指定coverpoint和值域,目的是清除很多不关心的cross bin

 

精细的交叉覆盖率指定

 总体覆盖率的度量中排除部分覆盖点

方法就是设置权重

交叉覆盖的替代方法

三种方法:使用仓名+使用binsof+使用串联值,如果你的覆盖点都有事先定义好的仓并且你希望使用它们来创建交叉覆盖仓,可以使用例9.35的风格。如果你需要创建交叉覆盖仓但覆盖点没有事先定义好的仓,那么可以使用例9.36的形式。如果你想要最简洁的格式,建议使用串联值来代替交叉覆盖。

 

 

 

覆盖选项

对一个covergroup例化很多次,那么默认情况下SV会把所有实例的覆盖率合并到一起,如果需要单独列出每个实例的覆盖率,需要进行覆盖选项设置。标红的意思是说例化了多次的每一个实例都需要单独计算

对于多个covergroup实例,可以通过参数来对每一个实例传入单独的注释,这些注释最终会显示在覆盖率数据的总结报告中。comment将注释插入到代码中。

 覆盖阈值

默认情况下,数值采样一次就会被记入有效的bin,可以通过修改at_least来修改每个bin最少的采样次数,如果低于at_least数值,就不会被记入bin中。尤其需要注意的是option.at_least可以放在covergroup中声明来影响所有的coverpoint,也可以放在coverpoint中只声明该coverpoint中的所有bin

打印空仓 

缺省情况下,覆盖率报告只会给出带有采样值的仓,cross_num_print_missing选项可以使得仿真和报告工具中给出所有的仓,尤其是那些没有命中的仓,可以设置的大一些,但是不要超出你愿意阅读的部分。

覆盖率目标

一个covergroup或者一个coverpoint的目标是百分百覆盖率,但是事在人为,也可以修改为低于百分百的目标。

覆盖数据的分析 

sample():采样

get_coverage()/get_inst_coverage():获取覆盖率,但会0-100的real数值

set_inst_name(string):设置covergroup的名称

start()/stop():使能或者关闭覆盖率的收集

$get_coverrage():得到总体的覆盖率

covergroup_inst.get_inst_coverage()来获得单个covergroup实例的覆盖率

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值