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