注:功能覆盖率的两个主要部分:采样的数据和数据被采样的时刻;
参考资料:
(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;



