前言
之前博主在使用modelsim進行仿真的時候是用圖形化的界面進行仿真,但是如果仿真任務量很大的話,這就不是一個很好的辦法來操作,這樣我們TCL的腳本語言進行仿真的優勢就出來了,ModelSim的tcl最大的優勢就在於它可以讓整個仿真自動運行,(方便快捷),下面我就簡單的整理下這部分的內容。
工作環境
Modelsim (版本不限)
流程介紹
- 自動完成建庫
- 映射庫到物理目錄
- 編譯源代碼
- 啓動仿真器
- 運行仿真
常用語法說明
quit -sim
退出當前仿真功能,退出當前的工程,跟在modelsim界面的命令行敲入命令的效果一樣,
之後就可以創建其他的工程
.main clear
清除命令行顯示信息;在命令行‘敲入這個命令,回車’的效果一樣
添加顯示波形
總體語法:add wave <mydesign>/<signal>
如果添加的波形不只是頂層模塊的,還有頂層下面的例化模塊的信號
語法:add wave <測試頂層的名字>/<例化子模塊的例化名字>/<子模塊信號的名字> (可以使用通配符)
代碼 | 解釋 |
---|---|
-radix | 約束進制顯示,如:binary 、ascii、unsigned、octal、hex |
-format | 約束波形爲那種類型 包括 logic ;literal; analog-step; analog-interpolated |
打開波形窗口,輸入命令:view wave
添加不同類信號之間的分割線
語法:add wave -divider {分割線的名字}。
信號建組
語法:add wave -group <組名> -radix unsigned tb_x/*
意思將tb_x中所有信號分一個組以無符號顯示
如:add wave -group xx -radix unsigned tb_x/*
force-repeat指令
指令格式:force 開始時間 開始電平值,結束電平值 忽略時間(即0電平保持時間) -repeat 週期
force clk 0 0,1 30 -repeat 100 表示強制clk從0時間單元開始,起始電平爲0,結束電平爲1,
0電平保持時間爲30個默認時間單元,週期爲100個默認時間單元,佔空比爲70%。
指令功能:每隔一段的週期重複一定的force命令,用來產生時鐘信號,也可用來產生週期的輸入信號,如01010101,00110011等。
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;
run指令
指令格式:run timesteps time_unit,timesteps時間步長,time_unit時間單元,可以是fs、ps、ns、us、ms、sec;
指令功能:運行(仿真)並指定時間及單元;
run 100, 表示運行100個默認時間單元;
run 2500ns, 表示運行2500ns;
run -all, 表示運行全過程;
run -continue, 表示繼續運行
force-cancel指令
指令格式:force-cancel period
指令功能:執行period週期時間後取消force命令;
force clk 0 0,1 30 -repeat 60-cancel 1000,
表示強制clk從0時間單元開始,直到1000個時間單元結束;
view指令
指令格式:view 窗口名
指令功能:打開Modelsim的窗口
view souce,打開源代碼窗口;
view wave,打開波形窗口;
view list,打開列表窗口;
view varibles,打開變量窗口;
view signals,打開信號窗口;
view all,打開所有窗口;
爲時鐘信號添加驅動
輸入命令:force clk 0 0,1 10 -r 20,
將仿真時鐘設爲50MHz;(設時間單位爲ns)
一些常用指令
#打開現有工程
project open C:/Users/jayash/Desktop/sim/ImageProcess
#新建一個庫
vlib my_lib
#將其映射到work
vmap my_lib work
#刪除制定庫
vmap -del my_lib
#添加指定設計文件
project addfile src/Verilog/test.v
#編譯工程內所有文件
project compileall
#編譯指定verilog文件
vlog src/Verilog/test.v
#編譯指定的vhdl文件,同時檢查可綜合性
vcom –check_synthesis src/video_cap.vhd
##仿真work庫下面的test_tb實例,同時調用220model_ver庫,不再進行任何優化,仿真分辨率1ns。
vsim –t 1ns –L 220model_ver –gui –novopt work.test_tb
#取消warning,例如‘x’,‘u’,‘z’信號的警告,對提高編譯速度很有幫助
set StdarithNoWarning 1
#查看object
View objects
#查看局部變量
View locals
#查看source
View source
#添加模塊頂層所有信號到波形圖
add wave*
#10進制無符號顯示
Radix usigned
#16進制顯示
Radix hex
#重新進行仿真
Restart
#開始仿真
Run
#仿真指定時間
Run 1ms
#時鐘激勵50ns週期 佔空比50%
Force –repeat 50 clk 0 0,1 25
#指定信號置0
Force rst_n 0
#指定信號置1
Force rst_n 1
#指定信號賦值
Force din_a 123
Force din_b 39
流程說明
第一步:創建庫
vlib:創建庫到一個物理目錄中,也就是創建文件夾目錄了。默認在.do文件所
在的文件夾下可以理解庫爲某一個路徑的文件夾,用來存儲modelsim的一些數據文件;
創建庫的格式vlib ,默認庫的名字爲work
代碼意思是:
1-在當前路徑(.do文件的路徑)下,創建lib文件夾;相當於在命令行敲‘vlib lib 回車’
2-在當前路徑的lib文件夾下,創建work文件夾庫;相當於在命令行敲‘vlib ./lib/work’
第二步:映射邏輯庫到物理目錄
也就是說,在modelsimGUI界面的Library選項卡里面創建子選項,
這個子選項就叫做邏輯庫,編譯工程之後,得到一堆編譯文件,這些文件名就放在這個邏
輯庫選項卡里面。但是編譯得到的是實體文件,這些文件必須有一個目錄存儲,因此就需
要把邏輯庫映射到物理(文件夾)目錄,也就是把那些得到的實體文件放在某一個文件夾
目錄(路徑當中)這樣,就可以在實際文件夾裏面查看編譯得到的文件內容,而不是單單
從選項卡里面看到名字而已,注意,在映射之前,一定要先創建好對應的物理路徑
語法爲 vmap work(邏輯庫名稱) (庫的路徑)
代碼意思是:在modelsim界面的library選項卡創建一個叫work的選項卡(邏輯庫),編譯之
後得到的文件名稱就在,相應的文件就放在./lib/work這個文件夾裏面。當然邏輯庫的名字不
一定是work(modelsim默認是work就一般取做work),也可以是top_xxx,如果是top_xxx
(vmap work ./lib/work)在modelsim界面的library選項卡創建的選項卡名稱就是top_xxx,
但是編譯之後得到的文件還是存放到./lib/work的路徑文件夾中 vmap work ./work
第三步:編譯Verilog 源代碼
將編譯得到的信息文件放到④的work邏輯庫裏面,庫名缺省編譯到work本地庫,文件按順
序編譯。
語法爲vlog –work(固定格式) work(邏輯庫名字) .v .v(要編譯的文件:路徑/文件)
主要是編譯設計文件,測試文件,調用的IP核.v文件,相應的庫文件,通配符./../xxx/*.v,
要注意編譯的順序,注意,.v文件應該是放在設計或者仿真的文件裏面,不要仿真邏輯庫
路‘’徑裏面,邏輯庫路徑在編譯之後會自然得複製過來
#下面代碼的意思是:編譯xxx.v這兩個文件,將編譯得到的文件與源文件放到 work這個文件夾裏面。
vlog -work work ./x_tb.v
vlog -work work ./RTL/select_test.v
#或寫成vlog -work work ./RTL/*.v
第四步:編譯完啓動仿真
(設置頂層的testbench文件 tb)
語法:vsim –lib <library name>.<top level design>,
-t | 表示仿真時間單位爲ns |
---|---|
-novopt | 表示仿真時無優化 |
+notimingchecks | 表示無時序檢查 |
vsim -voptargs=+acc work.tb
work.tb表示對work庫中的tb進行仿真,實際相當於在界面操作時,展開work庫,
右鍵—>Simulate without Optimization,啓動仿真。
代碼意思是:優化部分參數(-voptargs=+acc),鏈接前面建立的work邏輯庫,
啓動測試邏輯庫(work)裏面的x_tb文件
第五步:設置仿真運行時長
語法: run <運行時間>
run 1us
do文件模板
目前由於信號較少,所以我們就不用對信號進行過多設置,將所有波形進行添加,下面模板即可夠用
最簡潔版:
vlib work
vmap work
vlog "my_logic.v"
vlog "tb_my_logic.v"
vsim -t 1ns -novopt work.tb_my_logic
run -all
實用版:
#退出當前仿真
quit -sim
vlib work
vmap work
#編譯設計文件和仿真文件。
vlog "../Src.v"
vlog "../Sim.v"
#開始仿真(條件根據需要改變)
vsim -t 1ns -voptargs=+acc -novopt work.tb
#添加指定信號
#添加頂層所有的信號
# 打開波形窗口
view wave
view structure
# 打開信號窗口
view signals
# 添加波形模板
add wave -divider {波形名字}
add wave tb/*
.main clear
#運行xxms
run 100us