各種波形文件vcd,vpd,shm,fsdb生成的方法(zz)


仿真是IC設計不可或缺的重要步驟,仿真后一般需要記錄下波形文件,用於做詳細分析和研究。說一下幾種波形文件WLF(Wave Log File)、VCD(Value Change Dump)文件,fsdb(Fast Signal DataBase)文件、shm、vpd:

 

對於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來顯示。不是一個通用的文件文件格式。

 

 

 

VCD (Value Change Dump)是一個通用的格式。 VCD文件是IEEE1364標准(Verilog HDL語言標准)中定義的一種ASCII文件。它主要包含了頭信息,變量的預定義和變量值的變化信息。正是因為它包含了信號的變化信息,就相當於記錄了整個仿真的信息,我們可以用這個文件來再現仿真,也就能夠顯示波形。因為VCD是 Verilog HDL語言標准的一部分,因此所有的verilog的仿真器都要能夠實現這個功能,也要允許用戶在verilog代碼中通過系統函數來dump VCD文件。我們可以通過Verilog HDL的系統函數$dumpfile 來生成波形,通過$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

 

 

 

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接口來實現的。$fsdbDumpfile,$fsdbDumpvars等

 

 Testbench中加入:

 

 initial

 

begin

 

$fsdbDumpfile("*.fsdb");

 

$fsdbDumpvars(0,**);

 

end

 

其余波形文件就是各家不同的仿真或調試工具支持的文件類型,互不通用,但基本都可以由VCD文件轉換而來(其實就是VCD文件的壓縮版,因為只取仿真調試需要的數據,所以文件大小要遠小於原始VCD文件),有的還提供與VCD文件的互轉換功能。

 

 

 

shm 是Cadence公司 NC verilog 和Simvision支持的波形文件,實際上 .shm是一個目錄,其中包含了.dsn和.trn兩個文件。

 

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([<level>], <scope | signal>*)

fsdbDumpfile - 指定FSDB 文件名

$fsdbDumpfile(“<FSDB name>”)

fsdbDumpvars - Dump 指定的變量

fsdbDumpSingle - Dump 指定的信號

fsdbDumpvariable - Dump 指定的VHDL 變量

fsdbSwitchDumpFile - 將dumping 切換到另一個FSDB 文件

$fsdbSwitchDumpFile(“<new FSDB name>”)

fsdbAutoSwitchDumpfile - 限制文件大小並在數據量過大時自動創建新的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

(1)一個自由開關FSDB 的方法

有時候要運行很長時間的仿真,但是關心的波形卻只是其中一小段。這個時候怎么來開關波形,使文件不至於太過龐大呢?這里介紹一個方法。示例僅供參考,大家可以結合實際應用創造出更加多樣的變化來。

 

initial begin

$timeformat(...);

$fsdbAutoSwitchDumpfile(...);

$fsdbDumpvars(...);

// 條件表達式1

$fsdbDumpoff;

// 條件表達式2

$fsdbDumpon;

End

( 2 )、我們比較常用的一般還有$value$plusargs 這個task,在test_top 中:

$value$plusargs("casename=%s",casename)

通過腳本在run 的時候把casename 傳遞進去(給vcs/nc SIM_ARG: +casename=$Testcase_name.fsdb)

便於如果同時跑多個testcase 的時候可以同時dumpfsdb,另外就是跳過一些時間開始

dump(SIM_ARG: +time=$start_time)

$value$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( $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 的參數

+dumpfsdb +time= 5000 +casename= testcase1.fsdb

其中的testcase1 一般我們都會在腳本處理后跟case 名字關聯起來,這樣子跑完之后就會從5000 開始dump

testcase1_000.fsdb, testcase1_001.fsdb 這樣子,

2. 另外那個dump.list(名字可以隨便取)里面的設定就跟平常的設定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

轉載自:http://www.cnblogs.com/zeushuang/archive/2012/11/14/2769640.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM