Modelsim使用TCL腳本編寫do文件進行快速仿真(前仿真)

前言

之前博主在使用modelsim進行仿真的時候是用圖形化的界面進行仿真,但是如果仿真任務量很大的話,這就不是一個很好的辦法來操作,這樣我們TCL的腳本語言進行仿真的優勢就出來了,ModelSim的tcl最大的優勢就在於它可以讓整個仿真自動運行,(方便快捷),下面我就簡單的整理下這部分的內容。

工作環境

Modelsim (版本不限)

流程介紹

  1. 自動完成建庫
  2. 映射庫到物理目錄
  3. 編譯源代碼
  4. 啓動仿真器
  5. 運行仿真

常用語法說明

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 01 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章