一、基本类型:
- 使用方式:covergroup定义在class、program、module中,需要实例化
- 基本组成:
- covergroup:覆盖组,可以包含一个或多个覆盖点,可以有入参,端口类型只能为
input
或者ref
//带入参 covergroup cg_ref(ref bit [1:0] ref_y); cover_point_y : coverpoint ref_y; endgroup
- coverpoint:覆盖点,可以为整型变量也可以是表达式,包括一组容器;用{}围起来,大括号末尾不需要带分号
//covergroup可以带标号 covergroup incr_cross(int max_len) with function sample(input int burst_length); length_cp:coverpoint burst_length{ bins burst_length_cp[] = {[1:max_len]}; } endgroup
- bins:容器,定义特定值的跳变顺序;声明语句,用{}围起来,以分号分隔不同仓
- 如果未定义bin,则会按照对应的规则自动生成一组容器
- 枚举类型:每个枚举成员产生一个容器
- 其他类型:自动生成N个容器,N=min(所有可能值的数目,auto_bin_max)
- bins:自定义结构覆盖点容器
- bins adrbin1 = {[0:3]};1个bin, 相当于覆盖了(addr == 0 ||addr == 1 ||addr == 2 ||addr == 3 ||),只要覆盖了0~3其中的一个,这个coverpoint覆盖率就是100%
- bins adrbin2[]={[4:5]};4、5分别创建一个bins,只有4和5全部覆盖,这个coverpoint的覆盖率才是100%
- bins adr[] = {[31:$]};对于一个8bit addr变量,意味着显式地收集{[31:255]}
- ignore_bins:用于忽略指定的值或跳变的顺序,不对其进行覆盖检查
- illegal_bins:用于指定一组值或跳变顺序,为非法
- bins之间可以使用逻辑操作符&&和||
- 枚举类型创建仓
typedef enum {INIT,DECODE,IDLE} fsmstate_e; fsmstate_e pstate; covergroup cg_fsm; coverpoint pstate; endgroup
- 如果未定义bin,则会按照对应的规则自动生成一组容器
- covergroup:覆盖组,可以包含一个或多个覆盖点,可以有入参,端口类型只能为
- 类型:
- 条件覆盖率: iff,常用于在复位期间关闭覆盖以忽略不合理的条件出发
covergroup CoverPort coverpoint port iff (!bud_if.reset); //当reset==1时不收集覆盖率数据 endgroup
- 翻转覆盖率:=>,用于记录变量的跳转情况。支持多重、任意长度的序列定义和序列转移
- value1=>value2
- value1=>value2=>value3
- rang_list1=>rang_list2(如:1,2=>3,4)
covergroup Covport; covepoint port { bins data_change = (0=>1),(0=>2),(0=>3); } endcovergroup
- 交叉覆盖率:cross,两个或以上的coverpoint或变量之间的cross。若想使用表达式、层次化的名字或对象中的变量,需先对coverpoint里的表达式使用标号,然后将标号用在cross语句里
- 隐式定义coverpoint:变量的cross
class Transaction; rand bit[3:0]kind; rand bit[2:0]port; endcalss Transaction tr; covergroup CovPort; kind: coverpoint tr.kind; port: coverpoint tr.port; cross kind,port; endgroup
- 显示定义coverpoint:表达式的cross
covergroup CovPortKind; 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; endgroup
- 隐式定义coverpoint:变量的cross
- 指定覆盖仓:
- binsof(x):可用于指定仓,可以使用&&和||
class Transaction; rand bit a, b; endclass covergroup CrossBinNames { a: coverpoint tr.a { bins a0 = {0}; bins a1 = {1}; option.weight = 0; // 不用计算此点的覆盖率 } b: coverpoint tr.b { bins b0 = {0}; bins b1 = {1}; option.weight = 0; // 不用计算此点的覆盖率 } ab: cross a, b { bins a0b0 = binsof(a.a0) && binsof(b.b0); bins a1b0 = binsof(a.a1) && binsof(b.b0); bins a0b1 = binsof(a.a0) && binsof(b.b1); } } endgroup
- binsof(x)intersect{y}:表示x或x的bins取值和y取交集后的取值,x可以是coverpoint、变量、或者coverpoint的bin;y是一个值,一个值的范围或者是一个开放的取值范围
- !binsof(x)intersect{y}:表示x或x的bins取值和y不交集的取值,x可以是coverpoint、变量、或者coverpoint的bin;y是一个值,一个值的范围或者是一个开放的取值范围
class Transaction; rand bit a, b; endclass covergroup CrossBinsofIntersect { a: coverpoint tr.a { option.weight = 0; // 不计算此点的覆盖率 } b: coverpoint tr.b { option.weight = 0; // 不计算此点的覆盖率 } ab: cross a, b { bins a0b0 = binsof(a) intersect {0} && binsof(b) intersect {0}; // a和b均为0的交集 bins a1b0 = binsof(a) intersect {1} && binsof(b) intersect {0}; // a为1,b为0的交集 bins b1 = binsof(b) intersect {1}; // 仅b为1的交集(a可以是任意值) } } endgroup
- binsof(x):可用于指定仓,可以使用&&和||
- 条件覆盖率: iff,常用于在复位期间关闭覆盖以忽略不合理的条件出发
二、语法:
- 序列重复:
- trans_item[*n]:连续重复n次
(0=>1=>1=>1=>2)等价于(0=>1[*3]=>2) 1[*3:5] //对1进行3/4/5次重复
- trans_item[->n]:非连续重复n次
- trans_item[*n]:连续重复n次
- 开放取值范围:
- [ $ : value ] => The set of values less than or equal to value
- [ value : $ ] => The set of values greater or equal to value
- 通配符:使用wildcard关键字创建多个状态或翻转,表达式中的x,z或?都会被当成0/1的通配符
bit[2:0] port; covergroup CoverPort; coverpoint port{ wildcard bins even={3'b?? 0}; wildcard bins even={3'b?? 1}; } endgroup
- 覆盖率选项:(covergroup内调用)
选项 说明 适用范围 option.weight=number 计算覆盖率时所在covergroup或coverpoint或cross的权重。常用于在不关心的coverpoint种的weight设置为0 all option.at_least=number 表示每个bin最少被采样多少次才算入命中 all option.goal=number 覆盖率目标 all option.auto_bin_max=number 自动产生bins的最大数量 all option.cross_num_print_missing=number 打印所有仓,number为最大报告仓数 covergroup option.per_instance=boolean 1表示例化多份时,每一个实例一个覆盖率;0表示覆盖率合并 covergroup option.comment=string 注释,若一个covergroup例化多份,可在例化时通过参数传入不同的comment covergroup - 常用函数和方法:(covergroup外,实例化调用)
covergroup方法 作用 sample() 采样 start() 开始覆盖率的收集 stop() 关闭覆盖率的收集 get_coverage() 获取所有覆盖率组的覆盖率,返回一个从0到100的实数(该方法可带参数)
get_inst_coverage() 获取单个实例的覆盖率,需要用option指定(该方法可带参数) $set_coverage_db_name ( name ) 设置的覆盖率数据库文件名,在仿真结束后,用于保存覆盖率信息 $load_coverage_db ( name ) 从给定的文件名加载所有覆盖率组类型积累的覆盖率信息 set_inst_name(string) 设置covergroup的名称
三、数据采样
- 阻塞语句方法:
//触发方式1:阻塞表达式、wait、@来实现信号或者事件上的阻塞 covergroup cg @(posedge clk); ......... endgroup
- sample方法:
//触发方式2:显式调用 sample() covergroup cg; ......... endgroup cg cg_inst = new; initial //task/function/always…… cg_inst.sample(); ...... end
- 覆盖组收集与否控制
covergroup cg; ......... endgroup initial begin cg cg_inst = new; cg_inst.stop(); ...... cg_inst.start(); end