功能覆盖率之覆盖组简介(coverage group)

注:功能覆盖率的两个主要部分:采样的数据和数据被采样的时刻;

参考资料:

(1) system verilog绿皮书;

(2) system verilog standard chapter19;

1.覆盖点与覆盖组

(1) 覆盖点对测试平台中的变量和表达式的数值进行采样;

(2) 覆盖组: 囊括同一时间点的多个覆盖点;

1 示例1:
2 enum {red, green, blue} color;
3 covergroup g1 @(posedge clk);
4     c: coverpoint color;
5 endgroup

注1:示例1中没有显式创建bins,工具会根据枚举常量的数目自动创建3个bins;

 1 示例2:
 2 enum {red, green, blue} color;
 3 bit[3:0] pixel_adr, pixel_offset, pixel_hue;
 4 
 5 covergroup g2 @(posedge clk);
 6     Hue: coverpoint pixel_hue;
 7     Offset: coverpoint pixel_offset;
 8 
 9      AxC: cross color, pixel_adr;
10      all:    cross color, Hue, Offset;
11 
12 endgroup

注2:可以定义两个或多个覆盖点或变量间的cross coverage;示例2中的AxC就是两个之前声明过的变量间的cross coverage,all是之前声明过的变量与coverpoint之间的cross coverage;

2.覆盖组的使用流程(定义+例化+设置+采样)

2.1定义覆盖组

(1)覆盖组含有覆盖点、覆盖点交叉场景、配置选项、形式参数和可选触发;一个覆盖组包含一个或多个覆盖点;

原文:
Each covergroup specification can include the following components:
(1) A clocking event that synchronizes the sampling of coverage points;
(2) A set of coverage points;
(3) Cross coverage between coverage points;
(4) Optional formal arguments;
(5) Coverage options;

(2)覆盖组可以定义在类里,也可以定义在程序(program)或模块(module)层次上(覆盖组的采样也可以放到module的initial begin end块中),还可以定义在package包以及interface接口内;

initial begin: coverage
  oc=new();
  c_00_FF=new();

  forever begin @(negedge clk);
    oc.sample();
    c_00_FF.sample();
  end

end: coverage

(2.1)在类里定义覆盖组

注1:在类定义里面嵌入覆盖组,为采样类属性提供了一个简便的方法;

 1 class Transactor;
 2      Transaction tr;
 3      mailbox mbx_in;
 4 
 5      covergroup CovPort;
 6           coverpoint tr.port;
 7      endgroup
 8 
 9      function new(mailbox mbx_in);
10           CovPort=new();
11           this.mbx_in=mbx_in;
12      endfunction
13 
14      task main();
15           forever begin
16                tr=mbx_in.get();
17                ifc.cb.port<=tr.port;
18                ifc.cb.data<=tr.data;
19                CovPort.sample();
20           end
21      endtask
22 endclass
 1 示例
 2 class xyz;
 3      bit[3:0] m_x;
 4      int m_y;
 5      bit m_z;
 6 
 7      covergroup cov1 @m_z;
 8           coverpoint m_x;
 9           coverpoint m_y;
10      endgroup
11 
12      function new();
13           cov1=new();
14      endfunction
15 endclass
 1 示例
 2 class Helper;
 3     int m_ev;
 4 endclass
 5 
 6 class MyClass;
 7     Helper m_obj;
 8     int m_a;
 9 
10     covergroup Cov @(m_obj.m_ev);
11          coverpoint m_a;
12     endgroup
13 
14     function new();
15          m_obj=new();
16          Cov=new(); //create embedded covergroup after creating m_obj;
17     endfunction
18 
19 endclass

(3)覆盖组可以采样任何可见的变量,比如类的变量、程序或模块变量、接口信号或者设计中的任何信号(使用层次化引用方式);

(4)定义覆盖组时,可以使用system verilog提供的选项为覆盖组指定额外的信息(选项分为实例选项与类型选项,前者用于特定的覆盖组实例,后者用于所有的覆盖组实例);

(4.1)实例选项

注:会跟踪每个覆盖组实例的覆盖率,并且每个覆盖组实例都有一个带层次化路径的注释字符串;

(4.2)类型选项

2.2覆盖组的例化

(1)覆盖组必须被实例化后,才可以用来收集数据;和class类似,弟你个以后,可以通过调用new()创建覆盖组的实例;

(2)覆盖组结构是用户自定义类型;类型定义只用写一次,但在不同的上下文中可以创建该类型的多个实例;

2.3覆盖组的设置

(1) set_inst_name: covergroup.set_inst_name("string");

2.4覆盖组的采样

(1) 功能覆盖率的两个主要部分是采样的数据和数据被采样的时刻。当这些数据都准备好以后,测试平台便会触发覆盖组,这个过程可以通过直接使用sample函数来完成,或者在covergroup的定义中采用阻塞表达式,阻塞表达式可以使用wait或@来实现在信号或事件上的阻塞。

(2) 使用sample函数;

  

        

注1:注意如下示例中对sample函数的使用(system verilog standard的19.8.1章节有讲解);

 1 class driver_cov_callback extends driver_callback;
 2     covergroup drv_cov with function sample(transaction tr);
 3          coverpoint tr.sa;
 4          coverpoint tr.da;
 5     endgroup
 6 
 7     function new();
 8           drv_cov=new();
 9     endfunction
10 
11     virtual task post_send(driver drv, transaction tr);
12           drv_cov.sample(tr);
13     endtask
14 endclass

(3) 在covergroup的定义中使用阻塞表达式指定采样条件(使用事件/信号/时钟边沿触发或者断言触发);

(3.1)使用事件触发;

(3.2)使用断言触发;

注1: cover property后面可以跟null或者statement,如下图所示,详见system verilog standard;

posted on 2021-11-08 12:30  知北游。。  阅读(1984)  评论(0编辑  收藏  举报

导航