1. 程式人生 > >do檔案的編寫(轉)

do檔案的編寫(轉)

以前在使用ModelSim進行模擬的時候,一直是使用其GUI進行操作的,但是這樣很繁瑣也很費時。故希望學習其自動化模擬do檔案,下面是學習的一些總結。

一、編寫基本的do檔案

下面按照實際模擬的步驟來說明do檔案中需要用到的各個tcl命令。

1、quit -sim —- 退出原來的模擬工程;

2、cd —- 設定工作目錄的路徑,就是模擬工程路徑;

3、vlib work —- 在工作目錄下建立一個work目錄,請注意不要用作業系統直接新建一個work的資料夾,因為用作業系統建立的work資料夾並沒有modelsim SE自動生成的_info檔案。還有個問題是,當你的軟體工程裡需要用到軟核時,可能會需要一些庫,但這些庫ISE軟體中是沒有的,此時就需要我們自己新建庫了,並對映到當前目錄下。我們將自己新建的庫一般放在work庫前面建立;

4、vmap work /vmap work work —- 將新建的work庫對映到當前工作目錄下(當前目錄就是第一步中的目錄了),其他新建的庫也要這樣的方法對映。此處需要注意的事邏輯庫名與物理庫名最好保持一致,後面的work為物理的庫目錄,即上一步的目錄;

