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 ...
随机推荐
- PhpDocumentor
phpDocument是一个通用的生成PHP文档的工具,他本身也是用PHP写的,跟JAVADoc有些相似,但他有不同于PHPDoc,他比PHPDOC要快,而且能够解析的PHP范围更广,他本身包含了11 ...
- SQLite 3的中文读写
调用sqlite3_open函数默认创建的数据库encoding=UTF-8,执行sqlite3_exec时需要将对应的字符串转换为UTF-8格式多字节字符串.比如: sqlite3* db; aut ...
- Android 简单计算器实现源码
1.string.xml代码 <?xml version="1.0" encoding="utf-8"?> <resources> &l ...
- 【BZOJ5090】组题 分数规划
[BZOJ5090]组题 Description 著名出题人小Q的备忘录上共有n道可以出的题目,按照顺序依次编号为1到n,其中第i道题目的难度系数被小Q估计为a_i,难度系数越高,题目越难,负数表示这 ...
- [工具] 知网(CNKI)文献下载工具
https://github.com/amyhaber/cnki-downloader 用于免费搜索,下载CNKI上的各类文献资料
- ios中的coredata的使用
Core Data数据持久化是对SQLite的一个升级,它是iOS集成的,在说Core Data之前,我们先说说在CoreData中使用的几个类. (1)NSManagedObjectModel(被管 ...
- 在eclipse中编辑linux上的项目
以前在linux的上接口自动化项目都是使用notepad++或SVN下载到本地后再上传来完成功做,但在调试时非常麻烦. 查看了下在eclipse中有一个非常好用的插件Remote Systems,可以 ...
- Java虚拟机五 堆的参数配置
堆空间是Java进程的重要组成部分,几乎所有的应用相关的内存空间都和堆有关. 1.最大堆和初始堆的设置 当Java程序启动时,虚拟机就会分配一块初始堆空间,使用参数 -Xms 指定这块空间的大小.一般 ...
- JNUOJ 1184 - 科学计数法
花了半个小时,强行拗出一长串又臭又长的代码,把所有情况都分了(该分的,不该分的……都分了……) #include<cstdio> #include<cstring> #incl ...
- B. Berland National Library---cf567B(set|模拟)
题目链接:http://codeforces.com/problemset/problem/567/B 题意:题目大意: 一个计数器, +号代表一个人进入图书馆, -号代表一个人出去图书馆. 给一个 ...