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中的覆盖率的更多相关文章

  1. SV中的随机化

    SV搭建testbench的关键概念:CRT(constraint random test),测试集的随机化. 由于对象class由数据和操作组成,所以对数据的随机化一般放在一个class内.(对环境 ...

  2. SV中的线程

    SV中线程之间的通信可以让验证组件之间更好的传递transaction. SV对verilog建模方式的扩展:1) fork.....join 必须等到块内的所有线程都执行结束后,才能继续执行块后的语 ...

  3. SV中的Interface和Program

    Interface:SV中新定义的接口方式,用来简化接口连接,使用时注意在module或program之外定义interface,然后通过'include来添加进工程. interface  arb_ ...

  4. SV中的task和function

    SV中class的properties和methods默认都是public的,但是可以声明为local和protected. 一个properties声明为local类型的,则只在该class中的me ...

  5. SV中的数据类型

    Verilog-1995中规定的数据类型有:变量(reg), 线网(wire), 32位有符号数(integer), 64位无符号数(time), 浮点数(real). SV扩展了reg类型为logi ...

  6. SV中的OOP

    OOP:Object-Oriented Programming,有两点个人认为适合验证环境的搭建:1)Property(变量)和Method(function/task)的封装,其实是BFM模型更方便 ...

  7. VCS中的覆盖率分析

    VCS在仿真过程中,也可以收集Coverage Metric.其中覆盖率类型有: 1)Code Coverage:包括control_flow和value两部分的coverage,line_cover ...

  8. NC_Verilog中的工具ICC

    Cadence中的Incisive Comprehensive Coverage(ICC) solusion提供在仿真中的覆盖率分析. ICC中的覆盖率类型有两大类: 1)Code Coverage: ...

  9. SV搭建验证环境

    1)首先定义纯虚类Sv_object,主要实现下边两个function: 定义local static 变量nextobjectID; 虚方法 virtual function void copy(S ...

随机推荐

  1. 部署OpenStack问题汇总(六)-- OpenStack入门需要知道的概念

    本博客已经添加"打赏"功能,"打赏"位置位于右边栏红色框中,感谢您赞助的咖啡. 一.网络问题-network 更多网络原理机制可以参考<OpenStack ...

  2. hihoCoder挑战赛28 题目2 : 二进制翻转

    题目2 : 二进制翻转 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 定义函数 Rev(x) 表示把 x 在二进制表示下翻转后的值 例如: Rev(4)=1,因为 4 ...

  3. 应急响应--记录一次漏洞紧急处理中意外发现的挖矿木马(Shiro反序列化漏洞和ddg挖矿木马)

    背景 某公司线上服务器意外发现一个Apache Shiro 反序列化漏洞,可以直接GetShell.出于做安全的谨慎,马上出现场应急,确认漏洞.该漏洞存在在cookie字段中的rememberMe字段 ...

  4. 一篇博客搞定redis基础

    redis简介 redis 一款高性能key-value数据库,实际上多用作缓存队列或者消息分发(celery),但是最常常被用来做缓存. redis安装 源码安装 $ wget http://dow ...

  5. 教你如何将word中的表格完美粘贴到ppt中

    经常操作办公软件的人一定有一个困惑,ppt本身表格编辑能力似乎很弱,如果从word里直接将一个编辑好的表格复制粘贴到ppt中,整个表格一定会发生让你没有预料的变化,还得重新花老大的劲去重新编辑,有人屛 ...

  6. 使用eclipse执行maven-release-plugin插件发布jar异常问题(.project)(Cannot prepare the release because you have local modifications )

    开发是用的eclipse,里面有工程文件.project这种文件,运行release:prepare的时候报异常: Cannot prepare the release because you hav ...

  7. Olivia Palermo & Johannes Huebl 模范情侣

    男才女貌,模范情侣-- 以后引用情侣时就用这个图了~ ref: http://bbs.55bbs.com/thread-8250584-1-1.html

  8. Spark特征(提取,转换,选择)extracting, transforming and selecting features

    VectorAssembler字段转换成特征向量 import org.apache.spark.ml.feature.VectorAssembler val colArray = Array(&qu ...

  9. django之admin设置

    Django自带的后台管理是Django明显特色之一,可以让我们快速便捷管理数据.后台管理可以在各个app的admin.py文件中进行控制.以下是我最近摸索总结出比较实用的配置.若你有什么比较好的配置 ...

  10. Print or Cout an Unsigned Char Variable 打印无符号字符

    在C++中,unsigned char用来表示一个字节,也就是8位大小的值,那么我们如何来打印出其值呢,用cout直接打印会乱码,我们可以通过下面两种方法来打印: cout << stat ...