System Verilog覆盖率简介
-
覆盖率类型:
代码覆盖率:
功能覆盖率
断言覆盖率
-
覆盖组:
-
覆盖组可以在程序、模块或类里面定义,他可以采样任意的可见的变量;在sv中,覆盖组应该定义在适当的抽象层次上,一个覆盖组必须在实例化后才可以用来收集数据。
-
覆盖组的触发:这个过程可以直接使用sample函数来完成,或者在covergroup定义中采用阻塞表达式,阻塞表达式可以使用wait或者@来实现在信号或者事件上的阻塞
-
使用事件触发的覆盖组:
event trans_ready; covergroup CovPort@(trans_ready); coverpoint ifc.cb.port; endgroup
-
使用断言触发的覆盖组
-
通用的覆盖组
covergroup Covport(int mid); coverpoint port bins hi = {[mid:$]}; endgroup Covport cp; cp = new(5);
-
-
仓
自动创建仓,个数一般为2^N,N为位宽,最大个数缺省为64,超出后会平均分配到各个仓
covergroup Covport; coverpoint tr.point {options.auto_bin_max=2;} //分成两个仓,限制自动创建仓的个数 endgroup {bins len[]={[0:23]};} //自定义仓 covergroup Covport; coverpoint tr.point{ bins zero = {0}; //1个仓代表point==0 bins lo = {[1:3],5}; //一个仓代表 1 2 3 5 bins hi[] = {[8:$]}; //point 4bit 8个仓代表8-15 bins misc = default; //一个仓代表剩余 } endgroup
可以对表达式进行采样
-
覆盖:
iff:添加条件
coverpoint port iff(!bus_if.reset); //reset=1是不要收集覆盖率 Covport ck = new(); ck.stop; //停止收集覆盖率 ck.start; //开始收集覆盖率
=>:翻转状况,0=>1 是否覆盖信号由0到1的翻转,任何x z ?都会当成0或1的通配符
bins t1=(0=>1),(0=>2),(0=>3); //是否覆盖0变为1、2、3 (1,2=>3,4) //四种翻转 1-3,2-3,1-4,2-4 0=>1=>2 //连续翻转 from:(0=>1[*3]=>2); //1重复三次 from:(0=>1[*3:5]=>2); //1重复三到五次
使用wildcard建立多个状态或翻转
wildcard bins even = {3‘b??0}; //3bit偶数
-
ignore_bins 可以忽略一些数字
ignore_bins hi = {[6,7]}; 忽略6 7值 illegal_bins hi = {[6,7]}; 出现则报错
-
illegal_bins 采样到会报错
-
交叉覆盖率:
kind:coverpoint tr.kind; port:coverpoint tr.port; cross kind,port; cross kind,port{ ingrone_bins hi = binsof(port)intrsect{7}; //排除所有port为7和任意kind组合的仓 ingrone_bins md = binsof(port)intrsect{0} && binsof(kind)intrsect{[9:11]}; //排除所有port为7和kind为9 10 11组合的仓 option.weigth = 10 ; //覆盖率权重,设置为0则不会对总体覆盖率有影响 }
-
option.goal = 90 ; 设置覆盖率目标
-
覆盖率注释
可以最为参数传递进入覆盖组