SV中的覆盖率
SV采用CRT的激励形式,而判断验证进度的标准也就是覆盖率(coverage)。
覆盖率的两种指定形式:显式的,直接通过SV来指定出的,如SVA,covergroup。
隐式的,在验证过程中,随"register move"就可以由simulator得到的,如代码覆盖率等。
覆盖率类型:代码覆盖率---由仿真器直接提供,只能表示设计的冗余度,与spec关系不大。(toggle/expression/block)
功能覆盖率---与spec比较来发现,design是否行为正确,需要按verification plan来比较进度。(assertion/covergroup)
断言覆盖率---用于检查几个信号之间的关系,常用在查找错误。
漏洞率-------同一功能验证,运行多个seed,寻找bug
功能覆盖率的两个重要部分是采样的数据和数据被采样的时刻。数据被采样的时刻可以是1)使用wait或@来阻塞赋值,2)使用sample的方法。采样的数据则需要在代
码中加入覆盖组(Covergroup)和仓(Bin),覆盖组可以定义在类中,程序块,模块中。使用覆盖组之前必须先进行实例化。所以一般在类中使用覆盖组时,将
覆盖组的实例化加在类的构造函数new()中。Covergroup和Coverpoint的命名应当尽可能的明确,这样方便检查覆盖率文件。
class Driver_cbs_coverage extends Driver_cbs; event trans_ready; //@event来触发采样
covergroup CovPort; covergroup CovPort @(trans_ready)
....... coverpoint ifc.cb.port;
endgroup endgroup
virtual task post_tx(Transaction tr);
CovPort.sample(); //显示通过callback来回调sample函数,完成采样
endtask
SV支持自动仓的创建,但是更多地适用于2的幂次方,因为这样才有可能100%命中,最大的自动创建仓的数目是64。auto_bin_max限制自动创建仓的个数,SV这
时,会将值域平分在各个仓。
covergroup CovPort; covergroup CovPort;
coverpoint tr.port options.auto_bin_max = 2; //对整个covergroup有效
{options.auto_bin_max=2;} //只对此coverpoint有效 coverpoint tr.port;
endgroup endgroup
用户自定义创建仓(bin),将coverpoint和仓分别明确的命名。
covergroup Covkind;
kind:coverpoint tr.kind{ //用kind为coverpoint命名
bins zero={0}; //自定义一个名为zero的仓,值为0
bins lo={[1:3],5}; //自定义一个名为lo的仓,值为[1:3]或5
bins hi[]={[8:$]}; //自定义$-8个仓,8个值得范围在[8:$]
bins misc=default; //定义一个default的仓,所示所有的剩下的不关心的值
}
endgroup
为覆盖点增加条件控制采样时间段,关键字iff 。
covergroup CoverPort;
coverpoint port_value iff(!bus_if.reset);
endgroup
为枚举类型创建仓(bin),所有枚举类型之外的值都会被忽略,SV默认每个枚举的值一个仓。
typedef enum{INIT, DECODE, IDLE}fsmstate_e;
fsmstate_e pstate, nstate;
covergroup cg_fsm;
coverpoint pstate;
engroup
忽略某个coverpoint的某些值,覆盖率不在检查该值,关键字ignore_bins。 illegal_bins不仅忽略某个coverpoint的值,还会报错。
bit [2:0]low_ports_0_5; bit [2:0]low_ports_0_5;
covergroup CoverPort; covergroup CoverPort;
coverpoint low_ports_0_5{ coverpoint low_ports_0_5{
options.auto_bin_max=4; options.auto_bin_max=4;
ignore_bins hi={[6,7]}; illegal_bins hi={[6,7]};
} }
endgroup endgroup
使用cross关键字创建交叉覆盖率。 //使用串联值的方式来替换交叉覆盖
covergroup Covport; covergroup CrossBinnames;
port:coverpoint tr.port a:coverpoint tr.a{bins a0={0}; bins a1={1};}
{bins port[] = {[0:$]};} b:coverpoint tr.b{bins b0={0}; bins b1={1};}
kind:coverpoint tr.kind ab:cross a,b {bins a0b0=binsof(a.a0)&&binsof(b.b0);
{bins zero={0}; bins a1b0=binsof(a.a1)&&binsof(b.b0);
bins lo={[1:3],5}; //注释同上,只创建一个仓 bins b1=binsof(b.b1);}
bins hi[]={[8:$]}; ab:coverpoint{tr.a, tr.b} //用串联值得方式来替换
bins misc=default;} {bins a0b0={2'b00};bins a1b0={2'b10};}
cross kind,port{ endgroup
ignore_bins hi=binsof(port) intersect{7}; //去除port这个coverpoint的仓7
ignore_bins md=binsof(port) intersect{0} &&
binsof(kind) intersect{[9:11]};
ignore_bins lo=binsof(kind.lo);} //去除kind这个coverpoint的lo仓
endgroup
对于单个的covergroup,它的覆盖率是由简单覆盖点和交叉覆盖点两部分组成的,可以通过关键字option.weight来控制整体的覆盖率倾向。
covergroup CovPort;
Kind:coverpoint tr.kind {bins zero={0}; option.weight=5;}
port:coverpoint tr.port {bins port={0}; option.weight=0;} //计算该covergroup的覆盖率时,忽略该coverpoint
cross kind,port {option.weight = 10;}
endgroup
当需要编写的覆盖组之间十分接近时,可以写出一个通用的覆盖组,然后通过new函数或ref的形式来传递参数。
bit[2:0]port; bit[2:0]port_a,port_b;
covergroup CoverPort (int mid); covergroup CoverPort (ref bit[2:0]port, input int mid); //定义ref形式
coverpoint port{bins lo={[0:mid-1]}; coverpoint port{bins lo={[0:mid-1]};
bins hi={mid:$};}; bins hi={mid:$};};
endgroup endgroup
CoverPort cp; //定义新的covergroup CoverPort cpa, cpb; //定义新的covergroup
initial cp=new(5); //例化covergroup并传递参数 initial begin cpa=new(port_a,4); //例化covergroup并传递参数
............. cpa=new(port_b,4);
设置某个covergroup的inst_name,set_inst_name();
使用VCS等仿真工具可以追溯到每个实例的覆盖率,但此时covergroup中应该添加声明。
covergroup CoverLength(string comment);
coverpoint tr.length;
option.per_instance=1; //指定需要单个实例的覆盖率
option.comment=$psprintf("%m");
/或者指定自己的注释
option.comment = comment;
endgroup
CoverLength cp_lo = new("Low port numbers");
option.at_least,在无法有效的建立bin时,通过该设置保证bin被击中N次后,就算是覆盖完全。
还有两个重要的命令:option.cross_num_print_missing = N; // 让仿真工具给出所有的仓,柏阔那些没有被命中的仓(默认不会报出)
option.goal=N; // 设置覆盖组或覆盖点的目标 如90等
在长仿真过程中:
$get_coverage:Covergroup::get_coverage()/cgInst:Covergroup()得到某个覆盖组或者inst的coverage
$get_inst_coverage:得到特定inst的覆盖率。
SV中的覆盖率的更多相关文章
- SV中的随机化
SV搭建testbench的关键概念:CRT(constraint random test),测试集的随机化. 由于对象class由数据和操作组成,所以对数据的随机化一般放在一个class内.(对环境 ...
- SV中的线程
SV中线程之间的通信可以让验证组件之间更好的传递transaction. SV对verilog建模方式的扩展:1) fork.....join 必须等到块内的所有线程都执行结束后,才能继续执行块后的语 ...
- SV中的Interface和Program
Interface:SV中新定义的接口方式,用来简化接口连接,使用时注意在module或program之外定义interface,然后通过'include来添加进工程. interface arb_ ...
- SV中的task和function
SV中class的properties和methods默认都是public的,但是可以声明为local和protected. 一个properties声明为local类型的,则只在该class中的me ...
- SV中的数据类型
Verilog-1995中规定的数据类型有:变量(reg), 线网(wire), 32位有符号数(integer), 64位无符号数(time), 浮点数(real). SV扩展了reg类型为logi ...
- SV中的OOP
OOP:Object-Oriented Programming,有两点个人认为适合验证环境的搭建:1)Property(变量)和Method(function/task)的封装,其实是BFM模型更方便 ...
- VCS中的覆盖率分析
VCS在仿真过程中,也可以收集Coverage Metric.其中覆盖率类型有: 1)Code Coverage:包括control_flow和value两部分的coverage,line_cover ...
- NC_Verilog中的工具ICC
Cadence中的Incisive Comprehensive Coverage(ICC) solusion提供在仿真中的覆盖率分析. ICC中的覆盖率类型有两大类: 1)Code Coverage: ...
- SV搭建验证环境
1)首先定义纯虚类Sv_object,主要实现下边两个function: 定义local static 变量nextobjectID; 虚方法 virtual function void copy(S ...
随机推荐
- 数组和字符串的基础题目学习(EPI)
学习的速度有些慢,脑袋转动的频率有些不是很高.不过今天的效率我觉得还是可以,应该不能称效率吧,就是整个感觉不错,感觉自己补充了很多的知识.其实G家和F家败了之后不知道看看算法题对接下来的找工作帮助是否 ...
- Docker监控:google/cadvisor
Docker自带了容器监控功能,可以对容器进行相关的性能监控,指标查看 主要包括: 主机的CPU情况和使用量 主机的内存情况和使用量 主机的本地镜像情况 主机的容器运行情况 常规使用docker ps ...
- jenkins之另辟蹊径实现根据svn项目实现智能选择
项目要求,根据svn选择的trunk或branches及tags里的各分支,动态选择参数.一开始认为很简单,直接用jenkins中的List Subversion tags插件及active choi ...
- iOS - 原生的CIFilter生成二维码和条形码
使用CIFilter可以不引入任何第三方库,就可以生成想要的二维码和条形码,今天简单的介绍一下使用CIFilter生成二维码和条形码.系统CIFilter生成的二维码和条形码的大小有时并不能满足需求, ...
- R生存分析AFT
γ = 1/scale =1/0.902 α = exp(−(Intercept)γ)=exp(-(7.111)*γ) > library(survival) > myfit=survre ...
- 浅析JSONP
什么是JSONP? JSONP是JSON with Padding的略称.它是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式 ...
- Centos6.10安装tomcat
1. 下载tomcat 2. 解压到相应的路径下 tar -xzvf apache-tomcat-8.5.34.tar.gz 3. 启动tomcat # 进入"apache-tomca ...
- 2018-2019-2 20165330《网络对抗技术》Exp6 信息搜集与漏洞扫描
目录 基础问题 相关知识 实验目的 实验内容 实验步骤 实验总结与体会 实验目的 掌握信息搜集的最基础技能与常用工具的使用方法. 返回目录 实验内容 各种搜索技巧的应用 使用搜索引擎 搜索网址目录结构 ...
- codeforces 883H - Palindromic Cut - [字符串处理]
题目链接:http://codeforces.com/problemset/problem/883/H Time limit: 3000 ms Memory limit: 262144 kB Koly ...
- docker daemon configuration
于 Docker的分层镜像,除了 aufs,docker还支持btrfs, devicemapper和vfs,你可以使用 -s 或 –storage-driver= 选项来指定相关的镜像存储.在Ubu ...