(十五)覆盖率数据采样、交叉覆盖率_覆盖选项
一、数据采样
当在覆盖点上指定一个变量或表达式时,SystemVerilog便会创建很多的“仓(bin)"来记录每个数值被捕捉到的次数,仓(bin)是衡量功能覆盖率的基本单位。
- SystemVerilog会自动为覆盖点创建仓,它通过被采样的表达式的域来确定可能值的范围。
- 每次覆盖点/组采样后,SV都会在一个或者多个仓中留下标记,在每次仿真的末尾,所有带标记的仓会被汇聚到一个新创建的数据库中。
- 在仿真之后,分析工具会读取这些数据库来生成覆盖率报告,包含了各部分和总体的覆盖率。
为了计算一个覆盖点coverpoint上的覆盖率,首先需要确定可能数值的个数,这也被称为域。覆盖率就是采样值的数目除以域中仓的数目, 所有的覆盖点的覆盖率最终构成一个覆盖组的覆盖率,所有的覆盖组的覆盖率构成了整体的功能覆盖率。
覆盖组选项auto_ bin_ max 指明了自动创建仓的最大数目,缺省值是64。如果覆盖点变量或表达式的值域超过指定的最大值.SV会把值域范围平均分配给auto_bin_ max个仓。在实际操作中,这个方法可能不太实用.因为你会发现在一大堆自动创建的仓里寻找覆盖不到的点简直就如大海捞针,所以一般自定义最大的数量限制到8或16或者自定义仓。
示例1:限制最大数量
covergroup covport;option.auto_bin_max = 8; // 所有coverpoint auto_bin数量=8
coverpoint tr.data ;coverpoint tr.port{option.auto_bin_max = 2;// 特定coverpoint auto_bin数量=2} endgroup
示例2:自定义仓
covergroup CovKind;
coverpoint tr.kind {bins zero = {0}; // 1个仓代表kind==0bins lo = {[1:3], 5}; // 1个仓代表1,2,3,5bins hi[] = {[8:$]}; // 8个独立的仓代表8~15bins misc = default; // 1个仓代表剩余的所有值4,6,7
} // 没有分号
endgroup//覆盖率报告
Bin # hits at least
=============================
hi_8 0 1
hi_9 5 1
hi_a 3 1
hi_b 4 1
hi_c 2 1
hi_d 2 1
hi_e 9 1
hi_f 4 1
lo 16 1
misc 15 1
zero 1 1
说明:
- 注意coverpoint定义使用{ }而不是begin...end,因为它是声明性语句。
- 大括号的结尾没有带分号”;”
- 当自定义仓时,SV不再自动创建仓,它会忽略掉那些不被事先定义的仓所涵盖的数值,计算功能覆盖率时也只会使用你创建的仓。所以自定义仓时,使用default仓来标识那些可能已经被忘记的数值。
1、条件覆盖率
covergroup CoverPort;coverpoint port iff(!bus_if.reset);//当reset==1时不要收集覆盖率数据
endgroup
initial begincovport ck = new();//实例化覆盖组#1ns;ck.stop(); //停止收集覆盖率数据bus_if.reset = 1;#100ns bus_if.reset = 0;ck.start(); //开始收集覆盖率数据
...
end
说明:
- 可以使用关键词 iff给coverpoint添加条件,常用于在复位期间关闭覆盖以忽略不合理的条件触发。
- 也可以使用start和stop函数来控制covergroup各个独立实例。
2、枚举类型覆盖率
SystemVerilog 会自动为枚举类型的每个可能值的仓命名,但对于其他变量需要自定义状态命名。
typedef enum{IDLE,SETUP,BUSY} fsmstate_e;
fsmstate_e pstate,nstate;
covergroup cg_fsm;coverpoint pstate;//每个枚举类型值创建一个仓coverpoint nstate{bins n={0,1};//自定义将前两个枚举值放入一个仓中}
endgroup
3、翻转覆盖率
coverpoint可以用来记录变量从A值到B值的跳转情况和确定任何长度的翻转次数
covergroup CoverPort;
coverpoint port {bins t1 = {(0 => 1), (0 => 2), (0 => 3)};bins t2 = (1,2=>3,4);bins t3 = (0=>1=>2);bins t4 = (0=>1=>1=>2);bins t6 = (0=>1=>1=>1=>2);//等效于form: (0=>1[*3]=>2)
}
endgroup
说明:
- 范围表达式(1,2=>3,4)创建了四个翻转过程,分别是(1=>3)、(1=>4)、(2=>3)和(2=>4)。
- 确定任何长度的翻转次数,注意必须对转换过程中的每个状态都进行一次采样。上面t3,t4,t5是不一样的。对数值1进行3次、4次或5次重复可以使用1[*3:5]。
4、wildcard 覆盖率
- 可以使用关键字wildcard来创建多个状态或者翻转。
- 在表达式中,任何 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
5、忽略的bin、非法的bin
在某些coverpoint可能始终无法得到全部的域值,对于那些不计算功能的域值可以使用 ignore_bins来排除,最终它们并不会计入coverpoint的覆盖率。有些采样值不仅应该被忽略,而且如果出现还应该报错,需要使用 illegal_bins对特定的bin进行标示。
示例:
bit [2:0] low_ports_0_5; // 只使用数值0-5
covergroup CoverPort;
coverpoint low_ports_0_5 {ignore_bins hi = {[6,7]}; // 忽略数值6-7
}
endgroupbit [2:0] low_ports_0_5; // 只是用数值0-5
covergroup CoverPort;
coverpoint low_ports_0_5 {illegal_bins hi = {[6,7]}; // 如果出现6-7便报错
}
endgroup
二、交叉覆盖率
- 关键词:cross
- coverpoint是记录单个变量或者表达式的观测值。
- 交叉覆盖率记录在某一时刻多个变量之间值的组合情况。
- cross语句只允许带coverpoint或者简单的变量名。
- 使用ignore_bins、binsof和intersect分别指定coverpoint和值域,用于清除很多不关心的cross bin。
示例1:
covergroup Covport;port: coverpoint tr.port{bins port[] = {[0:$]};
}kind: coverpoint tr.kind {bins zero = {0};bins lo = {[1:3]};bins hi[] = {[8:$]};bins misc = default;
}cross kind, port {ignore_bins hi = binsof(port)intersect{7};ignore_bins md = binsof(port)intersect{0}&&binsof(kind)intersect{[9:11]};ignore_bins lo = binsof(kind.lo);
}
endgroup
说明:
- kind、port是覆盖点的标号,便于分析报告等。
- binsof、intersect分别指定coverpoint、值域。
示例2:
1、随着cross覆盖率越来越精细,需要花费不少的时间来指定哪些bin应该被使用或者被忽略。更适合的方式是不使用自动分配的cross bin, 自己声明感兴趣的cross bin。示例:
//示例一
class Transaction;rand bit a, b;
endclass
covergroup CrossBinNames;
a: coverpoint tr.a{ bins a0 = {0};bins a1 = {1};type_option.weight=0;// 不计算覆盖率
}
b: coverpoint tr.b{ bins b0 = {0};bins b1 = {1};type_option.weight=0;// 不计算覆盖率
}
ab: cross a, b{ bins a0b0 = binsof(a.a0) && binsof(b.b0);bins a1b0 = binsof(a.a1) && binsof(b.b0);bins b1 = binsof(b.b1);
}
endgroup//示例二
class Transaction;rand bit a, b;
endclass
covergroup CrossBinsofIntersect;
a: coverpoint tr.a{ type_option.weight=0; // 不计算覆盖率
}
b: coverpoint tr.b{ type_option.weight=0; // 不计算覆盖率
}
ab: cross a,b{ bins a0b0 = binsof(a) intersect {0} && binsof(b) intersect {0};bins a1b0 = binsof(a) intersect {1} && binsof(b) intersect {0};bins b1 = binsof(b) intersect {1};
}
endgroup
说明:
- type_option.weight用于设置是否计算这个覆盖点的覆盖率。
- 示例一与示例二只是实现方式不一样。
三、覆盖选项
1、option.per_instance
- 对一个covergroup 例化多次,默认情况下SV会将所有实例的覆盖率合并到一起。单独列出每个covergroup实例的覆盖率,则设置覆盖选项option.per_instance=1;
covergroup CoverLength;
coverpoint tr.length;option.per_instance = 1;
endgroup
2、option.comment
- 如果有多个covergroup实例,可以通过参数来对每一个实例传入单独注释。这些注释最终会显示在覆盖率数据的总结报告中,便于分析报告。
covergroup CoverPort(int lo,hi, string comment);
option.comment = comment;
option.per_instance = 1;
coverpoint port
{bins range = {[lo:hi]};}
endgroup
...
CoverPort cp_lo = new(0,3, "Low port numbers");
CoverPort cp_hi = new(4,7, "High port numbers");
3、option.at_least
- 默认情况下,数值采样了1次就可以计入有效的bin。可以通过修改at_least来修改每个bin的数值 最少的采样次数,如果低于at_least数值,则不会被计入bin中。
- option.at_least可以在covergroup中声明来影响所有的coverpoint,也可以在coverpoint中声来只影响该coverpoint下所有的bin。
4、option.goal
- 一个covergroup或者一个coverpoint的目标是100%覆盖率。
- 不过你也可以将其设置为低于100%的 目标,这个选项只会影响覆盖率报告,但一般不能修改这个选项。
covergroup CoverPort;
coverpoint port;
option.goal = 90;
endgroup
5、其他选项
- sample():采样。
- get_coverage()/get_inst_coverage():获取覆盖率,返回0-100的real数值。
- set_inst_name(string):设置covergroup的名称。
- start()/stop():使能或者关闭覆盖率的收集。
- 使用$get_coverage ()可以得到总体的覆盖率。
- 使用 covergroup_inst.get_inst_coverage ()来获取单个covergroup实例的覆盖率。
示例:
interface busifc(input bit clk);logic [31:0] data; logic [ 3:0] port;modport TB(input clk,output data,port);endinterfaceclass Transaction;rand logic [31:0] data;rand logic [ 3:0] port;
endclassclass Transactor;Transaction tr;mailbox mbx_in;virtual busifc ifc;//定义虚接口covergroup CoverPort;port: coverpoint tr.port{bins pzero = {0};bins plo = {[1:3],5};bins phi[] = {[8:$]};bins pmisc = default;}data_low4: coverpoint tr.data[3:0]{bins dzero = {0};bins dlo = {[2:5],7};bins dhi[] = {[10:$]};bins dmisc = default; }port_data_low4:cross port,data_low4{bins p0d0 = binsof(port.pzero)&&binsof(data_low4.dzero);bins p1d1 = binsof(port.plo)&&binsof(data_low4.dlo);bins p2d2 = binsof(port)intersect{[8:$]}&&binsof(data_low4)intersect{[10:$]};//等效于binsof(port.phi)&&binsof(data_low4.dhi);ignore_bins p1d2 = binsof(port.plo)&&binsof(data_low4.dhi);//bins pdmisc = default;//只声明感兴趣的cross bin}
endgroupfunction new(mailbox mbx_in,virtual busifc ifc);
beginCoverPort = new();this.mbx_in = mbx_in;this.ifc = ifc;
end
endfunctiontask main;
beginmbx_in.get(tr);ifc.port <= tr.port;ifc.data <= tr.data;CoverPort.sample();
end
endtaskendclassprogram automatic test(busifc ifc);initial beginTransaction tr;mailbox mbx_in;Transactor tr_c;tr = new();mbx_in = new();tr_c = new(mbx_in,ifc);repeat(32)beginassert(tr.randomize);mbx_in.put(tr);tr_c.main();@(posedge ifc.clk);end
endendprogrammodule top;logic clk;
initial beginclk = 0;forever #5 clk =~clk;
endbusifc ifc(clk);test u_test(ifc);endmodule
随机100次:
(十五)覆盖率数据采样、交叉覆盖率_覆盖选项相关推荐
- 覆盖率(covergroup触发、覆盖率数据采样(条件、翻转、wailcard、忽略))-sv
文章目录 一.验证覆盖的完备性 1.1 验证覆盖率的目的 1.2 代码(功能)覆盖率低(高) 二.covergroup 2.1 coverpoint相关定义 2.2.covergroup定义以及使用 ...
- 【转】pacs定位线_C#开发PACS医学影像处理系统(十五):Dicom影像交叉定位线算法
转自:https://www.cnblogs.com/Uncle-Joker/p/13686618.html 1.定位线概念:某个方位的影像在另一个方向的影像上的投影相交线,例如横断面(从头到脚的方向 ...
- WCF技术剖析之十五:数据契约代理(DataContractSurrogate)在序列化中的作用
如果一个类型,不一定是数据契约,和给定的数据契约具有很大的差异,而我们要将该类型的对象序列化成基于数据契约对应的XML.反之,对于一段给定的基于数据契约的XML,要通过反序列化生成该类型的对象,我们该 ...
- Excel数据分析从入门到精通(十五)数据透视表之动态仪表盘
Excel数据分析从入门到精通(十五)数据透视表之动态仪表盘 1.绘制销售额汇总情况 2.绘制种类销售额情况+种类销售额占比 种类销售额情况 种类销售占比 3.绘制地区销售额情况和地区销售额占比 地区 ...
- Excel数据分析从入门到精通(十五)数据透视表基础
Excel数据分析从入门到精通(十五)数据透视表 1.Excel透视表前言 2.Excel透视表的创建 3.Excel透视表的组成 4.Excel透视表的十大技巧 ①如何创建汇总行 ②如何展示百分比 ...
- mysql数据表交叉引用_数据定义语句
数据定义语句 MySQL 8.0支持原子数据定义语言(DDL)语句.此功能称为原子DDL.原子DDL语句将数据字典更新,存储引擎操作和与DDL操作相关联的二进制日志写入操作组合到单个原子事务中.即使事 ...
- MyCat 学习笔记 第十五篇 . 数据分片后的迁移验证
本篇前言 前面几篇把 mycat 分片.批量压力测试的功能都验证了一把,这回体验下系统上线前做数据分片规划,上线后若服务器压力过大时做数据迁移的过程. 其实做起来还是比较简单的验证,就是把之前几篇和d ...
- pacs定位线_C#开发PACS医学影像处理系统(十五):Dicom影像交叉定位线算法
1.定位线概念:某个方位的影像在另一个方向的影像上的投影相交线,例如横断面(从头到脚的方向)在矢状面(从左手到右手)上的影像投影面交线. 举个例子:右边的是MR(核磁共振)的某一帧切片,这是从头开始扫 ...
- 数学建模学习笔记(十五)数据归一化
在神经网络构建之前,需要对数据进行归一化处理,为什么要归一化? 因为不同数据范围不同,比如一个特征的数据范围为(1,5),另一个为(100,1000),会导致特征之间对结果的影响不同,因此需要将它们归 ...
最新文章
- 解决YUM下Loaded plugins: fastestmirror Determining fastest mirrors 的问题
- Android动态权限申请工具类非常好用包含9组危险权限
- 如何通过BBED找回删除数据
- java核心技术总结_java 核心技术 读后总结
- html猜随机数游戏,用js制作简易计算器及猜随机数字游戏
- 2019 互联网月饼大赏!阿里开动物园,腾讯秀表情包,网易游戏最会玩!
- Centos6.5 安装 Mysql-5.6.41
- (必读)工业机器人基础教程——快速入门学习
- 工厂模式类图梳理笔记
- vue 点击文字input_Vue实现点击按钮复制文本内容
- 总结了几款好用的思维导图软件
- oracle 判断是否复数,第 14 章 使用复数运算库
- 工程项目成本管控,不知从何下手?
- 安卓开发———简易音乐播放器。Timer,SeekBar,mediaPlayer
- 高德地图两种引入方式
- 三本郑大计算机考研,三本跨专业考研985,初试排名第一,结果竟被导师拒绝!寒心呀!...
- 停课不停学,腾讯云助力在线教育!
- 离散度计算公式 python_Python分析离散心率信号(中)
- 程序员的工资是不是被高估了?
- protobuf引入不同包下的proto文件