一:如何執行(編譯執行)
1:編譯鏈接生成二進制可執行文件
$vcs source_file[compile_time_options], 例如 vcs +v2k filename.v -debug_all (+2k指2001版本)
compile_time_options 可選項
A:基本可選項
-Mupdate :增量編譯,再次編譯時只編譯改變的文件,提高速率
-R :run after compilation,編譯后繼續執行run
-gui :打開DVE圖形界面
-l<filename>:set log file name,用於寫編譯信息,大型項目中經常使用,如 -l compile.log
-sverilog :支持system verilog
+v2k :支持verilog2001的標准
B:工藝庫可選項
-v lib_file :lib_file(工藝庫名字) RTL代碼里涉及到工藝庫
-y lib_dir :告訴vcs到哪里找這個工藝庫
+libext+lib_ext:當用到很多庫,代替-v
+incdir+inc_dir:代碼里如果有include,使用這個命令告訴vcs包含文件的位置。verilog代碼里面寫`include "filename.vh"
C: 文件可選項
-f file :當有很多源代碼時,將這些源代碼整合到file里
D:修改可執行文件名字
-o foo :可執行文件名為simv,使用此命令改名字; 如 -o my_simv
F:define 一個宏
+define +<macro_name>=<value> :macro_name 宏名;value 初始化值; 如+define+INCR_COUNTER
2:執行
$simv[run_tiime_options]
例如 ./sim -gui &(./指在當前文件,sim指編譯得到的可執行文件,gui指打開vcs的gui界面-dve,&指后台執行)將會得到執行的PID值
-s 結束仿真時間
$plusargs() 動態接收參數
-E echo
-l logfile 把仿真信息寫入logfile文件里
二:基本知識
1: verilog compiled simulator;包含PLI 1.0/VPI接口(調用c++/c的程序);
2: 支持多抽象層仿真
行為級描述(驗證,不可綜合) - RTL級描述(設計,寄存器傳輸級) - Gate-level(門級,RTL級經過綜合得到,與具體工藝 庫相關,TSMC,SMIC,CSMC)
三:vcs debug
三種debug方法:system task calls,VCS UCLI,VCS DVE(GUI)
考慮因素:速度,信號可見性,信號。。可用性
1: system task calls
$display 打印變量賦值前值
$montor 打印變量賦值后值,變量值改變,打印值也變
$time 仿真時間
$readmemb 將文件里的內容讀入存儲器中,讀二進制binary
$readmemh 將文件里的內容讀入存儲器中,讀十六進制hexadmecimal
2: VCS UCLI命令行 效果不好 $vcs filename +v2k -ucli -R
3: DVE
根據此筆記的一打開DVE軟件,DVE支持交互式仿真(在終端輸入命令),支持后仿分析
tips1:task里面的參數在波形上顯示不出來,所以最好使用display顯示出來
tips2:debug
f10 單步執行(括號加外箭頭),f11單步且進入函數體執行(括號加內箭頭);每次單步仿真結束需點下箭頭重新仿真方可再次仿真
tips3:波形知識點
F鍵:波形自動,全屏
group:將多個信號組成一組
set radix:波形的不同顯示形式,十進制,二進制....狀態機顯示狀態為set radix - state name
找波形里面具體數字有沒有出現:右上角空-value-數字-前后點,可發現有沒有這個數字
compare:選中比較的兩個圖形-signal-compare-name輸入-creat-close
構造bus:選中信號-set bus-觀察bus后的總線波形
tips4:DPI (在verilog里調用c語言的代碼)
第一步:寫一個c文件,c文件要求:#include“svdpi.h“
第二步:在verilog源文件里添加調用c代碼的語句
第三步:在終端執行編譯命令時,添加c代碼文件以及sverilog命令
第四步:終端執行 ./simv
顯示hello,verilog
三:post-processing with VCD+ files
VCD(verilog change dump)是VCS的早期波形文件,VCD+是VCD壓縮文件;大的項目波形文件很占內存與影響速度,所以產生了VCD波形文件,記錄寄存器的值,層次等;將一些系統函數(例如$vcdpluson)嵌入到源代碼中,編譯仿真產生VCD文件(后綴名為vdp),打開DVE,參考log文檔與波形文件,快速解決bug。
1:什么時候使用VCD+
當debug一個成熟的設計時,當仿真分析需要多名設計人員參與時,當仿真采用script(如makefile)時
2:VCD+的系統函數
$vcdpluson(level_number,module_instance)從module這個模塊開始,記錄number-1層
level_number: 0-記錄特定模塊的所有層次模塊
1-記錄特定模塊的頂層模塊
n-記錄特定模塊向內的n個模塊
module_instance:以此模塊為基准
$vcdplusoff(module_instance) 關閉
3:VCD+的編譯執行
compiling: vcs files vcdplus_switches other_switches
files: sources files
vcdplus_switches: 更改vcd文件名,否則在simulator后默認生成vcdplus.vpd文件。+vpdfile
+vdpfilename.vpd
other wsitches: vcs的其他開關選項;
還有debug選項開關選項:-debug,-debug_all, debug_pp
simulate: ./simv
打開DVE,打開vcd文件:dve -vpd vcdplus.vpd。 或者dve &—>file—>open database—>vcdplus.vpd
4:在源代碼如何添加系統函數
`ifdef dumpme
$vcdpluson();
`endif
通過是否定義dumpme(一般在腳本的complier里定義宏)+define+dumpme
5:$test$plusargs 鍵盤動態接收參數
6 : 在已有makefile文件的基礎上,使用VCD文件的步驟
make clean -> make com -> make sim -> dve &(或者dve -dvp vcdplus.vpd) -> 查看波形,可雙擊波形上的某個數值進入源代碼 - >debug
7:readmemb:將文件里的內容存在數組里。一般在VCD文件里沒有數組的波形,可使用$vcdplusmemon將數組導入。
8:$display
$display("hello verilog ",`__FILE__,`__LINE__); //打出具體文件具體行的hello verilog,兩個下划線
//打出的hello,verilog為紅色字體