前言
今日感想:學(xué)習(xí)只能慢慢搭積木,想一步登天可不行啊
在vcs仿真時調(diào)用$dump函數(shù)dump出fsdb文件,隨后verdi load filelist和fsdb文件來進(jìn)行debug
一、vcs編譯過程
1、vcs兩步仿真:先編譯文件,生成simv可執(zhí)行文件;后進(jìn)行仿真
(compilation and simulation)
VCS:Verilog Compiler Simulator
問題一:當(dāng)設(shè)計比較大的時候,每次都要全部重新編譯一遍,比較浪費時間;
問題二:當(dāng)設(shè)計中存在VHDL文件時,兩步法就無法使用,因為VHDL文件需要單獨處理。
2、vcs三步仿真:編譯(compilation)、elaboration、和執(zhí)行仿真(simulation)三步執(zhí)行
elaboration:把各種資源進(jìn)行整合鏈接,有些文章或書上說是建立層次關(guān)系,意思差不多,類似于c語言的link
適合于文件中存在多種語言,例如sv和vhdl同時存在
英文解釋:Elaboration is the process of binding together the components of the design. Elaboration includes among other things creating instantiations, computing parameter values, resolving hierarchical names and connecting nets
. Often when referring to the compilation and elaboration phases they are not distinguished but are generally referred to as compilation.
3、CLI and GUI界面
(1)VCS有命令行模式和圖形模式。
圖形模式使用的是DVE,命令交互模式使用的是Unified Command-line Interface (UCLI) 。
(2)vcs中要調(diào)用ucli接口,執(zhí)行腳本,必須在compile的時候,加入debug的權(quán)限:-debug,-debug_pp,-debug_all,-debug_access,-debug_region
。在run的時候,指定vcs -ucli [run_option],需要在編譯時加入?yún)?shù)以開啟ucli,否則ucli交互時只能使用簡單的 ’run’、 ‘dump’、 'quit’命令。
4、帶-
號的,一般是編譯時用的,編譯工具自帶的。(編譯選項)
帶+
號的,一般是插件,環(huán)境,驗證語言等加的,可擴(kuò)展、自定義的。
5、VCS和VCS_MX區(qū)別
VCS_MX為mixed hdl仿真器,支持vhdl+verilog+sv
的混合仿真。VCS只支持verilog, sv。在feature上唯一的區(qū)別在于對vhdl的支持。如果沒有vhdl的設(shè)計的話或許VCS好些,速度快些。
二、vcs常用指令
區(qū)分編譯步驟和仿真步驟中加上的選項,添加錯了位置選項就不起作用了
1、常用
which vcs //查看vcs的安裝路徑
vcs -help //查看vcs的編譯選項
(1)編譯文件
vlogan
:vcs的編譯指令,支持sv、v文件vhdlan
:vcs的編譯指令,支持vhdl文件-sverilog
:支持SystemVerilog的語法
-f <filename>
:指定源文件的路徑名列表,文件中可包括源代碼文件的路徑名稱,和編譯選項參數(shù)-l <filename>
:指定vcs編譯信息的存儲文件-ntb_opts uvm-1.2
:表示要引入UVM1.2的包,當(dāng)然也可以選擇使用1.0或1.1版本的,但是要注意這個選項不可缺少-full64
:在64bit模式下編譯、仿真,用于64位操作系統(tǒng)-Mupdate
:源文件有修改時,只重新編譯有改動的.v文件,節(jié)約編譯時間。-top
:設(shè)置頂層模塊+v2k
:支持Verilog-2001標(biāo)準(zhǔn)-gui
:打開仿真的圖形化界面-o <name>
:指定編譯后產(chǎn)生的可執(zhí)行文件名,默認(rèn)編譯后的文件名為simv
+incdir <directory>
:指定包含include文件的文件夾,以方便后續(xù)編譯文件時不用逐個寫出所有文件的路徑,只需將其在pkg中include一下即可??梢灾付ǘ鄠€目錄,用+字符分隔每個路徑名稱
vcs top.v //編譯verilog文件
vcs -sverilog top.sv //編譯system verilog文件,要加選項
vcs -f file.list //按照順序把源文件放到file.list里面,然后全部編譯
vcs -sverilog +incdir+filespath pkg.sv //把相關(guān)的類定義放到一個package里面,pkg里面include源文件
vcs -l compile.log -sverilog top.sv //指定編譯信息存儲到log文件
vcs –sverilog design.sv –top work.tb1 //設(shè)置頂層模塊
-R
:編譯后立即進(jìn)行仿真,如果不加這個會生成可執(zhí)行文件后就退出了
-s
:在simulation仿真剛開始時立即停止,并進(jìn)入交互模式。一般與-R和+cli配合使用
vcs cpu.v +cli+3 -R -s
-ucli
:在linux終端使用TCL控制仿真進(jìn)程(統(tǒng)一命令行界面模式)+vcs+lic+wait
:一直等待licese+licwait 100
:設(shè)置等待license的仿真超時時間+memcbk
:查看多維數(shù)組-error <number>
:編譯器遇到n個錯誤之后就停止
(2)debug選項
-debug_all
:支持所有調(diào)試-debug_pp
:同上,更加節(jié)約資源,可以dump fsdb和vpd,使能DVE、VERDI波形調(diào)試和UCLI命令行調(diào)試-debug
:使能dve、verdi波形調(diào)試和UCLI命令行調(diào)試-debug_access
:vcs -debug_access時,不需要再手動配置PLI的tab file verdi.tab 和靜態(tài)庫 pli.a,只需設(shè)置VERDI_HOME環(huán)境變量,vcs會自動查找所需文件,$fsdbDumpfile可以直接使用。
-debug_access+all 并不包含library(-v -y指定)和cell(celldefine編譯原語標(biāo)記的module,是cell module),無法PLI訪問(如uvm_hdl_write)和波形dump。加上-debug_region=cell+lib
才可以正常訪問。而-debug_all則是默認(rèn)包含library和cell。(一般library和cell為標(biāo)準(zhǔn)單元,特別是在后仿,RTL綜合成stdcell,被celldefine標(biāo)記,而且PR也加入很多buf和inv, 降低仿真速度,增加波形文件size,如果不需要可以加上+nocelldefinepli+2,只dump module instance上的port波形)
-debug_access是新推出來的選項,更好地控制仿真過程中的調(diào)試性能
也就是說,debug_all和配置PLI,或者-debug_access+all和-debug_region選項
現(xiàn)在前仿過程中不涉及工藝庫那些信息,所以就可以直接使用-debug_acc+all
?。?!就可以了!
這個鏈接講的很詳細(xì)
配置PLI的方法
VERDI_PATH = /home/xxx/synopsys/verdi-2016.06-1/share/PLI/VCS/linux64
VERDI_ARGS = ${VERDI_PATH}/novas.tab \
${VERDI_PATH}/pli.a
編譯選項加上-P ${VERDI_ARGS}
(3)目錄
這里涉及到的這三個是個庫文件相關(guān)的-v <filename>
:設(shè)置搜索設(shè)計的文件,這兩個參數(shù)和工藝庫相關(guān)-y <dir_pathname>
:指定目錄路徑,定義verilog的庫+libext+<extension>
:讓VCS在verilog庫路徑下搜索指定的擴(kuò)展名文件,與-y配合
一般使用:
- 把所有文件相對于makefile的文件路徑都寫在filelist里面,然后使用-f xxx.filelist
- 使用+incdir指定include文件所在的文件夾
(4)使用verdi時需要在vcs里面添加的編譯選項
-lca
:(Limited Customer Availability)表示使用vcs“用戶限制使用”功能,即vcs提供的一些功能,但該功能還未經(jīng)過充分驗證。-kdb
:是lca下的一個feature,其作用是在vcs two-step flow和three-step flow中生成kdb databas,是vcs支持verdi很重要的選項
這兩個命令加在一起:
vcs編譯完后生成simv.daidir庫文件,其中包含kdb.elab++文件
可以讓verdi直接打開VCS編譯之后的sim.daidir, 這樣verdi可以直接trace代碼simv.daidir
:仿真生成的verdi的庫文件,包含代碼信息;verdi可以打開rtl代碼而不需要重新編譯
-debug_access -lca -kdb //vcs編譯時加上這個選項,為了后面使用verdi
//使用kdb的幾種方法
verdi -elab ./simv.daidir/kdb
verdi -dbdir simv.daidir
verdi -simBin simv
verdi -ssf top.fsdb //加載kdb的同時加載波形,一般用這種方式
(5)仿真選項(加在sim里面)
+nospecify
:不進(jìn)行時序檢查+notimingcheck
:不進(jìn)行時序檢查,前仿為了加快仿真速度暫時不需要,兩個選項一般一起用+delay_mode_unit
:延時模型,都是在前仿用不到的一些參數(shù)+vcs+flush+all
:dump vpd的波形需要的選項+define+< macro_name>=< value>
:定義一個文本宏,與源文件中的 ifdef配合
//top文件有如下定義
initial begin
`ifdef dumpon
$dumpfile("results.vcd");
$dumpvars;
`endif
end
vcs -sverilog +define+dumpon -l compile.log top.sv //改變參數(shù)的定義
//需要修改的時候,又要重新編譯,比較麻煩
+fsdb+dumpon+500ns
:vcs編譯選項,仿真從500ns開始時dump波形+ntb_random_seed=3
:添加隨機(jī)種子
(6)其他
-simprofile
:可以記錄vcs各模塊仿真時間-override_timescale=< unit>/< preciision>
:讓源文件統(tǒng)一使用指定的timescale-timescale=<time_unit/time_precision>
:為在前面編譯且沒有`timescale的源文件指定timescale。time_unit采用就近原則,例如頂層文件定義timescale后,中間文件再次定義timescale后,則其后的文件按照中間文件定義的timescale執(zhí)行
vcs -sverilog -timescale=1ns/1ps -l compile.log top.sv
vcs -sverilog -timescale_override=1ns/1ps -l compile.log top.sv //覆蓋源代碼中的仿真時間單位和精度,不推薦使用,會把模型的時間單位覆蓋,可能導(dǎo)致模型功能錯誤
(7)完整版本
vcs -sverilog -full64 -fsdb -ntb_opts uvm-1.2 \
-debug_access+all -lca -kdb -f flist.f \
-timescale=1ns/1ps -cm line+tgl+cond+branch+assert+fsm \
-assert -LDFLAGS '-Wl,--no-as-needed' -l com.log
2、覆蓋率相關(guān)
(這部分請查看另一篇博客,單獨來講解)
覆蓋率傳送門
3、波形相關(guān)
-gui
:開啟GUI界面,否則就在linux終端顯示transcript的內(nèi)容-fsdb
:調(diào)用Verdi PLI 庫,支持fsdb 波形-i <filename>.tcl
: 啟動DVE后,在UCLI要啟動的TCL命令?;蛘咂渌奈募?,這樣就可以不重新編譯,直接進(jìn)行輸出波形等的調(diào)整,節(jié)約仿真資源
在這里可以執(zhí)行一些tcl命令
scope: 顯示當(dāng)前的頂層模塊
scope u1: 就表示進(jìn)入到當(dāng)前頂層模塊中的u1模塊,同時將u1模塊設(shè)置為頂層模塊
scope -up: 回到目前頂層模塊的上一層。
show: 顯示當(dāng)前頂層模塊的信號以及子模塊
show -value 信號 -radix hex/bin/dec:顯示信號的值 以特定的進(jìn)制顯示。
run:運行仿真run 一直運行,直到遇到$stop或者設(shè)置的斷點
run time: 運行多少時間停止(不推薦)
run -posedge: 信號 運行到信號的上升沿停止
run -negedge: 信號 運行到信號的下降沿停止
run -change: 信號 信號有變化時停止
stop: 設(shè)置斷點stop 顯示斷點
stop -posedge: 信號 在信號的上升沿設(shè)置斷點
stop -negedge: 信號 在信號的下降沿設(shè)置斷點
stop -condition {信號表達(dá)式}: 信號表達(dá)式為真的地方設(shè)置斷點
stop -delete 斷點值: 刪除斷點值的斷點
restart: 重新開啟ucli調(diào)試模式
call {系統(tǒng)任務(wù)}:調(diào)用verilog系統(tǒng)任務(wù),
finish:結(jié)束仿真
force:信號強(qiáng)制賦值
release:解除信號強(qiáng)制賦值
get:獲取信號數(shù)值
step:單步執(zhí)行
do *.do:可將很多這些UCLI命令整合到一個*.do文件內(nèi),然后以打包運行
命令 –h:顯示命令的幫助
-vcd <filename>
:將輸出VCD文件名設(shè)置為指定文件。默認(rèn)文件名為verilog.dump。Verilog源代碼中的$dumpfile系統(tǒng)任務(wù)將覆蓋此選項;-verdi
:使用verdi圖形界面+vcdfile+<filename>
:指定想要用于后期處理的VCD文件;-vpd_file <filename>
:在運行時,定義VCS寫入的VPD文件的替代名稱,而不是缺省名稱vcdplus.vpd;+define+VCS
:定義全局的VCS,編譯器在編譯時如果源文件有類似ifdef VCS等字樣,那么會執(zhí)行定義之后的代碼。+vcs+vcdpluson
:編譯選項,加入后會使能產(chǎn)生vpd文件,默認(rèn)文件名vcdplus.vpd-vpd <filename>
:打開仿真波形,一般在末尾加&,表示在后臺運行
4、仿真命令和仿真環(huán)境之間傳遞參數(shù)
4.1 宏定義
前面介紹仿真選項的有
4.2 條件編譯函數(shù) $test$plusargs
if($test$plusargs("FSDB_ON"))
:表示從命令行讀取參數(shù)并判斷是否開啟波形dump處理。如果去掉這個if判斷,就表示無條件的波形dump。當(dāng)然,正式項目開發(fā)中通常會加上條件判斷,將開關(guān)控制權(quán)留到實際做仿真時去。因為回歸驗證由于要做大量的仿真,通常是不會dump波形,只有單個testcase的調(diào)試時才會進(jìn)行仿真驗證。
仿真代碼:
initial
begin
if($test$plusargs("test1")
$readmemh("test1.dat",mem1);
if($test$plusargs("test2")
$readmemh("test2.dat",mem2);
end
仿真命令:
只需要加上即可
.... +test1 +test2
4.3 參數(shù)傳遞函數(shù) $value$plusargs
通過仿真命令向仿真環(huán)境傳遞參數(shù)
仿真代碼:
if($value$plusargs("finish=%d", finish))
begin
repeat(finish);
$display("finish=%d", finish);
$finish;
end
仿真指令:
.... +finish=3 +freq=50
三、verdi相關(guān)
輸出波形
verdi需要在testbench中添加如下代碼
initial
begin
$fsdbDumpfile("./top.fsdb"); //指定輸出波形名稱
$fsdbDumpvars(0,tb);
//輸出信號層級,0表示所有,1表示第一層,依次類推;
//tb表示例化的頂層模塊名稱
$fsdbDumpvars("+all"); //+all參數(shù),dump SV中的struct結(jié)構(gòu)體
$fsdbDumpSVA(); //將assertion的結(jié)果存存儲到fsdb中
$fsdbDumpMDA(0, top); //dump memory arrays
end
verdi:分析過程,跟蹤信號,比vcs自帶的dve功能更強(qiáng)-ssf filename.fsdb
:打開波形文件-f filelist.f -top adder
:打開rtl代碼,頂層模塊名為adder-nologo
:不顯示verdi的啟動log信息
常用的如下:
verdi -ssf test.fsdb -f filelist.f -top tb_top -ntb_opts uvm-1.2 -nologo
4.1 verdi使用方法
上面的界面:nTrace
下面的波形:nWave
(1)點擊dut里面的信號,右鍵添加到波形圖中,或者crtl+w
也可以點擊紅色圖標(biāo),打開對話框去選要添加的信號
(2)快捷命令:波形圖左擊選中部分波形
:可以放大波形按f鍵
:全屏顯示所有的波形shift+滾輪
:左右移動波形ctrl+滾輪
:放大或者縮小波形保存添加到窗口的波形
:save,保留成rc文件,方便查看追蹤信號
:選中信號,點左上面一排的綠色的向右向左的圖標(biāo)信號分組
:選中信號,按照滾輪移動信號到別的分組,或者一開始的時候就進(jìn)行分組統(tǒng)計時鐘上下升沿個數(shù)
:
切換data的進(jìn)制
:
數(shù)字/模擬信號切換
:
data有很多位,包含地址和數(shù)據(jù),可以進(jìn)行分開查看edit bus
:
查看數(shù)值logical operation
:選中信號,右鍵,最下面的選項
然后再去統(tǒng)計個數(shù),就可以知道該信號這個數(shù)值有多少次
查找信號Find Scope
:crtl+S文章來源:http://www.zghlxwxcb.cn/news/detail-680452.html
四、面試問題
1、define和 t e s t test testplusargs的區(qū)別
define
:需要在編譯之前完成變量的定義,如果需要修改的話,要重新編譯,比較麻煩$test$plusargs
:不需要重新編譯,是從命令行傳遞參數(shù)進(jìn)去$value$plusargs
:它既可以實現(xiàn)testplusargs的要求,它是能傳遞參數(shù)同時對內(nèi)部信號進(jìn)行賦值文章來源地址http://www.zghlxwxcb.cn/news/detail-680452.html
vcs +define+dumpon -sverilog
sim +test1
sim +test1=123
到了這里,關(guān)于linux環(huán)境下vcs+verdi的使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!