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 ...
随机推荐
- XmlSerializer的GenerateTempAssembly性能问题例外
XmlSerializer的两个构造函数不会出现每次构造都创建TempAssembly的性能问题,其内部做了缓存. public XmlSerializer(Type type) public Xml ...
- parted分区脚本
#!/bin/bash #Used to fomat 6 disks PATH=/bin:/sbin:/usr/bin:/usr/sbin export PATH disk_to_parted=&qu ...
- 用mongoose实现mongodb增删改查
//用户 var mongoose = require("mongoose"), setting = require("./setting"); //配置连接数 ...
- C++ Error: error LNK2019: unresolved external symbol
在某工程中新添加了文件x.cu与x.hpp,实现了一些功能,最后编译整个工程的时候就出现了这个问题: error LNK2019: unresolved external symbol 这是链接错误, ...
- 无约束优化方法(梯度法-牛顿法-BFGS- L-BFGS)
本文讲解的是无约束优化中几个常见的基于梯度的方法,主要有梯度下降与牛顿方法.BFGS 与 L-BFGS 算法. 梯度下降法是基于目标函数梯度的,算法的收敛速度是线性的,并且当问题是病态时或者问题规模较 ...
- pandas category数据类型
实际应用pandas过程中,经常会用到category数据类型,通常以string的形式显示,包括颜色(红,绿,蓝),尺寸的大小(大,中,小),还有地理信息等(国家,省份),这些数据的处理经常会有各种 ...
- 把Asp.Net Core 2.0部署在Linux上,使用Nginx代理服务器,并且用Systemctl命令以服务的方式监听项目
在Linux上部署.net core 2.0程序: 第一步:配置Nginx代理 在/etc/nginx/sites-available/default 中添加 server { listen ; lo ...
- POJ 1417 - True Liars - [带权并查集+DP]
题目链接:http://poj.org/problem?id=1417 Time Limit: 1000MS Memory Limit: 10000K Description After having ...
- KMP算法小记
Knuth-Morris-Pratt算法: 转载来自http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_ ...
- MyBatis学习(一)一个简单的例子
mybatis入门例子 开发步骤: 1.创建java工程 2.加入jar包(依赖包.驱动包) 3.创建sqlMapConfig.xml 4.创建数据库,数据库表USER_C,插入测试记录 5.创建PO ...