概述
功能覆蓋率指你對設計所實現功能特性的收集,驗證的目的就是確保設計在實際環境中的行為正確。設計規范里詳細說明了設備應該如何運行,而驗證計划里則列出了相應的功能應該如何激勵、驗證和測量。
功能覆蓋率是和設計意圖緊密相連的,有時也稱為”規范覆蓋率“,而代碼覆蓋率則是衡量設計的實現情況。
覆蓋率完備性
如果你的功能覆蓋率很高但是代碼覆蓋率很低,這說明你列的測試點可能不夠全面,有遺漏的功能沒有加入到你的測試計划中,你的測試沒有很好的執行設計的所有代碼,這是應該回到設計規范上,更新驗證計划,然后增加更過針對未測試功能的覆蓋點。
如果你的功能覆蓋率很低但是代碼覆蓋率很高,即使設計的代碼都被執行了,但是你所列的覆蓋點缺沒有很好的覆蓋到,首先要檢測下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得到單個覆蓋組中特定實例的覆蓋率。