前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SystemVerilog覆盖率

SystemVerilog覆盖率

作者头像
数字芯片社区
发布2020-07-20 16:01:35
1.6K0
发布2020-07-20 16:01:35
举报
文章被收录于专栏:数字芯片

1.覆盖率概述

2.代码覆盖率

3.功能覆盖率

01

覆盖率概述

1.1概述

覆盖率是衡量验证进度的重要数据;是衡量设计验证精度和完备性的数据指标;

覆盖率需要解决的两个问题:

  • 是否所有设计的功能在验证中都已经被验证;
  • 代码中的某些部分是否从未被执行;

1.2覆盖率分类

按照覆盖率生成方法:

  • 隐性生成
  • 显性生成

常见三种覆盖率:

  • 代码覆盖率(隐性)
  • 功能覆盖率(显性)
  • 断言覆盖率

注意

  • 100%的代码覆盖率,并不意味着100%的功能覆盖率;
  • 100%的功能覆盖率,也可能只达到90%的代码覆盖率;

02

代码覆盖率

2.1概述

代码覆盖率,可以识别在验证设计中已执行的代码;

  • 一般只关注设计本身的代码覆盖率,无需关注测试平台的代码覆盖率;
  • 代码覆盖率的数据无法直接映射到哪些设计功能被测试,因此代码覆盖率和功能覆盖率之间是相互独立的;
  • 优势:
  • 代码覆盖率可以由仿真工具自动收集,用来指出在测试程序中,源代码哪些被激活触发,哪些没有激活触发;
  • 由于代码覆盖率自动的特性,使得仿真过程简单化,不需要修改设计或者验证环境;
  • 漏洞从眼皮底下‘逃逸‘ ”

不是所有被覆盖的代码都会得到监测,由于没有得到足够的监测,因此一些即使被触发的漏洞也会在传播过程中没有到达监测点上。

2.2行覆盖率

  • 用来衡量源代码哪些代码行被执行过,从而指出哪些代码行没有被执行;
  • 行覆盖率也称块覆盖率,其中块是在执行单个语句时执行的语句序列;
  • 语句、行或者块覆盖率可以衡量验证执行的总代码行数;
代码语言:javascript
复制
if (dtack==1’b1)begin :acked  //只要if语句表达式为true,就执行acked块
    as <=1’b0;
    data <=16’hzzzz;
    bus_rq<=1’b0;
    state <=IDLE;
  end:acked   //因此计算该块的执行等同于计算该块中的四个单独语句的执行

2.3分支覆盖率

分支覆盖率是用来对条件语句(if/else,case,?:),指出其执行的分支轨迹;

代码语言:javascript
复制
if (parity==ODD||parity==EVEN)begin  //判断分支的布尔表达式为true或者false

2.4条件覆盖率

用来衡量一些布尔表达式中各个条件真伪判断的执行轨迹;

代码语言:javascript
复制
if (parity==ODD||parity==EVEN)begin  //两个条件是否各自衡量为true、false

Parity==ODD或者parity!=ODD

Parity==EVEN或者parity!=EVEN

2.5状态机覆盖率

  • 可以记录每个状态机的进入次数,状态之间的跳转次数,以及多个状态的跳转顺序;
  • 由于状态机覆盖率每个状态通常使用case语句中的选项进行编码,所以任何未访问的状态都可以通过未覆盖的语句识别;

2.6跳转覆盖率

记录寄存器跳转的次数(从0到1,从1到0的次数);

03

功能覆盖率

3.1概述

验证设计中的功能描述是否全部实现;

3.2覆盖组

  • 一般在类中或者接口中定义,在一次定义后可以进行多次例化;
  • 覆盖组包含覆盖点、选项、形式参数和可选触发;
  • 覆盖组可以采集任何可见的变量,如程序或者模块变量、接口信号或者设计中的任何信号;
  • 在类中的覆盖率也可以采集类的成员变量;
  • 覆盖组应该定义在适当的抽象层次上;
  • 对任何事务的采样都必须等到数据被待测设计接收到以后;
  • 一个类也可以包含多个覆盖组,每个覆盖组可以根据需要将他们使能或者禁止;

覆盖组可以由covergroup 、endgroup来定义:

代码语言:javascript
复制
enum{red,green,blue} color;
bit [3:0] pixel_adr,pixel_offset,pixel_hue;
covergroup g2@(posedge clk);
  Hue: coverpoint pixel_hue;
  Offset :coverpoint pixel_offset;
  Axc :cross color,pixel_adr;  //cross 2variables 
  all :cross color,Hue ,Offset;  //cross 1 VARs and 2CPs
endgroup
g2 cg_inst=new();
  • 一般将覆盖组定义在类中,从而可以去覆盖类的成员变量;
  • 在类中声明的covergroup的方式称为嵌入式覆盖组声明;
代码语言:javascript
复制
class xyz;  //声明一个覆盖组类型cov1和他的实例c1
  bit[3:0] m_x;
  int m_y;
  bit m_z;
  covergroup cov1 @m_z;   //embeded covergroup
    coverpoint m_x;
    coverpoint m_y;
  endgroup
  function new();
    cov1 c1 =new();
  endfunction
