1. 程式人生 > >Modelsim之 DO檔案簡介

Modelsim之 DO檔案簡介

 網上的關於DO檔案的編寫好像資料不多,比較雜,所以本人總結一下常用的簡單語法,方便大家檢視。其實本人也剛接觸DO檔案沒多久,有紕漏很正常,歡迎指正批評,互相學習。PS:寫得有點亂

  還有一個值得注意的是 我在看到這篇文章的時候我正在模擬一個verilog檔案,檔案中呼叫了一個ROM , 但是我怎麼模擬 rom的輸出檔案都有問題, 經過一個QQ好友的指點,我發現竟然是我 QUARTUS 下考過來的庫檔案 有問題, 自此提醒遇到過此問題 但還沒有解決的同學。。

一.DO檔案的簡介和工作方式

DO檔案是一次執行多條命令的指令碼。這個指令碼可以像帶有相關引數的一系列ModelSim命令一樣簡單,或者是帶有變數,執行條件等等的Tcl程式。可在GUI裡或系統命令提示符後執行Do檔案。

由於TCL指令碼語言內容很多,本人是剛學不久,菜鳥一個。但是針對我們這門課程的話,有些基本常用的語法還是值得提一下的,方便大家一起學習交流,如果以下內容有什麼寫錯了,希望大家提出並批評,互相進步。

首先,我們如何建立DO檔案呢?

方法挺多,一種是可以開啟Modelsim,執行File/New/Source/Do命令,進入Do檔案編輯方式,在編輯視窗輸入模擬批處理檔案的程式碼,以.do為副檔名儲存檔案。當然也可以在windows系統中新建一個記事本,在“另存為”的時候寫上.do的字尾名,也是一種方法。 呼叫方式是在Modelsim的Transcript視窗中使用指令:do filename.do,完成對設計的自動化模擬。

下面簡單講講模擬的步驟。首先我們要對一個設計進行模擬呢,我們一般需要進行以下幾個步驟:

①建立一個工程和工程庫;

②載入設計檔案(包括你編寫好的testbench);

③編譯原始檔;

④執行模擬,並檢視結果;

⑤最後進行工程除錯。

         而do檔案,就是把上述的步驟①---④用tcl指令碼語言來編寫出來,讓Modelsim來執行該do檔案巨集命令,並自動執行模擬的步驟。這種好處也許在小設計中沒怎麼表現,但是如果在一個大的工程中,常常需要對一個設計單元進行反覆的除錯和模擬,但是模擬時的設定是不變的,這時如果使用了do檔案,把模擬中使用到的命令都儲存下來了,就可以節省大量的人力,提高了工作效率。

下面將對照一個簡單的例子counter.do,講一下我們常用的一些基本指令。

PS:  do檔案的註釋是由#開始的,但不可以在程式碼行後面新增,只能另起一行。

正確的是:

vlib work  

#新建一個work庫

錯誤的是:

vlib work  #新建一個work庫

編寫名為counter.do的檔案,其內容為下
vlib  work (對應模擬步驟①:新建work庫。該命令的作用是在當前目錄下建立一個work目錄,請注意不要直接在windows中新建一個work的資料夾,因為用作業系統建立的work資料夾並沒有ModelSim SE自動生成的_info檔案。)
vmap work  work(對應模擬步驟①:該命令的作用是將目前的邏輯工作庫work和實際工作庫work對映對應。也可以直接用指令“vmap work”表示將work庫對映到當前工作目錄下。)
vlog counter.v  counter_tb.v (對應模擬步驟②③:編譯counter.v和counter_tb.v檔案,預設編譯到work庫下。該命令的作用是編譯這些檔案,要注意的是檔案可以單獨分開編譯,但是一定要先編譯被呼叫的檔案。假如是VHDL檔案,只需要把指令vlog換成vcom即可。)
vsim  work.counter_tb  -t 1ns (對應模擬步驟④:模擬work庫中名為counter_tb的模組,最小時間單位為1ns。)
add  wave/counter_tb/ * (該命令的作用是將testbench檔案camera_tb.v中模組camera_tb下所有的訊號變數加到波形檔案中去,注意在“*”前要加空格。這時候你也可以看到wave檔案被開啟。當然也可以單個訊號的新增,例如新增時鐘:add wave clk 等等。)
run 2000  (該命令的作用是執行2000個單位時間的模擬。也可以用run –all命令來一直模擬下去。)

