本節主要介紹:
vcs常用選項
vcs仿真流程
vcs代碼覆蓋率
vcs綜合后后仿
圖一樂技巧
VCS是編譯型verilog仿真器,VCS先將verilog/systemverilog文件轉化為C文件,在linux下編譯生成的可執行文./simv即可得到仿真結果。

vcs編譯后,生成可執行二進制文件simv:執行./simv進行仿真;
編寫makefie腳本運行仿真:

執行下面編譯仿真:
make?vcs
make?sim
在編譯時,使用 +vpdfile+filename 可以更改生成 VPD 文件的文件名,默認為vpdplus.vpd。
makefile中添加:
ALL_DEFINE?=?+define+DUMP_VPD
VPD_NAME?=?+vpdfile+simv.vpd
仿真文件tb.v中添加:
`ifdef?DUMP_VPD
initial?begin
????$display("Dump?VPD?wave!");
????$vcdpluson();
????//$vcdpluson(0,tb);???//記錄tb及其所有子模塊的波形。
????//$vcdpluson(1,tb );?//只記錄tb層的波形
????//$vcdpluson(2,tb );?//記錄tb層和tb下一層的波形
end
`endif
在仿真完成后,生成了simv.vpd 這個文件,這個文件記錄了仿真過程中所有信號的波形,
可以使用dve打開:
dve?-vpd??simv.vpd??&

選中所有信號 --> 右鍵Add to Waves --> New Wave View

通常使用VCS生成fsdb格式的波形文件,將其導入另一個軟件Verdi查看波形,代替DVE進行聯合仿真;
vcs選項加上-fsdb,仿真文件tb.v中添加:
initial?begin
???$display("Dump?fsdb?wave!");
???$fsdbDumpfile("tb.fsdb");?????
???$fsdbDumpvars;
end
仿真完成后執行下面命令打開verdi:
make?verdi
推薦查看verdi實用技巧和fsdb實用技巧
在一個芯片驗證的工程中,通常以代碼覆蓋率和功能覆蓋率來體現驗證是否完備;
功能覆蓋率就是檢查設計的功能是否完善,需要考慮很多不同的情況,是使用SV的重點內容。
代碼覆蓋率是檢查代碼是否存在冗余,檢查所有的代碼是否都已經執行,包括:行,狀態機,翻轉,條件,分支覆蓋率等,這里只討論代碼覆蓋率。
VCS在統計代碼覆蓋率的過程中,需要在編譯和仿真命令上添加對應的開關選項,生成.vdb文件記錄覆蓋率情況。
再使用dve打開該文件進行查看覆蓋率。

:打開對應類型覆蓋率,例如 -cm cond+tgl+lin+fsm+path為統計所有覆蓋率。仿真完成后執行下面命令dve -covdir *.vdb &打開dve查看覆蓋率:
make?dve_cov
代碼覆蓋到的為綠色,沒有覆蓋到的為紅色:

可以以文本格式或者網頁格式顯示覆蓋率;

或者:
urg?-dir?*.vdb?-report?urgReport
進入urgReport目錄,執行下面命令打開網頁版,查看覆蓋率報告
firefox?*.html

推薦查看綜合與時序分析
推薦查看后仿及反標
當RTL功能仿真通過之后,DC工具中進行邏輯綜合,在邏輯綜合完成之后,需要對綜合生成的網表再進行仿真驗證。
綜合后包含電路的實際信息,如映射的門電路信息、寄生參數、.v的網表、SDF標準延時信息、SDC約束、工作條件等信息。
帶時序的后仿,一定要注意仿真器是否關閉了notimingcheck和nospecify的選項。
如果有-nospecify,那么SDF中的時序信息就反標不到仿真模型中;
如果有-notimingcheck,那么后仿過程中就不檢查時序違例,后仿就失去了意義。
使用$sdf_annotate將SDF文件反標到網表中:
$sdf_annotate?("sdf_file"[,?module_instance]?[,"sdf_configfile"][,"sdf_logfile"][,"mtm_spec"]?[,"scale_factors"][,"scale_type"]);
在tb中加載sdf文件,指定反標模塊:
`ifdef?GLS_SIM
initial?begin
??$sdf_annotate("../../netlist_sim/sdf/TOP.sdf",tb.U_TOP,,"sdf.log","TYPICAL");
end
`endif
修改makefie腳本運行仿真:
LIB_NET_FILE指定的是基本的工藝庫單元, 因為網表文件netlist_TOP.v中包括綜合后的由門電路和觸發器等例化形成的verilog文件,所以需要基本的工藝庫單元。

rtl仿真和netlist仿真結果對比:
可以看到netlist仿真的輸出信號存在一些毛刺及延遲,與理想的沒有延遲信息的rtl仿真不同。


可在仿真中加入顏色顯示case的情況,如:


紅色:前景色31,背景色41:
$display("\033[31;41m?Hello?error!\033[0m");
綠色:前景色32,背景色42:
$display("\033[32;42m?Hello?pass!\033[0m");
黃色:前景色33,背景色43:
$display("\033[33;43m?Hello?warning!\033[0m");
涉及的顏色:

?

?