coverage report

轉載:http://blog.sina.cn/dpool/blog/s/blog_7853c3910102yn77.html



VCS仿真可以分成兩步法或三步法, 對Mix language, 必須用三步法。我呢,因爲運用都是簡單的非mix language,所以經常用一步法,因爲這樣省勁,但是對於跑regression最好還是兩步法。VCS對應的waveform工具有DVE和Verdi, DVE因爲是原生的,所以VCS對DVE非常友好。但DVE已經過時了,其對uvm等新feature支持的不好。Verdi是Debussy公司的產品,現在已被Synopsys收購併着力發展,說以Verdi是未來的潮流。所以此文的dump fsdb波形和查看coverage都用verdi. 具體來說VCS兩步是:

1. 編譯verilog文件成爲一個可執行的二進制文件命令爲:vcs source_files

2. 運行該可執行文件:./simv

當然,類似於NC,也有一步運行方式,那就是加-R,表示編譯後立即執行。


VCS使用使用實例

我的此例子涉及task和\(value\)plusargs等verilog語法,這裏(https://blog.csdn.net/limanjihe/article/details/52325930)可以複習下。此例子的vcs命令是:

vcs --sverilog -R -fsdb -ucli -do run_vcs.tcl -cm line+tgl+branch+assert -cm_name test1 +test_name=test1 tb_top.v
vcs -sverilog -R -fsdb -ucli -do run_vcs.tcl -cm line+tgl+branch+assert -cm_name test2 +test_name=test2 tb_top.v
verdi -cov -covdir simv.vdb/ &  

簡單解釋一下這裏的選項:

-sverilog是說支持sv語法;
-R表示編譯後立即執行;
-fsdb表示dump fsdb文件
-ucli -do run_vcs.tcl表示要執行這個仿真tcl控制;
-cm line+tgl+branch+assert表示 coverage覆蓋line/toggle/branch/assert ;
-cm_name test1表示生成coverage的一個test的目錄名稱test1(仿真後會生成simv.vdb/snps/coverage/db/testdata/test1);
+test_name 表示要傳遞給TB一個test_name 參數。

例子的verilog代碼文件top_tb.v :

module tb_top();
reg clk, rst, load;
wire [3:0] out;
always #5 clk=~clk;

reg [255:0] test_name;
initial
begin
    clk=1'b0; rst=1'b0; load=0;
    #30;
    $value$plusargs('test_name=%s',test_name);
    if(test_name=='test1')
        test1;
    else if(test_name=='test2')
        test2;
    #70;
    $finish;
end

task test1;
    rst=1'b1;
    #10 load=0;
endtask

task test2;
    rst=1'b1; load=1;
    #10 load=0;
endtask

counter u_counter(.reset(rst),
    .clk(clk),
    .load(load),
    .load_value(4'h8),
    .q(out));
endmodule

module counter(reset,clk,load,load_value,q);
input reset,clk;
input load;
input [3:0] load_value;
output[3:0] q;
reg[3:0]q;
reg[3:0]count;

always@(posedge clk)
    if(!reset) 
        q<=4'h0;
    else if(load)
        q<= load_value;
    else if(q==4'b1111)
        q<=4'b0;
    else
        q<=q+1;
endmodule

run_vcs.tcl:
config timebase 1ns
scope tb_top
run 1ns
call \$fsdbDumpfile('counter.fsdb');
call \$fsdbDumpvars(0,tb_top);
call \$fsdbDumpSVA;
# Run to completion
run
quit

這個例子運行後,產生simv.vdb/snps/coverage/db/testdata/test1 和simv.vdb/snps/coverage/db/testdata/test2兩個 test的coverage文件,用verdi打開是這樣的界面:

VCS仿真和多個test用urg工具生成coverage文件,verdi查看VCS中的覆蓋率分析
VCS在仿真過程中,也可以收集Coverage Metric。其中覆蓋率類型有:

1. Code Coverage:包括line,condition, branch, toggle和FSM coverage。
2. Functional Coverage:包括covergroup,assert 。

Coverage Database的產生:包含所有的有關coverage的信息,默認放在simv.vdb文件夾下。db中的默認路徑是:

snps/coverage/db/testdata/line.verilog.data.xml                    
                          fsm/cond/tgl/branch等xml信息。

在編譯命令中:
vcs [cover_options] [compile_options] source.v
[cover_options]可以是:

-cm line+cond+tgl+fsm+branch+assert
-cm_dir在compile options中改變simv.vdb文件夾的位置。
-cm_name指定testname。主要改變testname在db中的命名。

在仿真過程中:
simv [cover_options] [run_options]
[cover_options]可以是:-cm line+cond+tgl+fsm+branch+assert
[run_options]指定runtime options。

Coverage Reports的產生:
使用工具URG(Unified Report Generator)產生html格式文件。
urg -dir dir1 [urg_option] -dbname merge

使用DVE的GUI界面。
dve -cov -dir

使用verdi的gui界面。
verdi -cov -covdir
   verdi -cov -h,打印coverage mode下的幫助信息

其他的vcs編譯和仿真中的option:

  -cm_hier,在編過程中,指定收集coverage的scope。(格式可以包含正則表達式,語句可以+tree -tree -moduletree等)
  -cm_assert_hier,在編譯過程中,只是指定不收集coverage的assert hier。其中hier的表示,+/- module,+/- tree,+/-assert
  -cm_count,在gui和urg report中,顯示次數,比如toggle的次數。
  -cm_glitch period,不收集一定範圍的glitch的coverage。simulation option
  -cm_start/stop,指定coverage收集的時間,simulation option coverage group相關的option;
  -covg_disable_cg,關閉所有的coverage group的收集urg生成report中的option:
  -dir,指定需要拿到的db的hier,
  -dbname,指定輸出的merge db的hier
  -elfile,指定exclusive的file,這樣更好計算coverage。
  -elfilelist 忽略中每一個.el文件。(Specifies a file containing a list of exclude files)
  -noreport,不輸出最終的report,只是merge db
  -format text/both,指定report的輸出格式
  -matric [line,cond,fsm,tgl,branch,assert]執行計算的coverage類型
  -parallel,並行merge
  -full64,以64bit的程序進行merge
  -plan,-userdata,-userdatafile,-hvp_no_score_missing,指定hvp相關的生成信息。




實際工程中urg除了生成coverage報告,還經常要把幾個仿真產生的vdb文件merge到一起,三個目的:

1. 實現比較高的coverage
2. 讓verdi load coverage速度大大提高(我們幾百個test下來,merge後load只要幾分鐘,而不merge需要半個到一個小時)
3. 不同level testbench跑出來的結果需要merge到一起(前公司用過把block的merge到system level)
   這個merge+生成coverage命令大體是這樣的
   urg -full64 -metric line+tgl+cond+fsm+assert+branch -warn none -dbname .vdb -dir simv.vdb -elfile 
   注意:其中-dir之後的第一個vdb會被認爲是base data,如果產生其他vdb的RTL與base不同,將不能被Merge進來
   verdi查看coverage命令:**verdi -cov -covdir .vdb &**

如下是某個工程中使用的生成coverage並merge若干vdb文件到vcs_sim_exe_total.vdb的命令:

urg -full64 -parallel -show ratios -show tests -dir /proj/vcs_sim_exe_merge.vdb /proj/vcs_sim_exe _bak.vdb -hier /proj/dut_hier -elfilelist /proj/elfilelist.el -plan /proj/vplan/DUT.hvp -dbname /proj/vcs_sim_exe_total.vdb -report /proj/rpt/4332 -log /proj/gen_cov_dut.log

這裏特別說明下這個選項: -hier /proj/dut_hier
-hier表示只針對dut_hier中定義的(URG has an option, -hier, that accepts a subset of the controls that can be used in the compile-time -cm_hier file.)spec說不太常用。

參考文獻:
https://www.baidu.com/link?url=DCf5uEsmPEps3u-422ETdJSLGaD6mlBwI6smTGOq7AkUtxUSVq1X4UGqDvym6-NK55EcCVAsDEPjqRUTsh4G4a&wd=&eqid=995ddaf40000e04a000000055e65da74
https://blog.csdn.net/wonder_coole/article/details/79618696
https://www.cnblogs.com/-9-8/p/4478833.html
https://blog.csdn.net/kevindas/article/details/81462217
https://blog.csdn.net/gsjthxy/article/details/88429983

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章