5、vlog +acc –work work “file_path/*.v” —- 編譯“file_path”目錄下所有.v檔案,並將其新增進工作庫(work)中,包括IP生成的V檔案也要編譯的。編譯時可以分開單獨編譯,但是一定要注意順序,先編譯被呼叫的檔案。其中的“-work work”是將後面的原始檔編譯到哪個庫中,如果是編譯到預設的work庫中,則也可以不寫該引數。若只想編譯其中某些檔案,則可以直接寫出這些檔案的名字,比如下面兩種寫法等效:

vlog div.v div_tb.v 
vlog -work work div.v div_tb.v

若是要編譯基本器件庫,可參照下面的例子:

vlib verilog_libs/altera_ver 
vmap altera_ver ./verilog_libs/altera_ver 
vlog -vlog01compat -work altera_ver {d:/quartus9.0/quartus/eda/sim_lib/altera_primitives.v 
vlog後面的兩個引數“-vlog01compat”、“-work”是固定的。其中“-work”是必須保留的,“-vlog01compat”則在原始檔為verilog檔案時可以保留,如果為VHDL檔案則不能使用該引數。需要注意的一點是該工程目錄下的“verilog_libs”庫資料夾需要手動建立,否則執行會出現錯誤。 
需要編譯的檔案有兩種:原始碼檔案、庫檔案。對於庫檔案的編譯可以有兩種處理方式: 
1、將這些庫檔案與原始碼檔案一起編譯到work庫中,這樣比較方便省事; 
2、將庫檔案單獨編譯到一個庫中,在執行的時候需要通過引數設定來將庫選擇上。由於第一種方式較為簡單,後面將採用第二種方式。 
當某一路徑會經常用到時,可以通過設定一個路徑變數來儲存該路徑,示例如下: 
set LIBPATH c:/altera/11.0/quartus/eda/sim_lib/ 
vlib sim_lib 
vmap sim_lib sim_lib 
vlog -work sim_lib 

LIBPATH/alteramf.vvlog−worksimlib">LIBPATH/alteramf.vvlogworksimlibLIBPATH/alteramf.vvlog−worksimlibLIBPATH/altera_primitives.v 
vlog命令負責編譯verilog檔案,如果是VHDL檔案,則需要將vlog命令換成vcom命令。 
在該命令中,如果想要include某個檔案,則可以通過vlog的incdir選項來實現,比如: 
vlog +incdir+d:/work

6、vsim -novopt -quiet -c -L altera_ver -L E:/modeltech_6.6a/Xilinx_lib_edk/unimacro_ver -lib work div -t 1ns -do “run 2084655ns” —- 啟動模擬命令,該命令可以有許多引數。

引數“-L altera_ver”是新增模擬庫,該處是直接使用邏輯庫名稱,也可以像後面一樣使用物理庫的名稱及路徑;若是庫與原始檔一起編譯到work庫中的,則不需要該引數; 
引數“-t 1ns”表示模擬時間單位為1ns; 
引數“-novopt”禁止優化(no vopt),可能會因為vopt的緣故使得一些不重要signal被modelsim自動忽略,一般會保留該引數; 
引數“-do”表示執行時間,該引數一般不用,在後面再執行該命令; 
引數“-c”表示進入命令列模式,如果沒有該引數,則表示進行GUI模式。 
預設工作庫為work,因而下面幾種寫法等效: 
vsim div_tb 
vsim -lib work div_tb 
vsim work.div_tb 
sim -L D:/Modelsim/Installfiles/altera/altera_mf work.videoin_tb

7、view signals source wave —- 開啟signal、source、wave視窗,也可以只打開wave視窗;

8、delete wave * —- 刪除原來wave視窗中的波形;

9、add wave -binary clk rst —- 打新增要觀察的波形訊號,clk、rst為tb的頂層訊號名,若要新增內部訊號則要給出路徑,-binary表示使用二進位制顯示;

新增一個模組的所有訊號則可以用下面的方式: 
add wave -dec sim:/div_tb/* 
若只是要新增單個訊號,則把“*”換成對應的訊號即可,比如: 
add wave -unsigned sim:/div_tb/clk 
在wave視窗中,可以對波形進行相關配置,下面是常用的配置命令: 
WaveRestoreCursors {{Cursors 1} {200ns} 0} {{Cursors 2} {400ns} 0} 
configure wave -rowmargin 4 
configure wave -childrowmargin 2 
configure wave -namecolwidth 150 
configure wave -valuecolwidth 100 
configure wave -signalnamewidth 0 
configure wave -justifyvalue left 
configure wave -snapdistance 10 
configure wave -datasetprefix 0 
configure wave -gridoffset 0 
configure wave -gridperiod 1 
configure wave -griddelta 40 
configure wave -timeline 0 
update 
WaveRestoreZoom {0 ns} {1000 ns} 
如果所有訊號均採用同一種方式顯示,則可以用如下方式設定,就不必要在每次新增訊號時設定顯示引數: 
radix -hex

10、run 5000/run @5000 —- 開始執行模擬程式;

沒有“@”則表示在當前時刻繼續執行5000個單位時間; 
有“@”則表示執行到5000這個時刻,如果當前程式模擬已經執行到了5000以後的時刻,則該方法不會繼續向後執行,而會彈出一個錯誤資訊,提示當前模擬時刻已經超過了該數值。 
run -all則表示一直執行,直到手動停止。 
在5000後面也可以跟上一個單位,不跟單位時則以模擬的最小單位為基準。

11、quit -f/quit -sim —- 引數為“f”時則結束ModelSim,引數為“sim”時則結束該模擬程序。

下圖是我寫的一個do檔案的截圖,能夠正確執行。 
這裡寫圖片描述

這裡只是編寫了基本的do檔案,需要在ModelSIm的Transcipts視窗輸入相應的命令才可以執行。 
1、cd filepath —-進入do檔案所在的目錄; 
2、do filename.do —-執行do檔案,開始模擬。

二、進行優化

還可以對上面的流程進行優化,真正達到自動模擬,使得模擬更有效率。 
1、批處理bat檔案 —- 直接執行該檔案即可啟動模擬,而不需要首先進入ModelSim啟動do檔案;該方法還未實驗成功。 
2、單獨的檔案儲存檔案路徑 —-當有多個不同的檔案路徑時,為使do檔案更加簡潔,可以將所有路徑儲存在一個檔案中。該方法也未實驗成功。 
我是按照Modelsim中常用的Tcl命令中的方法實驗的,以後有時間再來看看怎麼弄這個。 
三、互動式命令 
通過在主視窗的命令視窗輸入命令來實現,具有更好的除錯和互動功能,提供多種指令,既可以是單步指令,也可以構成批處理檔案,用來控制編輯、編譯和模擬流程。 
1、force-repeat 
指令格式:force 開始時間開始電平值,結束電平值忽略時間(即0電平保持時間) -repeat 週期 
force clk 0 0,1 30 -repeat 100 表示強制clk從0時間單元開始,起始電平為0,結束電平為1,0電平保持時間為30個預設時間單元,週期為100個預設時間單元,佔空比為70%。 
指令功能:每隔一段的週期重複一定的force命令,用來產生時鐘訊號,也可用來產生週期的輸入訊號,如01010101,00110011等。 
2、force 
指令格式:force item_name value time,value time;item_name為埠訊號或內部訊號,支援萬用字元號,但只能匹配一個;value不能預設,time,可選項,支援時間單元; force din 16#40900000 從當前時刻起給din賦值16進位制40900000; force bus 16#F @100ns 在100ns時刻給bus賦值16進位制F; force clr 1 100 經歷100個預設時間單元延遲後為clr賦值1; 
force clr 1,0 100 表示clr賦值1後,經歷100個預設時間單元延遲後為clr賦值為0。 
3、run 
指令格式:run timestepstime_unit,timesteps時間步長,time_unit時間單元,可以是fs、ps、ns、us、ms、sec; 
指令功能:執行(模擬)並指定時間及單元; 
run 100,表示執行100個預設時間單元; 
run 2500ns,表示執行2500ns; 
run -all,表示執行全過程; 
run -continue,表示繼續執行。 
4、force-cancel 
指令格式:force-cancel period 
指令功能:執行period週期時間後取消force命令; 
force clk 0 0,1 30 -repeat 60-cancel 1000,表示強制clk從0時刻開始,直到1000個時間單元結束。 
5、view 
指令格式:view 視窗名 
指令功能:開啟Modelsim的視窗 
view souce,開啟原始碼視窗; 
view wave,開啟波形視窗; 
view list,開啟列表視窗; 
view varibles,開啟變數視窗; 
view signals,開啟訊號視窗; 
view all,開啟所有視窗。