基於腳本的modelsim自動化仿真筆記


  這里記錄一下基於腳本的modelsim自動化仿真的一些知識和模板,以后忘記了可以到這里查找。轉載請標明出處:http://www.cnblogs.com/IClearner/ 。

一、基本介紹

  這里介紹一下如何利用腳本調用modelsim進行自動化仿真,隨筆前面先介紹一下前仿真,隨筆結尾處介紹后仿真。前仿真的基本介紹如下所示,由於我的筆記是寫在.do文件中,因此我這里也給代碼的格式,如下所示:

# #表示注釋,modelsim不支持中文,因此可能不能識別注釋 #①退出當前仿真功能,退出當前的工程,跟在modelsim界面的命令行敲入命令的效果一樣,之后就可以創建其他的工程
quit -sim #②清除命令行顯示信息;在命令行‘敲入這個命令,回車’的效果一樣
.main clear #③創建庫:vlib:創建庫到一個物理目錄中,也就是創建文件夾目錄了。 #可以理解庫為某一個路徑的文件夾,用來存儲modelsim的一些數據文件; #創建庫的格式vlib <library name>,默認庫的名字為work #下面的代碼意思是:1-在當前路徑(.do文件的路徑)下,創建lib文件夾;相當於在命令行敲‘vlib lib 回車’ #2-在當前路徑的lib文件夾下,創建work文件夾庫;相當於在命令行敲‘vlib ./lib/work’
vlib    ./lib vlib ./lib/work #④映射邏輯庫到物理目錄;也就是說,在modelsimGUI界面的Library選項卡里面創建子選項,這個子選項就叫做邏輯庫, #編譯工程之后,得到一堆編譯文件,這些文件名就放在這個邏輯庫選項卡里面。但是編譯得到的是實體文件,這些文件必須 #有一個目錄存儲,因此就需要把邏輯庫映射到物理(文件夾)目錄,也就是把那些得到的實體文件放在某一個文件夾目錄(路徑當中) #這樣,就可以在實際文件夾里面查看編譯得到的文件內容,而不是單單從選項卡里面看到名字而已 #注意,在映射之前,一定要先創建好對應的物理路徑 #語法為 vmap work(邏輯庫名稱) <library name>(庫的路徑)

#下面的代碼意思是:在modelsim界面的library選項卡創建一個叫work的選項卡(邏輯庫),編譯之后得到的文件名稱就在, #相應的文件就放在./lib/work這個文件夾里面。 #當然邏輯庫的名字不一定是work(modelsim默認是work就一般取做work),也可以是top_xxxx,如果是top_xxx(vmap work ./lib/work) #那么在modelsim界面的library選項卡創建的選項卡名稱就是top_xxxx,但是編譯之后得到的文件還是存放到./lib/work的路徑文件夾中
vmap     work ./lib/work #⑤編譯Verilog 源代碼,將編譯得到的信息文件與編譯的文件放到④的邏輯庫里面,庫名缺省編譯到work本地庫,文件按順序編譯。 #語法為vlog –work(固定格式) work(邏輯庫名字) <file1>.v <file2>.v(要編譯的文件:路徑/文件) #主要是編譯設計文件,測試文件,調用的IP核.v文件,相應的庫文件,通配符./../xxx/*.v,要注意編譯的順序 #注意,.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 {分割線的名字}。 #分割線所處的位置是相對於波形信號的。下面代碼的意思就是在lvds_clock信號上面添加了一條分割線。
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 運行時間
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

  上面介紹的知識中,既介紹了普通模塊的仿真腳本,也介紹了有IP核設計的腳本仿真,下面給出一個通用的腳本文件,當然這個文件只適合用於前仿真(即功能仿真),至於后仿真后面介紹。模板如下所示:

#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核)----使用腳本設計。
②需要仿真很久的、很精細的設計(比如計數器)
③混合語言仿真的時候

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM