绿皮书--覆盖率

本文详细介绍了软件测试中的覆盖率收集,特别是功能覆盖率的策略,包括使用covergroups进行分类、数据采样、自定义仓库和覆盖率选项。讨论了如何定义和触发覆盖组,以及高级特性如状态机覆盖率和交叉覆盖率的实现方法。
摘要由CSDN通过智能技术生成

1.覆盖率收集的分类
    1.代码覆盖率:由仿真器收集
    2.功能覆盖率
    3.断言覆盖率

2.功能覆盖率收集策略
    1.收集信息而非数据
    2.只测量你会使用的数据
    3.测量的完备性

3.功能覆盖率的简单例子
    1.在类中定义覆盖组
    2.覆盖组的触发
    3.覆盖组的采样

4.数据组采样
    1.个体仓库和总体覆盖率
    2.自动建仓
    3.限制建仓的数目:auto_bin_max
        covergroup CovPort;
            coverpoint tr.port {
                    option.auto_bin_max=2;
            }
        endcovergroup
        //上面的只针对tr.port的数目起作用,下面的对于port和data都有作用
        covergroup CovPort;
            option.auto_bin_max=2;
            coverpoint tr.port;
            coverpoint tr.data;
        endcovergroup
        
    4.使用用户自定义的仓库来发现漏洞
        covergroup CovPort;
            len:coverpoint(tr.hdr_len+tr.playload+5'h0)
            {
                bins len[]={[0:125]};
            }
        endcovgroup
        
    5.命名覆盖率的仓
        1.对data[0:16]进行收集
        covergroup CovPort;
            coverpoint tr.data {
                bins lo = {[0]};
                bins mid = {[4:1]};
                bins max[] = {[9:5]};
                bins misc = default;
            }
        endcovergroup
        
        2.使用通配符
        covergroup CovPort;
            coverpoint tr.data {
                bins lo = {[2:$]};
                bins mid = {[3]};
                bins max = {[$:4]};
            }
        endcovport
        
        3.为枚举创建
        typedef enum{RED,BLUE,GREEN} color_e
        
        color_e pcolor;
        covergroup CovPort;
            coverpoint pcolor;
        endcovergroup
        
        4.状态翻转率
        covergroup CovPort;
            coverpoint t1 = {0=>1; 0=>2; 0=>3};
        endcovport
        
        5.在状态和翻转中使用通配符
        covergroup CovPort;
            coverpoint tr.data {
                wildcard bins lo = {3'b??0};
                wildcard bins mid = {3'11?};
            }
        endcovport
        
        6.忽略数值
        covergroup CovPort;
            coverpoint tr.data_0_3 {
                ignore_bins lo = {[0]};
                ignore_bins mid = {[3]};
            }
        endcovport
        
        covergroup CovPort;
            coverpoint tr.data_0_3 {
                option.aotu_bin_max = 4;
                ignore_bins mid = {[6,7]};
            }
        endcovport
        7.不合法的仓
        covergroup CovPort;
            coverpoint tr.data_0_3 {
                illegal_bins lo = {[0]};
                illegal_bins mid = {[3]};
            }
        endcovport
        8.状态机覆盖率
        
    6.交叉覆盖率
        1.基本的交叉覆盖率
        class transaction;
            rand bit[3:0] kind;
            rand bit[4:0] port;
        endclass
        
        covergroup CovPort;
            kind: coverpoint tr.kind;
            port: coverpoint tr.port;
            
            cross kind,port;
        endcovergroup
        2.对于交叉覆盖仓进行标号
        covergroup CovPort;
            kind: coverpoint tr.kind {
                bins lo[] = {[0:3]};
            }
            port: coverpoint tr.port;
                bins lo  = {[2:4]};
                bins mid = {[0:1]};
            cross kind,port;
        endcovergroup
        3.排除部分的交叉覆盖仓
        covergroup CovPort;
            kind: coverpoint tr.kind {
                bins lo[] = {[0:3]};
            }
            port: coverpoint tr.port;
                bins lo  = {[2:4]};
                bins mid = {[0:1]};
            cross kind,port {
                ignore_bins lo = binsof(kind)intersect{2};
                ignore_bins mid = binsof(kind)intersect{2} && binsof(port)intersect{[1:2]};
                ignore_bins hi = binsof(kind.lo[2]);
            }
        endcovergroup
        4.从整体排除部分的覆盖仓
            1.指明交叉覆盖率的权重
            covergroup CovPort;
                kind: coverpoint tr.kind {
                    bins zero = {0};
                    bins lo = {[1:3]};
                    bins hi[] = {[8:$]};
                    bins misc = default;
                    option.weight = 0;
                }
                port: coverpoint tr.port {
                    bins port[] = {[0:$]};
                    option.weight = 0;
                }
                
                cross kind,port {
                    option.weight = 10;
                }
            endcovergroup
        5.精准的交叉覆盖仓
        class transaction;
            rand bit a,b;
        endclass
        
        covergroup CovPort;
            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;
            }
            
            cross a,b {
                bins a0b0 = binsof(a.a0) && binsof(b.b0);
                bins a0b1 = binsof(a.a0) && binsof(b.b1);
                bins b1 = bins(b.b1);
            }
        endcovergroup
        
    7:通用覆盖着
        1.通过数值传递覆盖组参数
        2.通过引用传递覆盖组参数
        
    8:覆盖率选项
        1.单个实例的覆盖率
            option.per_instance = 1;
            只能用于覆盖组中,不能用于覆盖点和交叉点;
        2.覆盖组的注释
            option.comment = comment;
            
            covergroup CovPort(int lo,hi, string comment);
                option.comment = comment;
                option.per_instance = 1;
                coverpoint port {
                    bins rang = {[lo:hi]};
                }
            endcovergroup
        3.覆盖阈值
        option.at_least
        4.打印空仓
        option.cross_num_print_missing = 1000;
        5.覆盖组目标
        covergroup CovPort;
            coverpoint port;
            option.goal = 90;
        endcovergroup

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值