模擬是IC設計不可或缺的重要步驟,模擬後一般需要記錄下波形檔案,用於做詳細分析和研究。說一下幾種波形檔案WLF(Wave Log File)、VCD(Value Change Dump)檔案,fsdb(Fast Signal DataBase)檔案、shm、vpd:
1、對於WLF波形記錄檔,只要我們使用過modelsim,應該都很熟。WLF(Wave Log File) 是Mentor Graphics 公司Modelsim支援的波形檔案。但我們在波形視窗觀察波形時,模擬結束時都會產生一個*.wlf的檔案(預設是vsim.wlf)。我們下次就可以通過通過modelsim直接開啟這個儲存下來的波形。vsim -view vsim.wlf -do run.do 其中run.do中的內容為要查看的波形訊號。要強調的是這個wlf檔案只能是由modelsim來產生,也只能通過modelsim來顯示。不是一個通用的檔案檔案格式。
2、VCD (Value Change Dump)是一個通用的格式。 VCD檔案是IEEE1364標準(Verilog HDL語言標準)中定義的一種ASCII檔案。它主要包含了頭資訊,變數的預定義和變數值的變化資訊。正是因為它包含了訊號的變化資訊,就相當於記錄了整個模擬的資訊,我們可以用這個檔案來再現模擬,也就能夠顯示波形。因為VCD是 Verilog HDL語言標準的一部分,因此所有的verilog的模擬器都要能夠實現這個功能,也要允許使用者在verilog代碼中通過系統函數來dump VCD檔案。我們可以通過Verilog HDL的系統函數dumpvars的參數來規定我們抽取模擬中某些特定模組和訊號的資料。
特別說明的一點是,正是因為VCD記錄了訊號的完整變化資訊,我們還可以通過VCD檔案來估計設計的功耗,而這一點也是其他波形檔案所不具備的。Encounter 和 PrimeTime PX (Prime Power)都可以通過輸入網表檔案,帶功耗資訊的庫檔案以及模擬後產生的VCD檔案來實現功耗分析。
因為VCD是Verilog HDL語言標準的一部分,因此所有的verilog的模擬器都要能實現這個功能。因此我們可以在verilog代碼中通過系統函數來dumpVCD檔案。另外,我們可以通過modelsim 命令來dump VCD檔案,這樣可以擴充到VHDL中。具體的命令: vcd file myfile.vcd
vcd add /test/dut/* 這個就產生一個含dut下所有訊號的VCD資料資訊。 我們在使用來進行模擬 vsim -vcdstim myfile.com
test;add wave /*;run -all;
或在testbench中加入:
initial
begin
$dumpfile("*.vcd");
$dumpvars(0,**);
end
3、fsdb(Fast Signal DataBase) 是Spring Soft (Novas)公司 Debussy / Verdi 支援的波形檔案,一般較小,使用較為廣泛,其餘模擬工具如ncsim,modlesim等等可以通過載入Verdi 的PLI (一般位於安裝目錄下的share/pli 目錄下) 而直接dump fsdb檔案。fsdb檔案是verdi使用一種專用的資料格式,類似於VCD,但是它是只提出了模擬過程中訊號的有用資訊,除去了VCD中資訊冗餘,就 像對VCD資料進行了一次huffman編碼。因此fsdb資料量小,而且會提高模擬速度。我們知道VCD檔案使用verilog內建的系統函數來實現 的,fsdb是通過verilog的PLI介面來實現的。fsdbDumpvars等
Testbench中加入:
initial
begin
$fsdbDumpfile("*.fsdb");
$fsdbDumpvars(0,**);
end 其餘波形檔案就是各家不同的模擬或調試工具支援的檔案類型,互不通用,但基本都可以由VCD檔案轉換而來(其實就是VCD檔案的壓縮版,因為只取模擬調試需要的資料,所以檔案大小要遠小於原始VCD檔案),有的還提供與VCD檔案的互轉換功能。
4、shm 是Cadence公司 NC verilog 和Simvision支援的波形檔案,實際上 .shm是一個目錄,其中包含了.dsn和.trn兩個檔案。
5、vpd 是Synopsys公司 VCS DVE支援的波形檔案,可以用$vcdpluson產生。
通過使用Cadence NC Verilog 對同一testcase和相同dump波形條件的比較,產生shm檔案的時間最短(廢話,本來就是一個公司的),產生vcd檔案的時間數倍於產生shm和 fsdb的時間。在筆者測試的例子中,產生的fsdb檔案為十幾MB,shm檔案為幾十MB,而vcd檔案則要幾個GB的大小。
fsdb的一些用法:
(1)下面是一個列表,提示了fsdb 的各種可能用法,具體的內容大家可以Google 一把,就都出來了。
fsdbDumplimit - 限制FSDB 檔案size 如何使用?
$fsdbDumpvars([], <scope | signal>*)
fsdbDumpfile - 指定FSDB 檔案名稱
$fsdbDumpfile(“”)
fsdbDumpvars - Dump 指定的變數
fsdbDumpSingle - Dump 指定的訊號
fsdbDumpvariable - Dump 指定的VHDL 變數
fsdbSwitchDumpFile - 將dumping 切換到另一個FSDB 檔案
$fsdbSwitchDumpFile(“”)
fsdbAutoSwitchDumpfile - 限制檔案大小並在資料量過大時自動建立新的FSDB 檔案
$fsdbAutoSwitchDumpfile(, “”,< number of file>)
fsdbDumpflush - Force to Dump Result to FSDB file
fsdbDumpMem - Dump 指定的memory 的內容
$fsdbDumpMem(, [, []])
$fsdbDumpon - 開啟 FSDB dumping
$fsdbDumpoff - 關閉 FSDB dumping
(1)一個自由開關FSDB 的方法
有時候要運行很長時間的模擬,但是關心的波形卻只是其中一小段。這個時候怎麼來開關波形,使檔案不至於太過龐大呢?這裡介紹一個方法。樣本僅供參考,大家可以結合實際應用創造出更加多樣的變化來。
initial begin
$timeformat(...);
$fsdbAutoSwitchDumpfile(...);
$fsdbDumpvars(...);
// 條件運算式1
$fsdbDumpoff;
// 條件運算式2
$fsdbDumpon;
End
( 2 )、我們比較常用的一般還有plusargs 這個task,在test_top 中:
plusargs("casename=%s",casename)
通過指令碼在run 的時候把casename 傳遞進去(給vcs/nc SIM_ARG: +casename=$Testcase_name.fsdb)
便於如果同時跑多個testcase 的時候可以同時dumpfsdb,另外就是跳過一些時間開始
dump(SIM_ARG: +time=$start_time)
plusargs("time=%d",skip)
#skip
(3)、project 中每個人關注的module 不同,為了頻繁去修改test_top 的dump,一般也會把需要dump 的內容用dumplist
的file 來實現
$fsdbDumpvarsToFile("dump.list");
比如dump.list 內容 #用於注釋) 0 test_top
#1 test_top
#0 test_top.dut
#0 test_top.dut.m1
#0 test_top.dut.m2
用的時候一般是在test_top.v 添加相關的語句:
reg [100:0] casename;
integer skip, i;
initial begin
if( plusargs("dumpfsdb") ) begin
if( plusargs("time=%d", skip) )
#skip;
if( plusargs ("casename=%s",casename) )
$fsdbAutoSwitchDumpfile(300, casename, 30);
else
$fsdbAutoSwitchDumpfile(300,"./test_top.fsdb",40);
$fsdbDumpvarsToFile("dump.list");
end
end
跑模擬的時候,對應的如果要從5000ns(時間單位根timescale 有關)處開始dump 波形,給vcs/nc 的參數
+dumpfsdb +time= 5000 +casename= testcase1.fsdb
其中的testcase1 一般我們都會在指令碼處理後跟case 名字關聯起來,這樣子跑完之後就會從5000 開始dump
testcase1_000.fsdb, testcase1_001.fsdb 這樣子,
- 另外那個dump.list(名字可以隨便取)裡面的設定就跟平常的設定dump 的層次設定一樣了
層次 路徑名
0 test_top.dut.m1
例子:
//=================
// dump FSDB wave
interger start_dump;
integer stop_dump;
integer finish_time;
integer result;
reg [830-1 : 0] waveform_name;
initial begin:fsdb_dump
start_dump = 0;
finish_time = 0;
waveform_name = "debussy.fsdb";
if (plusargs("FSDB"))
begin
if(plusargs("DUMP_FILE"))
result = plusargs("DUMP_FILE=%s",waveform_name);
$fsdbAutoSwitchDumpfile(150,waveform_name,100);
$fsdbDumpflush;
#start_dump;
//select dump signals
$fsdbDumpvars(0,xx_tb);
end
end
各種波形檔案VCD,VPD,SHM,FSDB產生的方法