功能覆蓋率之覆蓋組簡介(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