這時候就可以在wave視窗檔案中看到你的模擬結果。當然也可以觀察其它視窗的結果,用view *命令顯示 。view *命令可以觀察包括signals、wave、dataflow等視窗檔案,也可以分別開啟。例如用view signals來觀察訊號變數。

以上就是do檔案的一些基本TCL指令碼語言的使用,寫得比較簡單,但是其實複雜的也就是在新增訊號線那裡add wave 有比較多的引數設定而已,主要的指導模擬流程的指令還是這幾條。

編寫好DO檔案之後,在Modelsim中,將工作目錄切換到counter.v、counter_tb.v和counter.do三個檔案所在目錄下,然後在Transcript視窗中的命令列輸入 do counter.do即可。切換工作目錄的方法如下圖1,點選Change Directory:

 

圖1


PS: 如果在模擬的時候要修改.do檔案,需要現在modelsim裡執行quit -sim,退出模擬,然後修改.do檔案,再儲存,然後再重新執行do filename.do指令即可。

小技巧Tips:

         為了區分模擬波形視窗中的各種訊號線,需要訊號波形作設定,如不同訊號線的顏色、顯示基數、顯示方式等要有區別,這時就需要在模擬波形視窗單獨對每一個訊號線手動進行設定,這對於不斷修改原始碼然後再不斷地進行模擬來說,非常麻煩。

這裡,我說一下有個簡單的自動生成這類個性化設定DO檔案的方法。首先,我們需要先進行一次模擬,在波形視窗的時候先手動對需要的訊號線進行一定的設定,如下圖2所示:

                                                                                                          

圖2

然後,點選wave視窗左上角的save圖示,會出現一個儲存DO檔案的視窗,如圖3所示:

                     

圖3

它的路徑Pathname表示Modelsim自動在當前的預設目錄下新建了一個wave.do的DO檔案,我們可以自己修改儲存的路徑和DO檔名。

接下來我們來看一下上面儲存的wave.do檔案,開啟如下圖4所示:

圖4

由wave.do檔案中,可以見到我們定義的那些不同顏色、不同顯示方式所用的TCL指令碼語言,如add wave -color Yellow /freq_meter_tb/i1/freq_data表示讓該freq_data訊號顯示黃色…如add wave -noupdate -radix decimal /freq_meter_tb/i1/div_coef 表示讓div_coef訊號用十進位制decimal來顯示…其他的資訊可以對照自己的波形設定一一對應上,其他依次類推。

         細心的同學會發現這個DO檔案根本不完整,基本都是一些add wave,即是對每個訊號的各種設定的TCL程式碼而已。不錯,因為它缺少了我們之前所講的模擬步驟①②③④,那麼我們可以利用上面已學過的TCL語言來補完整它。

如在前面加上一下語句,使這個DO檔案包括了模擬過程的完整指令,包括新建工作庫、編譯原始檔、模擬testbench檔案等:

vlib work

vmap work work

vlog  freq_meter.v

vlog  freq_meter_direct.v

vlog  freq_meter_tb.v

         新的DO檔案如下所示:

          

圖5

至此,該DO檔案才能用來實現較完整的自動化模擬。

二.互動式命令

通過在主視窗的命令視窗輸入命令來實現,具有更好的除錯和互動功能,提供多種指令,既可以是單步指令,也可以構成批處理檔案,用來控制編輯、編譯和模擬流程;
常見互動式命令如下:
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 timesteps time_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,開啟所有視窗;