目录

0.前言

1.coverage 2种采样方法

1.1 sample

1.1.1在program中采样

1.1.2在class中采样

1.2 @event

2.Coverage数据采样方法

2.1功能覆盖率的计算方法

2.2信号的常规采样

2.3枚举类型的采样

2.4条件覆盖率

2.5翻转覆盖率

2.6wildcard覆盖率

2.7忽略数值

2.8不合法的仓

3.交叉覆盖率

3.1忽略交叉仓


0.前言

覆盖组(covergroup)与类相似,一次定义后可多次实例化

covergroup可以包含一个或者多个coverpoint,且全都在同一时间采集

covergroup可以定义在类中,也可以定义在interface或者module中

covergroup可以采样任何可见的变量,例如程序变量、接口信号或者设计端口

一个类里可以包含多个covergroup,当拥有多个独立的covergroup时,每个covergroup可以根据需要自行使能或者禁止,每个covergroup可以定义单独的触发采样事件,允许从多个源头收集数据,covergroup必须被例化才可以用来收集数据

1.coverage 2种采样方法

1.1 sample

1.1.1在program中采样

在program块儿中使用covergroup时,需要先声明句柄再实例化才可以采样。

class Transaction;//创建事务rand bit[31:0] data;rand bit[2:0] port;
endclassprogram automatic test(busifc.TB ifc);coverage CovPort;//①创建覆盖组coverpoint ifc.port;//采样接口port信号endgroupinitial beginTransactiob tr;CovPort ck;//②为覆盖组声明句柄ck=new;//并实例化tr=new;repeat(32) beginassert(tr.randomize);ifc.port<=tr.port;ifc.data<=tr.data;ck.sample;//③赋值之后进行采样@ifc.clk;end    end
endprogram

1.1.2在class中采样

在类中使用covergroup采样,无需声明句柄就可直接创建对象采样。

class Transaction;rand bit[31:0] data;rand bit[2:0] port;
endclassclass Transactor;Transactiob tr;mailbox mbx_in;virtual busifc ifc;coverage CovPort;coverpoint ifc.port;endgroupfunction new(mailbox mbx_in,virtual busifc ifc);CovPort=new;this.mbx_in=mbx_in;this.ifc=ifc;endfunctiontask main;mbx_in.get(tr);ifc.port<=tr.port;ifc.data<=tr.data;CovPort.sample;endtask
endprogram

1.2 @event

与直接调用sample()相比,使用事件触发的好处在于你能够借助已有的事件,来决 定何时开始收集数据。

event trans_ready;
covergroup CovPort @(trans_ready);coverpoint ifc.cb.port;
endgroup

2.Coverage数据采样方法

2.1功能覆盖率的计算方法

首先先看下面一段代码:

bit[31:0] addr;//假设这里有一个属于tr中的信号
covergroup address;coverpoint tr.addr;
endgroup

如果没有别的声明,则系统自动为这2^32个数建立64个,并把这些数据平均分给这64个仓,经过仿真后 ,如0~67108863这些数放在了第一个仓中,当这里面任意一个或者多个数被采样到,则这个仓就是被“打到”了,如果这64个仓有32个仓被打到了,则这个coverpoint的覆盖率就是32/64=50%;所有cover point的覆盖率组合在一起就是这个covergroup的覆盖率,所有covergroup的覆盖率组合在一起就是你定义的整体的功能覆盖率

2.2信号的常规采样

即上面的代码,对所采样的信号进行自动建仓采样;但显然如果这个信号是一个32bit的data,则将这2^32个数全仿真采样显然没有必要,事实上只需要关注2个边界值和各个位的正常翻转就行了,这里我们可以自定义仓的个数:

bit[31:0] addr;//假设这里有一个属于tr中的信号
covergroup address;options.auto_bin_max=2;//控制这个组的最大建仓数为2,对这个组中所有的point生效coverpoint tr.addr{options.auto_bin_max=2};//控制这个点的最大建仓数为2
endgroup

当然为了实现上面所说的,我们可以自定义仓:

