資料來源
(1)公眾號-芯片學堂;
(2)VCS user guide;
(3)面試系列:RTL基本知識【1】關於coverage (qq.com)
(4) Verdi Coverage User Guide and Tutorial (手冊是信息源頭)
1.驗證覆蓋率
(1)驗證覆蓋率只是為了證明驗證是否已經完成;
(2)驗證覆蓋率達標不能說明驗證是完備的,但驗證覆蓋率不達標說明驗證很有可能是不完備的;
(3)驗證覆蓋率指標包括功能覆蓋率(function coverage)和代碼覆蓋率(code coverage);
(3.1)100%代碼覆蓋率+低於100%的功能覆蓋率->驗證不完整;
(3.2)低於100%代碼覆蓋率+100%功能覆蓋率->代碼冗余或驗證計划有誤(可能未對所有的功能特性編寫覆蓋點);
1.1功能覆蓋率(user defined/用戶自定義)
(1)作用:用於度量DUT中哪些功能或者特性被測試用例測試到;
(2)實現:使用sv等驗證語言實現覆蓋率模型(coverage model)或斷言(assertion),並從大量的回歸測試(regression)中采集覆蓋數據(sample),然后進行統計數據的合並(merge),最后做覆蓋率分析(analysis);
(3)側重點:模塊驗證會更關心是否所有的功能都被觸發,而系統驗證會更關心是否耦合了各類工作場景;
(4)涉及點:sv功能覆蓋率模型的實現,需要用到covergroup和coverpoint;
1.2代碼覆蓋率(仿真工具生成)
(1)分類:翻轉覆蓋率(toggle cov),行覆蓋率(line cov),語句覆蓋率(statement cov),分支覆蓋率(branch cov),狀態覆蓋率(FSM cov);
(2)作用:通過對代碼覆蓋率的分析,可以較容易發現RTL中冗余的代碼塊,這種冗余的代碼塊可能來自於RTL實現邏輯的錯誤,或者驗證計划不夠完備;
(3)收集:由EDA工具在啟用相應功能的選項之后自動化完成,不需要工程師開發額外的代碼;
2.驗證覆蓋率的收集
2.1code coverage
(1)通過在編譯和仿真時,添加-cm line+tgl+branch+cond+fsm+assert收集(需要補充-cm_hier option的使用);
注1:要在編譯和仿真時都添加,而不是僅僅編譯時,或僅僅仿真時;
編譯: vcs -P $VERDI_HOME/share/PLI/VCS/LINUX/novas.tab \ $VERDI_HOME/share/PLI/VCS/LINUX/pli.a \ -f file_list.vc -cm line+tgl+fsm+cond+branch+assert -sverilog 仿真: ./simv -cm +line+tgl+fsm+cond+branch+assert
注2:如果design包含用於power simulation的UPF文件且如果使能VCS power coverage feature,那么在編譯時,需要額外添加編譯option: -power=coverage+dump_hvp;
注3:用verdi查看覆蓋率信息vdb時,采用verdi -cov -covdir *.vdb,注意一定要包含編譯目錄下的vdb和仿真目錄下的vdb;如果僅僅打開編譯目錄下的vdb,沒有任何覆蓋率信息;如果僅僅打開仿真目錄下的vdb,則報"Error: design not load yet.";
2.2function coverage
(1)通常用define限制打開或關閉,在編譯時,添加相應的define即可,如+define+COVERAGE_ON;
注1:功能覆蓋率會自動收集,但驗證前期可能不關注覆蓋率,所以通常會有開關控制功能覆蓋率的收集;