這里記錄一下基於腳本的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進行仿真。