基於tcl腳本的modelsim仿真命令

使用tcl腳本與使用圖形化界面的modelsim步驟大致相同
先給出一個實例:

//退出當前仿真功能,退出當前的工程,之後可以創建其他的工程
quit -sim
//清除命令行信息
.main clear

//創建庫:vlib:創建庫到一個物理目錄中,也就是創建文件夾目錄了(可以理解庫爲某一個路徑的文件夾,用來存儲modelsim的一些數據文件)
//創建庫的格式vlib <library name>,默認庫的名字爲work
vlib    ./lib (在當前路徑(.do文件的路徑)下,創建lib文件夾)
vlib    ./lib/work(在當前路徑的lib文件夾下,創建work文件夾庫)

//映射邏輯庫到物理目錄;也就是說,在modelsimGUI界面的Library選項卡里面創建子選項,這個子選項就叫做邏輯庫
//(編譯工程之後,得到一堆編譯文件,這些文件名就放在這個邏輯庫選項卡里面。但是編譯得到的是實體文件,這些文件必須有一個目錄存儲,因此就需要把邏輯庫映射到物理(文件夾)目錄,也就是把那些得到的實體文件放在某一個文件夾目錄(路徑當中))
//在映射之前,一定要先創建好對應的物理路徑vmap work(邏輯庫名稱)  <library name>(庫的路徑)
vmap     work ./lib/work