bit[31:0] data;//假设这里有一个属于tr中的信号
covergroup DATA;TRANS_DATA:coverpoint tr.data{ //前面的是为了给该coverpoint自定义名字bins zero={'h0};bins full={'hffff_ffff};bins zero_one={'haaaa_aaaa};bins one_zero={'h5555_5555};bins others=default;//其余的值放入这个仓中}
endgroup

2.3枚举类型的采样

typedef enum{IDLE,SETUP,BUSY} fsmstate_e;
fsmstate_e pstate;covergroup cg_fsm;coverpoint pstate;//为每个枚举类型创建一个仓coverpoint pstate{bins p={0,1};//将前两个枚举值放入一个仓中}
endgroup

2.4条件覆盖率

covergroup CoverPort;coverpoint port iff(!bus_if.reset);//表明当reset为0使该coverpoint才会采样
endgroup

2.5翻转覆盖率

covergroup CoverPort;coverpoint port1{bins t1=(0=>1),(0=>2),(0=>3);//0到1,0到2,0到3}coverpoint port2{bins t2=(1,2=>3,4);//1到2,1到4,2到3,2到4}
endgroup

2.6wildcard覆盖率

这个方法可以让表达式中的任何x,z,?被当成0/1的通配符:

bit[2:0] port;
covergroup CoverPort;coverpoint port{wildcard bins even={3'b??0};wildcard bins odd={3'b??1};}
endgroup

2.7忽略数值

bit[2:0] low_ports_0_5;
covergroup CoverPort;coverpoint low_ports_0_5{ignore_bins hi={[6:7]};//忽略掉这个信号6,7两个值}
endgroup

2.8不合法的仓

有些数值不仅不应该出现,当出现了还应该报错

bit[2:0] low_ports_0_5;
covergroup CoverPort;coverpoint low_ports_0_5{illegal_bins hi={[6:7]};//采样到了6,7时会报错}
endgroup

3.交叉覆盖率

上面我们对单个信号采用多种方式的采样,但经常我们希望知道一些组合情况,如不同地址的数据发送情况,这时我们需要知道地址0的data发送的数据情况,地址1的data数据发送情况,等等,这时就引入了交叉覆盖率:

bit[3:0}  addr;
bit[31:0] data;//假设这里有一个属于tr中的信号covergroup DATA;TRANS_ADDR:coverpoint tr.addr{bins zero_a={'h0};bins one_a={'h1};};TRANS_DATA:coverpoint tr.data{ //前面的是为了给该coverpoint自定义名字bins zero={'h0};bins full={'hffff_ffff};bins zero_one={'haaaa_aaaa};bins one_zero={'h5555_5555};bins others=default;//其余的值放入这个仓中}TRANS_ADDR_X_TRANS_DATA:cross TRANS_ADDR,TRANS_DATA;//这会建立2x5=10个仓
endgroup

3.1忽略交叉仓

同样的,对于一些交叉仓我们不care,则需要忽略掉:

bit[3:0] kind;
bit[2:0] port;covergroup Covport;port1:coverpoint tr.port{bins port={[0:$]};option.weight=0;//可以通过设定weight来设定该point在总体覆盖率占的分量,为0则不计算覆盖率}kind1:coverpoint tr.kind{bins zero={0};bins lo={[1:3]};bins hi[]={[8:$]};//8个独立的仓代表8-15bins misc=default;}kind_port:cross kind,port{ //注意这里交叉的是kind和port的值,会有128个仓ignore_bins hi=binsof(port)intersect{7};//忽略掉任何kind值和port=7的交叉,忽略掉16个仓ignore_bins md=binsof(port)intersect{0}&&binsof(kind)intersect{[9:11]};//忽略掉port=0和kind=9,10,11的交叉,忽略掉3个仓ignore_bins lo=binsof(kind.lo);//忽略掉kind中lo仓和port值的交叉,忽略掉3x8=24个仓}//可以更精细化的写交叉覆盖率kind1_port1:cross port1,kind1{ //这里交叉的是上面的2个coverpoint,如果没有下面的自建仓则有4个仓bins name1=binsof(port1.port)&&binsof(kind1.zero);//定义一个仓是port1中port仓和kind1中zero仓的交叉bins name2=binsof(kind1.hi);//定义一个仓是port1和kind的hi仓的交叉}
endgroup

binsof和intersect分别制定的是cover point和值域 ,对仓做操作用binsof,对值做操作用binsof()intersect{}

SV学习笔记—覆盖组及覆盖率数据采样方法相关推荐

  1. SV学习笔记—结构体及枚举类型及字符串

    目录 1.结构体 1.1 压缩结构体 1.2 非压缩结构体 1.3联合结构体 2.枚举类型 3.字符串 1.结构体 Verilog的最大缺陷之一是没有数据结构,SV中可以使用struct语句创建结构, ...

  2. 2023-01-29 学习笔记:常见28种数据分析模型

    2023-01-29 学习笔记:常见28种数据分析模型 知乎上的一篇文章,虽然之前对深度学习相关模型有所了解,但通过这篇文章了解了更多模型的应用场景,同时也知道了日常一共有多少种实用模型. Excel ...

  3. tensorflow学习笔记——使用TensorFlow操作MNIST数据(1)

    续集请点击我:tensorflow学习笔记--使用TensorFlow操作MNIST数据(2) 本节开始学习使用tensorflow教程,当然从最简单的MNIST开始.这怎么说呢,就好比编程入门有He ...

  4. Python学习笔记_1_基础_2:数据运算、bytes数据类型、.pyc文件(什么鬼)

    Python学习笔记_1_基础_2:数据运算.bytes数据类型..pyc文件(什么鬼) 一.数据运算 Python数据运算感觉和C++,Java没有太大的差异,百度一大堆,这里就不想写了.比较有意思 ...

  5. Python学习笔记:用Python获取数据(本地数据与网络数据)

    Python学习笔记:用Python获取数据(本地数据与网络数据) 一.用Python获取本地数据 读写文件(三种基本模式:r, w, a) 1.写文件 2.读文件

  6. ROS学习笔记十一:ROS中数据的记录与重放

    ROS学习笔记十一:ROS中数据的记录与重放 本节主要介绍如何记录一个正在运行的ROS系统中的数据,然后在一个运行的系统中根据记录文件重新产生和记录时类似的运动情况.本例子还是以小海龟例程为例. 记录 ...

  7. Oracle中用system存数据,【学习笔记】Oracle表空间 数据存放system表空间影响数据库性能...

    天萃荷净 分享一篇,关于Oracle数据库system表空间研究,不能将用户数据存放在system表空间的原因 为什么不建议客户把业务数据存放到SYSTEM表空间中,一直想通过试验的数据来说明问题,今 ...

  8. 面向对象的编程思想写单片机程序——(3)学习笔记 之 程序分层、数据产生流程

    系列文章目录 面向对象的编程思想写单片机程序--(1)学习笔记 之 程序设计 面向对象的编程思想写单片机程序--(2)学习笔记 之 怎么抽象出结构体 面向对象的编程思想写单片机程序--(3)学习笔记 ...

  9. SV学习笔记—类型转换

    1.静态转换 静态转换操作不对转换值进行检查,格式是type'(value): program test;initial begin$display("int'(42+1.1) is&quo ...

最新文章

  1. 关于比特币现金升级问题讨论不断升温
  2. LoadRunner的参数化功能分享
  3. Notepad++连接VMWare中Linux只能看到/root目录
  4. 6000字说透,如何做好产品「适老化」!
  5. 小汤学编程之JavaEE学习day10——Spring
  6. 【转载】推荐5款超实用的.NET性能分析工具
  7. oracle trigger 延迟执行_springboot中定时任务执行Quartz的使用
  8. Kettle数据源连接配置
  9. 工商银行计算机网银不能连接u盾,工商银行网银U盾无法识别怎么办
  10. MT6573芯片资料集锦MT6575入门手册 V0.2
  11. 鸿蒙无锡有什么特产,无锡太湖鼋头渚十大特产
  12. 移动宽带套餐介绍_中国移动宽带最新套餐介绍
  13. 怎么使用股票委托下单接口?
  14. 美术向技美入门课——庄懂的技术美术入门课(美术向)01
  15. 小巧的本地缓存Jodd
  16. ps-色彩模式与图像色彩调整
  17. python笔试题奥特曼打怪兽_一个python面试笔试题
  18. 商品库存管理系统网站php模板,进销存产品库存管理系统 v2.22源码
  19. http、https加密过程
  20. 树莓派装linux教程,树莓派安装系统教程

热门文章

  1. 天天用 Spring ,Bean 懒加载原理你还不懂吗?
  2. Origin 画不等距数据分布直方图
  3. 众安尊享e生·新全保通2017成人精选版60岁以后续保的保费清单
  4. vue nuxt 服务器渲染和缓存
  5. 基于SpringBoot的个人理财系统
  6. Stanza语言模型下载
  7. Girlfriend(2021牛客多校第二场F)
  8. java 中文繁简体转换工具 opencc4j 使用介绍 1.8.0
  9. 广告冷启动_《冷启动.零成本做营销》读书笔记
  10. Citespace教程笔记