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