endclass

3.3覆盖点

  • 一个覆盖组可以包含一个或多个覆盖点,一个覆盖点可以用来采样数据或者数据变化;
  • 一个覆盖点可以对应多个数据采样的bin(仓);仓用来表示对被采样数据感兴趣的值或者值的变化;这些仓可以显性指定也可以隐性指定;
代码语言:javascript
复制
covergroup g4   //通过if禁止coverpoint的采集
  coverpoint s0 if(!reset);
endgroup
代码语言:javascript
复制
covergroup cg(ref int x,ref int y,input int c);
  coverpoint x;  //创建覆盖点x
b:coverpoint y;  //创建覆盖点b
cx :coverpoint x;  //创建覆盖点cx
d:coverpoint y[31:24] ;//创建覆盖点d
cross x,y;  //创建交叉覆盖点
endgroup 

3.4仓

3.4.1仓 值覆盖

关键词bins可以用来将每个感兴趣的数值均对一个独立的bin,或者将所有值对应到一个共同的bin;

代码语言:javascript
复制
bit [9:0] v_a;
covergroup cg @(posedge clk);//覆盖组cg会在每个时钟的上升沿对变量v_a做采样
  coverpoint v_a{
    bins_a{[0:63],65};  //表示v_a变量只要在采样时刻等于0-63或者65中任意一个值,那么该仓即被采样到一次
    bins_b[]={[127:150],[148,191]};//表示一个数组,从127-150以及从148-191中的每一给数值都将被独立采样,放置到独立的仓中
    bin_c[]={200,201,202};
    bins d={[1000:$]};
    bins others[] =default;//除了列举的数值之外放置在others数组
}
endgroup

3.4.2仓 值变化覆盖

覆盖仓除了可以覆盖数值,也可以覆盖数值的变化;

代码语言:javascript
复制
value1=>value2
代码语言:javascript
复制
1.5=>6.7
代码语言:javascript
复制
trans_item[*repeat_range]
代码语言:javascript
复制
3 [*5] 表示3=>3=>3=>3=>3
代码语言:javascript
复制
3 [* 3:5] 表示(3=>3=>3). (3=>3=>3=>3)或(3=>3=>3=>3=>3)

3.4.3仓 自动生成

如果覆盖点没有指定任何bin,SV会自动生成bin,生成原则:

  • 如果变量是枚举类型,那么bin的数量是枚举类型的基数(所有枚举数值的和)
  • 如果变量是整形(M位宽),那么bin的类型将是2^M和不会超过默认的自动覆盖仓最大数值;

3.4.4仓 忽略类型和非法类型

  • Ignore_bin: 用来将其排除在有效统计的bin集合之外;这些数值可以放在Ignore_bin中;
代码语言:javascript
复制
covergroup cg23:
  coverpoint a{
    ignore_bins ignore_vals={7,8};
    ignore_bins ignore_trans=(1=>3=>5);
  }
endgroup
  • illegal_bins:用来指出采样到的数值为非法制,仿真会报错,这些数值可以放在illegal_bins中;
代码语言:javascript
复制
covergroup cg3;
  coverpoint b{
    illegal_bins bad_vals={1,2,3};
    illegal_bin bad_trans=(4=>5=>6);
}
endgroup

3.5交叉覆盖率

交叉覆盖率:对两个或者多个覆盖点或者变量之间定义数值组合覆盖情况;

代码语言:javascript
复制
bit [3:0] a,b;//每个覆盖点自动产生16个bin
covergroup cov @(posedge clk);
  aXb:cross a.b:
endgroup      //两个覆盖点交叉后生成256个交叉的bin
代码语言:javascript
复制
bit [31:0] a_var;
bit [3:0] b_var;      b_var有16个bin
covergroup cov3 @(posedge clk);
  A:coverpoint a_var {bins yy[]={[0:9]}:}   //A有10个bin
  CC : cross b_var.A;    //故CC有10*16=160个bin
endgroup

注意:

被声明为default/ignore/illegal的bin将不会参与交叉覆盖率的运算;

交叉覆盖率只允许在同一个covergroup中定义的覆盖点参与运算;

END

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数字ICer 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.覆盖率概述
  • 2.代码覆盖率
  • 3.功能覆盖率
  • 覆盖率概述
    • 1.1概述
      • 1.2覆盖率分类
      • 代码覆盖率
        • 2.1概述
          • 2.2行覆盖率
            • 2.3分支覆盖率
              • 2.4条件覆盖率
                • 2.5状态机覆盖率
                  • 2.6跳转覆盖率
                    • 3.1概述
                      • 3.2覆盖组
                        • 3.3覆盖点
                          • 3.4仓
                            • 3.4.1仓 值覆盖
                            • 3.4.2仓 值变化覆盖
                            • 3.4.3仓 自动生成
                            • 3.4.4仓 忽略类型和非法类型
                          • 3.5交叉覆盖率
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档