一. 前言
最近學習了modelsim的tcl命令,可以直接在transcript窗口通過命令來執行操作,更重要的是通過.do文件可以不打開modelsim就生成一些波形文件(例如.vcd等),方便後續使用(debussy調試波形)。
注:
本文偏總結性,先去了解一下基礎知識再來看效果更佳~ 文中也有幾篇可以參考~
二. 命令總結
總結了一下tcl中常見命令
(都加了註釋):
#Quit last sim
quit -sim
#Create the work library
vlib work
#vmap the work lib
vmap work work
#include the head files
vlog +incdir+ YOURPATH sfifo_def.v
#eg: vlog +incdir+ sfifo_def.v
# Compile the verilog files
vlog -work work sfifo.v
vlog -work work sfifo_tb.v
#Or you can merge them, but be sure to compile the called file first
vlog -work work sfifo.v sfifo_tb.v
#You can also ignore the ‘-work work’, such as vlog sfifo.v sfifo_tb.v
#Run simulation
vsim sfifo_tb
vsim -lib work sfifo_tb
vsim work. sfifo_tb
#Prohibit to optimize
vsim -novopt work.sfifo_tb
vsim -voptargs=+acc -novopt work.sfifo_tb
#Attention: If you don’t add ‘-novopt’ to disable optimization in your commands, there will be error when add wave to window: # (vish-4014) No objects found matching '/sfifo_tb/*'.
#specified time pricision is 1ns
vsim -novopt work.sfifo_tb -t 1ns
#Set the window types
#Open the wave window
view wave
#Open the instance structure window
view structure
#Open the signals list window
view signals
#Open the source window
view source
#Open the list window
view list
#Open the variables window
view variables
#Open the dataflow window
view dataflow
#Add all signals to wave window
add wave -r /*
#Attention: -r should be followed by a space
#Add the specific test signal to wave window, eg: add wave sim:/ sfifo_tb /clock
add wave sim:/ sfifo_tb /signal
#Attention: ‘sim:’ can be ignored, which means ‘add wave / sfifo_tb /signal’ is also right
#Add the tb signals to wave window
add wave sim:/sfifo_tb /*
add wave /sfifo_tb /*
add wave *
#Display in hexadecimal or binary or decimal or unsigned or others
add wave -hex/-decimal/-unsigned/-binary *
#format: Logic/Literal/Event/analogautomatic/analogcustom
#add wave -noupdate -format Logic -radix decimal -color Red /sfifo_tb/sfifo1/clock
#add wave -radix unsigned -color pink -format analogautomatic sim: sfifo_tb/sfifo1/clock
add wave -unsigned sim: sfifo_tb/sfifo1/clock
add wave -noupdate -color pink -format Analog-Step -height 74 -max 4094.9999999999995 -radix unsigned sfifo_tb/sfifo1/clock
#Delete signal
delete wave /test/i
#Restart simulation, then click OK or press ENTER
restart
#Run simulation
run 100 us
run -all
#quit -f/-force to quit Modelsim
#quit -sim to quit simulation
quit -f/-force/-sim
#Clear transcript window
.main clear
中文理解可以參考這幾個網頁:
modelsim之命令行仿真入門
modelsim中常用的tcl命令
三. 腳下留心:
1.Enable optimization
仿真的時候:vsim -novopt work.sfifo_tb,如果不加‘-novopt’或者沒有勾選掉‘Enable optimization’,添加波形的時候會出現錯誤:# (vish-4014) No objects found matching ‘/sfifo_tb/*’
ERROR:
2.restart
如果想要重新仿真,可以直接輸入restart,然後點擊OK即可,或者點擊界面工具欄,最後run -all。
界面工具欄
點擊OK
3.路徑
有時候需要添加一些宏定義文件,路徑有兩種方法:
絕對路徑和相對路徑。
3.1絕對路徑
就是平時經常用到的,比如:F:\ModelProject\04_tcl_practice就爲絕對路徑,但是這種路徑有個壞處,就是換一臺電腦基本就不適用了。
3.2相對路徑
相對路徑中./表示當前文件夾,兩個點…/表示上一級文件,所以用相對路徑:./…/…/Wang_code/iVerilogLab/11_sfifo/sfifo.v
表示當前文件夾的上一級文件的上一級文件中的Wang_code中的iVerilogLab中的11_sfifo中的sfifo.v文件,當然,你可以直接把這個文件拷貝到當前目錄下,這裏只是舉個栗子。
3.3直接include
如果要添加宏定義文件的話,可以選中要添加的文件,右擊,選擇Properties,然後Include directory即可。
可以看到其實和直接使用+incdir+命令效果是一樣的。
4.↑的使用
當我們使用tcl的時候,不必每次都輸入指定do文件的命令,在腳本控制檯直接按上鍵就會顯示上一個執行過的命令。
四. do文件
1. file.do
ModelSim SE中可以執行一種批處理文件,就是.do文件,相當於DOS中的.bat文件。我們可以用批處理方式來使仿真簡單化,具體做法爲,將所要執行的命令編輯在一起,將上面的命令行加入到do文件中即可。
大體是這樣一個步驟,具體內容請看上面的命令註釋:
有了.do文件,以後就不用每次都點擊那麼多啦,直接在transcript中輸入do file.do(file爲你命名的名字)即可。
注意:
do文件的註釋是由#開始的,但不可以在代碼行後面添加,只能另起一行。
2. wave.do
添加波形的時候,可以直接使用add wave命令來添加所需的波形,然後修改顏色等,也可以將它們直接寫成一個wave.do文件,以便直接執行do wave.do就可以完成各種波形的編輯設置。在wave window使用ctrl + s 保存爲wave.do文件,然後找到並打開,會看到以下內容:
修改你要顯示的波形配置,以後直接do wave.do可以啦。
五. bat文件
.bat文件是DOS中的批處理文件,我們可以將剛纔的file.do文件直接命名爲file.bat,然後雙擊即可。
圖中爲優化後的代碼
vsim命令中的-c表示不打開GUI界面。
編譯的時候使用的是vlog -f vflist.f命令,vflist.f是一個.f文件,裏面包含了你要編譯的文件(設計文件)名稱。
雙擊.bat後
可以看到,效果是一樣的。
do文件具體可以參考:
moedlsim中do文件的寫法技巧
Modelsim之TCL仿真
六. 交互式命令
通過在主窗口的命令窗口輸入命令來實現,具有更好的調試和交互功能,提供多種指令,既可以是單步指令,也可以構成批處理文件,用來控制編輯、編譯和仿真流程。
常見交互式命令如下:
1.force-repeat指令
1.1指令格式:
force 開始電平值開始時間,結束電平值結束時間 -repeat 週期
force clk 0 0,1 30 -repeat 100
解釋:強制clk從0時間單元開始,起始電平爲0,結束電平爲1,0電平保持時間爲30個默認時間單元,週期爲100個默認時間單元,佔空比爲70%。
1.2指令功能:
每隔一段的週期重複一定的force命令,用來產生時鐘信號,也可用來產生週期的輸入信號,如01010101,00110011等。
1.3栗子:
force clk 0 10,1 20 -r 20
解釋:在第10ns時,clk = 0,在第20ns,clk=1,-r 20從第20個時間單位單位開始重複循環clk值的變化規律。
force rst_n 0 1,1 60
解釋:在第1ns,rst_n = 0,在第60ns,rst_n = 1;
force en 0 1,1 101,0 121
解釋: 在第1ns,en = 0,在第101ns,en = 1,在第121ns,en = 0;
2.force指令
2.1指令格式:
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指令
3.1指令格式:
run timesteps time_unit,timesteps時間步長,time_unit時間單元,可以是fs、ps、ns、us、ms、sec;
3.2指令功能:
運行(仿真)並指定時間及單元;
run 100
表示運行100個默認時間單元;
run 2500ns
表示運行2500ns;
run -all
表示運行全過程;
run -continue
表示繼續運行
4.force-cancel指令
4.1指令格式:
force-cancel period
4.2指令功能:執行period週期時間後取消force命令;
force clk 0 0,1 30 -repeat 60-cancel 1000
表示強制clk從0時間單元開始,直到1000個時間單元結束;
5.view
# Open the wave window
view wave
#Open the instance structure window
view structure
# Open the signals list window
view signals
#Open the source window
view source
#Open the list window
view list
#Open the variables window
view variables
#Open the dataflow window
view dataflow
以上就是基本命令和do文件的基礎知識,希望對你有幫助~