芯片驗證波形文件詳解
時間:2021-11-11 14:50:29
手機看文章
掃描二維碼
隨時隨地手機看文章
[導讀]波形文件一般用于仿真后記錄波形文件,用于做詳細分析和研究。說一下幾種波形文件WLF(WaveLogFile)、VCD(ValueChangeDump)文件,fsdb(FastSignalDataBase)文件、shm、vpd。WLF?(WaveLogFile)?MentorGra...
波形文件一般用于仿真后記錄波形文件,用于做詳細分析和研究。說一下幾種波形文件WLF(Wave Log File)、VCD(Value Change Dump)文件,fsdb(Fast Signal DataBase)文件、shm、vpd。
WLF?(Wave Log File)?
Mentor Graphics 公司Modelsim支持的波形文件。在modelsim波形窗口觀察波形時,仿真結束時都會生成一個*.wlf的文件(默認是vsim.wlf),可以用modelsim直接打開,命令如下:
其中,run.do中的內容為要查看的波形信號。這個wlf文件只能由modelsim來生成,也只能通過modelsim來顯示。不是一個通用的文件格式。?VCD(Value Change Dump)IEEE1364標準(verilog?hdl語言標準)中定義的一種ASCII文件,是通用的文件格式。它主要包含了頭信息,變量的預定義和變量值的變化信息。正是因為它包含了信號的變化信息,就相當于記錄了整個仿真的信息,我們可以用這個文件來再現(xiàn)仿真,也就能夠顯示波形。因為VCD是 Verilog HDL語言標準的一部分,因此所有的verilog的仿真器都能夠查看該文件,允許用戶在verilog代碼中通過系統(tǒng)函數(shù)來dump VCD文件。
我們可以通過Verilog HDL的系統(tǒng)函數(shù)$dumpfile 來生成波形,通過$dumpvars的參數(shù)來規(guī)定我們抽取仿真中某些特定模塊和信號的數(shù)據(jù)。示例如下:
我們可以通過modelsim 命令來dump VCD文件,這樣可以擴展到VHDL中。具體的命令:
特別說明的一點是,正是因為VCD記錄了信號的完整變化信息,我們還可以通過VCD文件來估計設計的功耗,而這一點也是其他波形文件所不具備的。Encounter 和 PrimeTime PX (Prime Power)都可以通過輸入網(wǎng)表文件,帶功耗信息的庫文件以及仿真后產(chǎn)生的VCD文件來實現(xiàn)功耗分析。
FSDB (Fast Signal DataBase)Spring Soft (Novas)公司 Debussy / Verdi 支持的波形文件,一般較小,使用較為廣泛,其余仿真工具如ncsim,modlesim 等可以通過加載Verdi 的PLI (一般位于安裝目錄下的share/pli 目錄下)?而直接dump fsdb文件。
fsdb文件是verdi使用一種專用的數(shù)據(jù)格式,類似于VCD,但是它是只提出了仿真過程中信號的有用信息,除去了VCD中信息冗余,就像對VCD數(shù)據(jù)進行了一次huffman編碼。因此fsdb數(shù)據(jù)量小,而且會提高仿真速度。我們知道VCD文件使用verilog內置的系統(tǒng)函數(shù)來實現(xiàn)的,fsdb是通過verilog的PLI接口來實現(xiàn)的,例如$fsdbDumpfile, $fsdbDumpvars等。示例如下:
?shm
Cadence公司 NC verilog 和Simvision支持的波形文件,實際上 .shm是一個目錄,其中包含了.dsn和.trn兩個文件。使用NC Verilog 對同一testcase和相同dump波形條件的比較,產(chǎn)生shm文件的時間最短(廢話,本來就是一個公司的),產(chǎn)生vcd文件的時間數(shù)倍于產(chǎn)生shm和 fsdb的時間。在筆者測試的例子中,產(chǎn)生的fsdb文件為十幾MB,shm文件為幾十MB,而vcd文件則要幾個GB的大小。
vpd
Synopsys公司 VCS DVE支持的波形文件,可以用$vcdpluson產(chǎn)生。
其余波形文件
就是各家不同的仿真或調試工具支持的文件類型,互不通用,但基本都可以由VCD文件轉換而來(其實就是VCD文件的壓縮版,因為只取仿真調試需要的數(shù)據(jù),所以文件大小要遠小于原始VCD文件),有的還提供與VCD文件的互轉換功能。
?******************************************************************************fsdb的一些用法:1、下面是一個列表,提示了fsdb 的各種可能用法,具體的內容大家可以Google 一把,就都出來了。
便于如果同時跑多個testcase 的時候可以同時dumpfsdb,另外就是跳過一些時間開始
2. 另外那個dump.list(名字可以隨便?。├锩娴脑O定就跟平常的設定dump 的層次設置一樣了
例子:
WLF?(Wave Log File)?
Mentor Graphics 公司Modelsim支持的波形文件。在modelsim波形窗口觀察波形時,仿真結束時都會生成一個*.wlf的文件(默認是vsim.wlf),可以用modelsim直接打開,命令如下:
vsim -view vsim.wlf -do run.do |
我們可以通過Verilog HDL的系統(tǒng)函數(shù)$dumpfile 來生成波形,通過$dumpvars的參數(shù)來規(guī)定我們抽取仿真中某些特定模塊和信號的數(shù)據(jù)。示例如下:
// 在testbench中加入以下內容 initial begin $dumpfile("*.vcd"); $dumpvars(0,**); end |
vcd file myfile.vcd vcd add /test/dut/* # 生成一個含dut下所有信號的VCD數(shù)據(jù)信息) vsim -vcdstim myfile.com # 使用VCD來進行仿真 )
test;add wave /*;run -all; |
FSDB (Fast Signal DataBase)Spring Soft (Novas)公司 Debussy / Verdi 支持的波形文件,一般較小,使用較為廣泛,其余仿真工具如ncsim,modlesim 等可以通過加載Verdi 的PLI (一般位于安裝目錄下的share/pli 目錄下)?而直接dump fsdb文件。
fsdb文件是verdi使用一種專用的數(shù)據(jù)格式,類似于VCD,但是它是只提出了仿真過程中信號的有用信息,除去了VCD中信息冗余,就像對VCD數(shù)據(jù)進行了一次huffman編碼。因此fsdb數(shù)據(jù)量小,而且會提高仿真速度。我們知道VCD文件使用verilog內置的系統(tǒng)函數(shù)來實現(xiàn)的,fsdb是通過verilog的PLI接口來實現(xiàn)的,例如$fsdbDumpfile, $fsdbDumpvars等。示例如下:
// Testbench中加入以下內容 initial begin $fsdbDumpfile("*.fsdb"); $fsdbDumpvars(0,**); end |
Cadence公司 NC verilog 和Simvision支持的波形文件,實際上 .shm是一個目錄,其中包含了.dsn和.trn兩個文件。使用NC Verilog 對同一testcase和相同dump波形條件的比較,產(chǎn)生shm文件的時間最短(廢話,本來就是一個公司的),產(chǎn)生vcd文件的時間數(shù)倍于產(chǎn)生shm和 fsdb的時間。在筆者測試的例子中,產(chǎn)生的fsdb文件為十幾MB,shm文件為幾十MB,而vcd文件則要幾個GB的大小。
vpd
Synopsys公司 VCS DVE支持的波形文件,可以用$vcdpluson產(chǎn)生。
其余波形文件
就是各家不同的仿真或調試工具支持的文件類型,互不通用,但基本都可以由VCD文件轉換而來(其實就是VCD文件的壓縮版,因為只取仿真調試需要的數(shù)據(jù),所以文件大小要遠小于原始VCD文件),有的還提供與VCD文件的互轉換功能。
?******************************************************************************fsdb的一些用法:1、下面是一個列表,提示了fsdb 的各種可能用法,具體的內容大家可以Google 一把,就都出來了。
fsdbDumplimit - 限制FSDB 文件size 如何使用?
$fsdbDumpvars([<level>], <scope | signal>*)
fsdbDumpfile - 指定FSDB 文件名
$fsdbDumpfile(“<FSDB name>”)
fsdbDumpvars - Dump 指定的變量
fsdbDumpSingle - Dump 指定的信號
fsdbDumpvariable - Dump 指定的VHDL 變量
fsdbSwitchDumpFile - 將dumping 切換到另一個FSDB 文件
$fsdbSwitchDumpFile(“<new FSDB name>”)
fsdbAutoSwitchDumpfile - 限制文件大小并在數(shù)據(jù)量過大時自動創(chuàng)建新的FSDB 文件
$fsdbAutoSwitchDumpfile(<file size>, “<FSDB name>”,< number of file>)
fsdbDumpflush - Force to Dump Result to FSDB file
fsdbDumpMem - Dump 指定的memory 的內容
$fsdbDumpMem(<reg name>, [<start addr>, [<size>]])
$fsdbDumpon - 打開 FSDB dumping
$fsdbDumpoff - 關閉 FSDB dumping
2、一個自由開關FSDB 的方法,有時候要運行很長時間的仿真,但是關心的波形卻只是其中一小段。這個時候怎么來開關波形,使文件不至于太過龐大呢?這里介紹一個方法。示例僅供參考,大家可以結合實際應用創(chuàng)造出更加多樣的變化來。initial begin
$timeformat(...);
$fsdbAutoSwitchDumpfile(...);
$fsdbDumpvars(...);
// 條件表達式1
$fsdbDumpoff;
// 條件表達式2
$fsdbDumpon;
end
3、我們比較常用的一般還有$value$plusargs 這個task,在test_top 中:$value$plusargs("casename=%s",casename)
通過腳本在run 的時候把case name 傳遞進去(給vcs/nc SIM_ARG: casename=$Testcase_name.fsdb)便于如果同時跑多個testcase 的時候可以同時dumpfsdb,另外就是跳過一些時間開始
dump(SIM_ARG: time=$start_time)
$value$plusargs("time=%d",skip)
#skip
4、project 中每個人關注的module 不同,為了頻繁去修改test_top 的dump,一般也會把需要dump 的內容用dumplist的file 來實現(xiàn)$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( $test$plusargs("dumpfsdb") ) begin
if( $value$plusargs("time=%d", skip) )
#skip;
if( $value$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 的參數(shù) dumpfsdb? time=?5000? casename=?testcase1.fsdb
其中的testcase1 一般我們都會在腳本處理后跟case 名字關聯(lián)起來,這樣子跑完之后就會從5000 開始dump testcase1_000.fsdb, testcase1_001.fsdb 這樣子,2. 另外那個dump.list(名字可以隨便?。├锩娴脑O定就跟平常的設定dump 的層次設置一樣了
層次 路徑名
0 test_top.dut.m1
例子:
//=================
// dump FSDB wave
interger start_dump;
integer stop_dump;
integer finish_time;
integer result;
reg [8*30*-1 : 0] waveform_name;
initial begin:fsdb_dump
start_dump = 0;
finish_time = 0;
waveform_name = "debussy.fsdb";
if ($test$plusargs("FSDB"))
begin
if($test$plusargs("DUMP_FILE"))
result = $value$plusargs("DUMP_FILE=%s",waveform_name);
$fsdbAutoSwitchDumpfile(150,waveform_name,100);
$fsdbDumpflush;
#start_dump;
//select dump signals
$fsdbDumpvars(0,xx_tb);
end
end