各種波形檔案VCD,VPD,SHM,FSDB產生的方法-阿里云

3,672 阅读4分钟

模擬是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的系統函數dumpfile來產生波形,通過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

  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介面來實現的。fsdbDumpfile,fsdbDumpfile,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 )、我們比較常用的一般還有valuevalueplusargs 這個task,在test_top 中:

valuevalueplusargs("casename=%s",casename)

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

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

dump(SIM_ARG: +time=$start_time)

valuevalueplusargs("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( testtestplusargs("dumpfsdb") ) begin

if( valuevalueplusargs("time=%d", skip) )

#skip;

if( valuevalueplusargs ("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 這樣子,

  1. 另外那個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 (testtestplusargs("FSDB"))

    begin

      if(testtestplusargs("DUMP_FILE"))

         result = valuevalueplusargs("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產生的方法

相关文章: Win7提示“色彩配置已更改為Windows7 Basic”怎麼辦?