功能覆盖率之覆盖组简介(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;


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM