功能覆蓋率


概述

功能覆蓋率指你對設計所實現功能特性的收集,驗證的目的就是確保設計在實際環境中的行為正確。設計規范里詳細說明了設備應該如何運行,而驗證計划里則列出了相應的功能應該如何激勵、驗證和測量。

功能覆蓋率是和設計意圖緊密相連的,有時也稱為”規范覆蓋率“,而代碼覆蓋率則是衡量設計的實現情況。

覆蓋率完備性

如果你的功能覆蓋率很高但是代碼覆蓋率很低,這說明你列的測試點可能不夠全面,有遺漏的功能沒有加入到你的測試計划中,你的測試沒有很好的執行設計的所有代碼,這是應該回到設計規范上,更新驗證計划,然后增加更過針對未測試功能的覆蓋點。

如果你的功能覆蓋率很低但是代碼覆蓋率很高,即使設計的代碼都被執行了,但是你所列的覆蓋點缺沒有很好的覆蓋到,首先要檢測下dut是否實現了所有的功能,如果功能有了,但是還是測試不到,這時就需要一個形式驗證工具來提取設計狀態並創建合適的激勵了。

功能覆蓋率詳細描述

 

`ifndef GUARD_COVERAGE
`define GUARD_COVERAGE

class coverage extends uvm_subscriber ;
packet pkt;

covergroup switch_coverage;

  length : coverpoint pkt.length;           //自動對length創建倉
  da     : coverpoint pkt.da {              //手動為da創建值為p0、p1、p2、p3的四個倉
              bins p0 = { `P0 }; 
              bins p1 = { `P1 }; 
              bins p2 = { `P2 }; 
              bins p3 = { `P3 }; } 
  length_kind : coverpoint pkt.length_kind{
                option.auto_bin_max = 2;    //自動創建倉,最大為兩個
                option.weignt = 0;          //該倉覆蓋率在整體中不占分量,權重為0,相當於不計算此點的覆蓋率
                }
  fcs_kind : coverpoint pkt.fcs_kind{
                bins zero   = {0};          //創建一個倉代表fcs_kind == 0
                bins lo     = {[1:3],5};    //創建一個倉代表1:3和5
                bins hi[]   = {[8:$]};      //創建從8到最大值創建每個值獨立的倉
                bins misc   = default;      //創建一個倉表示剩余的所有值
                ignore_bins igbin = {[6:7]};  //忽略掉6和7的兩個倉
                illegal_bins ill_bin = {[8:9];}//如果出現值8和9遍報錯的非法倉
            }
  port : coverpoint pkt.port {
            bins port_t1 = (0=>1),(1,2=>3,4);  //創建一個倉port從0翻轉到1和從1翻轉到3、1翻轉到4、2翻轉到3、2翻轉到4
            }
  
  all_cross:  cross length,da,length_kind,fcs_kind;//交叉覆蓋率
  binsof_cross : cross length ,da{
    bins length_da = binsof(length)&&binsof(da.p0); //指定binsof交叉覆蓋率的狀態, length的值和da為p0的交叉狀態 
  }
endgroup

function new();
  switch_coverage = new();
endfunction : new

task sample(packet pkt);
 this.pkt = pkt;
 switch_coverage.sample();
endtask:sample

endclass

`endif

uvm_subscriber

UVM中內建了uvm_subscriber類,可以被當作觀察者或者訂閱者使用。

一般用在構建功能覆蓋率的收集。偽代碼如下:

訂閱者訂閱monitor中收集到的transaction,覆蓋率模塊,參考模型,scoreboard都是訂閱者。每當monitor收集到新的transaction,自動調用write函數,將transaction廣播出去(uvm_analysis_port是一個廣播的port,可以對應多個接收者)至於write函數如何實現,monitor並不關心,每個訂閱者的write實現不同。在覆蓋率類中write具體實現就是調用sample函數,收集覆蓋率。UVM通過connect函數將TLM端口連接,在訂閱者和發布者之間建立了聯系。
 

 

type_option和option的區別

option用於統計覆蓋率時,則只會用於個別實例instance,即當option.instance=0時,則打印單個instance的覆蓋率不會再把該coverpoint的覆蓋率統計在內,但是對於總的所有instance的覆蓋率並沒有影響,還是會計算該coverpoint的覆蓋率。

type_option用於統計覆蓋率時,則只會用於某個類型的coverpoint,即當type_option.instance=0時,則打印單個instance的覆蓋率會把該coverpoint的覆蓋率統計在內,但是對於總的所有instance的覆蓋率則有影響,不計算該coverpoint的覆蓋率。

我們常用$get_coverage得到所有覆蓋組的總的覆蓋率,使用get_coverage得到單個覆蓋組所有實例的覆蓋率,使用get_inst_coverage得到單個覆蓋組中特定實例的覆蓋率。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM