注:功能覆蓋率的兩個主要部分:采樣的數據和數據被采樣的時刻;
參考資料:
(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;



