Modelsim之 DO文件簡介

轉自:http://www.cnblogs.com/LJWJL/archive/2013/01/14/simulation.html

 網上的關於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,打開所有窗口;

 


發佈了15 篇原創文章 · 獲贊 22 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章