//編譯Verilog 源代碼,將編譯得到的信息文件與編譯的文件放到④的邏輯庫裏面,庫名缺省編譯到work本地庫,文件按順序編譯。
//vlog –work(固定格式)  work(邏輯庫名字)  <file1>.v <file2>.v(要編譯的文件:路徑/文件)
//(主要是編譯設計文件,測試文件,調用的IP核.v文件,相應的庫文件,通配符./../xxx/*.v,要注意編譯的順序)
//編譯xxx.v這兩個文件,將編譯得到的文件與源文件放到 work這個文件夾裏面。
vlog    -work    work    ./tb_ex_shift_reg.v
vlog    -work    work    ./../design/*.v

//編譯完後啓動仿真,語法格式爲vsim –lib <library name>.<top level design>
//優化部分參數(-voptargs=+acc),鏈接到默認的work 庫,啓動仿真頂層測試邏輯庫(work)裏面的tb_ex_shift_reg文件
vsim    -voptargs=+acc    work.tb_ex_shift_reg

//添加波形:就是添加要顯示波形,語法格式:add wave <mydesign>/<signal>
//如果添加的波形不只是頂層模塊的,還有頂層下面的例化模塊的信號,add wave 測試頂層的名字/例化子模塊的例化名字/子模塊信號的名字
//add wave #-radix ?hexadecimal tb_top/mydesign/data #-radix ?參數是約束bus是以那種進制顯示。例如:binary 、ascii、unsigned、octal、hex
//add wave –format logic tb_top/mydesign/clk #-format 參數是約束波形爲那種類型,logic ;literal; analog-step; analog-interpolated
//add    wave    -radix bin    tb_ex_shift_reg/o_lvds_d  以二進制格式顯示o_lvds_d波形信號
//添加分割線:不同的信號之間進行分割,語法格式是add    wave    -divider    {分割線的名字}
add    wave    -divider    {tb_ex_shift_reg_111}
add    wave    tb_ex_shift_reg/lvds_clock
add    wave    tb_ex_shift_reg/rst_n
add    wave    tb_ex_shift_reg/lvds_d 
add    wave    tb_ex_shift_reg/i_30 
add    wave    -radix bin    tb_ex_shift_reg/o_lvds_d  
add    wave    -divider    {ex_shift_reg_inst_888}

//add wave 測試頂層的名字/例化模塊的例化名字/信號的名字
add    wave    tb_ex_shift_reg/ex_shift_reg_inst/*

run    1us

前仿真腳本與過程(優化、狀態機名稱、顏色等)內容,如下所示:

#①退出當前仿真功能,退出當前的工程,跟在modelsim界面的命令行敲入命令的效果一樣,之後就可以創建其他的工程
quit -sim
#②清除命令行顯示信息
.main clear
#③創建庫
vlib    ./lib/
vlib    ./lib/work_a/
vlib    ./lib/design/
vlib    ./lib/altera_lib/
#④映射邏輯庫到物理目錄
vmap    base_space ./lib/work_a/
vmap    design    ./lib/design/
vmap    altera_lib ./lib/altera_lib/
#⑤編譯Verilog 源代碼
vlog    -work base_space    ./tb_mealy.v
vlog    -work design        ./../design/*.vo
vlog    -work altera_lib    ./altera_lib/*.v
#⑥編譯完後啓動仿真
# -t 運行仿真的時間精度是ns
# -L 是鏈接庫關鍵字
#......-t 時間單位,表示仿真的時間精度
#代碼中-t ns:表示以ns爲單位的精度進行仿真
#......首先是 -voptargs=+acc 後面的-L解釋:
#由於創建了多個邏輯映射庫,而啓動仿真的時候的是需要鏈接庫,因此 -L 邏輯映射庫1 -L 邏輯映射庫2... 就把映射庫鏈接起來。
#映射完庫之後,需要啓動頂層的測試設計文件,而頂層測試設計文件是在某一個庫中,因此是 頂層文件所在的邏輯.頂層文件了。
#後面的意思就是:鏈接 altera_lib  base_space  design這三個邏輯庫,啓動仿真頂層測量邏輯庫base_space名字叫tb_mealy的文件
vsim    -t ns  -voptargs=+acc    -L altera_lib -L base_space -L design base_space.tb_mealy

#信號顯示成字符的方法
#......創建虛擬的結構體,用來產生虛擬信號。爲什麼要產生虛擬信號呢?因爲在波形上面看111之類的,不知道狀態的變化
#因此要在狀態機中,可以添加虛擬先後,把4'b0001,顯示成S1這裏的,方便觀看
#語法爲:virtual    type { {被替換16進制  用來顯示的符號} {} {} ...} 結構體名字 
#......創建完虛擬類型的結構體類型後,要進行轉換顯示的信號還需要兩步:
#首先進行強制轉換:例如  virtual    function {(vir_new_signal)tb_mealy/mealy_inst/Curr_st} new_state
#就是 將要顯示的 Curr_st信號 用一個類型爲虛擬信號類型的  new_state 強制轉換代替
#然後在添加波形顯示就可以瞭如: #add wave  -color red    tb_mealy/mealy_inst/new_state
# -color red 是以什麼顏色顯示
virtual    type {
{01 S1}
{02 S2}
{04 S3}
{08 S4}
{10 S5}
{20 S6}
} vir_new_signal
#⑦添加波形與分割線
add wave    -divider {tb_mealy_1}
add wave    tb_mealy/*
add wave    -divider {mealy}
#頂層/例化的名字/* 其中*號是通配符,匹配所有信號
add wave    tb_mealy/mealy_inst/*
#創建一個vir_new_signal 類型的信號,也就是把Currt_st進行類型轉換
virtual    function {(vir_new_signal)tb_mealy/mealy_inst/Curr_st} new_state
add wave  -color red    tb_mealy/mealy_inst/new_state
#⑧運行,格式是 run 運行時間
run 1us

當我們設計當中有IP核的時候,我們就添加相應的庫,一個簡單的調用了IP的自動化仿真腳本如下所示:

quit -sim
.main clear

vlib     work

vlog    ./tb_ex_ipcore.v      
vlog    ./altera_lib/*.v
vlog    ./../design/*.v
vlog    ./../quartus_prj/ipcore_dir/pll1.v
vlog    ./../quartus_prj/ipcore_dir/rom_8x256.v

vsim    -voptargs=+acc    work.tb_ex_ipcore

add wave tb_ex_ipcore/ex_ipcore_inst/*

run 1000ns

前仿真(即功能仿真)通用的腳本文件

#Exit current simulation
quit -sim
#Clear command line information
.main    clear
#Creating Libraries(Folder path),example : vlib ./   
#基本不用改,除非你要改變庫名稱和路徑
#vlib    ./lib/
#vlib    ./lib/work_a/
#vlib    ./lib/design/
#vlib    ./lib/altera_lib/
vlib     work


#map logic lib to folder path ,example:
#基本不用改,除非你要改變邏輯庫名稱
#vmap    base_space ./lib/work_a/        modelsim will creat a tab named base_space
#vmap    design    ./lib/design/
#vmap    altera_lib ./lib/altera_lib/    simulat the IP core will use 
vmap    work    work


#Compile verilog Code ,exmaple : vlog -work [logic library's name] [the will Compiled file's path and name ] 
#vlog    -work base_space    ./tb_mealy.v-----the tb file -->altera_lib file --> design file name-->ip core name(not_inst)  
#這裏要添加你的RTL文件、TB文件、IP核的.文件、IP核需要用到的庫文件
vlog    -work    work    ./tb_module.v

#Start-up simulation example :
#vsim    -t ns  -voptargs=+acc    -L [logic library1] -L [logic library2] ... [logic library of the tb file].[tb'sname]
#當你的TB文件的名字不是tb_module時,需要修改;
#當你需要添加其他優化選項時需要改
vsim    -t ns  -voptargs=+acc    work.tb_module

#add wave and divider 
#當你需要添加分割線時需要修改
#add    wave    -divider        {divider's name}
#add     wave      (-color red)    tb_xxx/*  |||||| #add     wave      (-color red)    tb's name/xxx_inst/signal
add        wave    tb_module/*

#run time 
run 1ms

後仿真腳本內容如下所示:

#①退出當前仿真功能,退出當前的工程,跟在modelsim界面的命令行敲入命令的效果一樣,之後就可以創建其他的工程
quit -sim
#②清除命令行顯示信息
.main clear
#③創建庫
vlib    ./lib/
vlib    ./lib/work_a/
vlib    ./lib/design/
vlib    ./lib/altera_lib/
#④映射邏輯庫到物理目錄
vmap    base_space ./lib/work_a/
vmap    design    ./lib/design/
vmap    altera_lib ./lib/altera_lib/
#⑤編譯Verilog 源代碼
vlog    -work base_space    ./tb_mealy.v
vlog    -work design        ./../design/*.vo
vlog    -work altera_lib    ./altera_lib/*.v
#⑥編譯完後啓動仿真
# -t 運行仿真的時間精度是ns
# -L 是鏈接庫關鍵字
#......-t 時間單位,表示仿真的時間精度
#代碼中-t ns:表示以ns爲單位的精度進行仿真
#......-sdfmax加後面的信號文件,表示添加後仿真中的延時信息
#語法格式是 -sdfmax 仿真模塊頂層/仿真模塊的例化名字=仿真模塊的.sdo文件
#......首先是 -voptargs=+acc 後面的-L解釋:
#由於創建了多個邏輯映射庫,而啓動仿真的時候的是需要鏈接庫,因此 -L 邏輯映射庫1 -L 邏輯映射庫2... 就把映射庫鏈接起來。
#映射完庫之後,需要啓動頂層的測試設計文件,而頂層測試設計文件是在某一個庫中,因此是 頂層文件所在的邏輯.頂層文件了。
#後面的意思就是:鏈接 altera_lib  base_space  design這三個邏輯庫,啓動仿真頂層測量邏輯庫base_space名字叫tb_mealy的文件
vsim    -t ns -sdfmax tb_mealy/mealy_inst=ex_mealy_v.sdo -voptargs=+acc    -L altera_lib -L base_space -L design base_space.tb_mealy

#信號顯示成字符的方法,但是後仿真中不用虛擬信號
#......創建虛擬的結構體,用來產生虛擬信號。爲什麼要產生虛擬信號呢?因爲在波形上面看111之類的,不知道狀態的變化
#因此要在狀態機中,可以添加虛擬先後,把4'b0001,顯示成S1這裏的,方便觀看
#語法爲:virtual    type { {被替換16進制  用來顯示的符號} {} {} ...} 結構體名字 
#......創建完虛擬類型的結構體類型後,要進行轉換顯示的信號還需要兩步:
#首先進行強制轉換:例如  virtual    function {(vir_new_signal)tb_mealy/mealy_inst/Curr_st} new_state
#就是 將要顯示的 Curr_st信號 用一個類型爲虛擬信號類型的  new_state 強制轉換代替
#然後在添加波形顯示就可以瞭如: #add wave  -color red    tb_mealy/mealy_inst/new_state
# -color red 是以什麼顏色顯示
virtual    type {
{01 S1}
{02 S2}
{04 S3}
{08 S4}
{10 S5}
{20 S6}
} vir_new_signal
#⑦添加波形與分割線
add wave    -divider {tb_mealy_1}
add wave    tb_mealy/*
add wave    -divider {mealy}
#頂層/例化的名字/* 其中*號是通配符,匹配所有信號
add wave    tb_mealy/mealy_inst/*
#創建一個vir_new_signal 類型的信號,也就是把Currt_st進行類型轉換
#virtual    function {(vir_new_signal)tb_mealy/mealy_inst/Curr_st} new_state
#add wave  -color red    tb_mealy/mealy_inst/new_state
#⑧運行,格式是 run 運行時間
run 1us

在仿真代碼的時候,可以使用了獨立的modelsim、altera自帶的modelsim、ISE自帶的Isim
(1)建議使用FPGA工具自帶的仿真工具的情況:

  • (帶IP核的)簡單的設計
  • 仿真時間不需要太長的

使用自帶的工具,只需把可綜合代碼(包括IP核.qip文件)讀進QuartusII工程、設置仿真的tb文件。然後在工具那裏執行仿真就可以了。
(2)建議使用獨立modelsim仿真的情況:

  • 複雜的設計,代碼總行數達到上萬的代碼(包含IP核)----使用腳本設計。
  • 需要仿真很久的、很精細的設計(比如計數器)
  • 混合語言仿真的時候

前仿真(功能仿真),一般只需要設計文件跟測試文件,因此直接使用獨立版本的modelsim就可以了。如果是後仿真或者帶有各種IP核的仿真,則可以這樣做:用QII/ISE/Vivado調用獨立的modelsim進行仿真。

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