Xilinx ISE是如何調(diào)用ModelSim進行仿真的?
在我們用ModelSim仿真的時候經(jīng)常是修改一點一點修改代碼,這樣會造成一個無奈的操作循環(huán):修改代碼--->編譯代碼--->仿真設(shè)置--->進入仿真頁面--->添加需要觀察的波形--->運行仿真。如果仿真結(jié)果不理想,還得需要重新修改代碼,重復上述的操作。
計算機擅長做重復的事情,為什么不讓計算機代勞呢?
我們可以參照Xilinx ISE是如何調(diào)用ModelSim進行仿真的,尤其是腳本的編寫。
下面一個腳本是我用ISE10.1建立了一個AES256的工程,然后在調(diào)用ModelSim6.5的時候,ISE會生成這幾個腳本文件,AES256_tb.fdo, AES256_tb_wave.fdo 和 AES256_tb.udo。
下面的代碼是AES256_tb.fdo文件的內(nèi)容。
1: vlib work #創(chuàng)建名字是work的庫,這個仿真之前必須做的
2: vcom -explicit -93 "SBOX_ROM.vhd" #編譯vhd代碼
3: vcom -explicit -93 "Inv_SBOX_ROM.vhd"
4: vcom -explicit -93 "AES_package.vhd"
5: vcom -explicit -93 "subbytes.vhd"
6: vcom -explicit -93 "SBOX_ROM_reg.vhd"
7: vcom -explicit -93 "round_key_BRAM.vhd"
8: vcom -explicit -93 "Inv_subbytes.vhd"
9: vcom -explicit -93 "Keyexpansion_Yao.vhd"
10: vcom -explicit -93 "AES256_ENC_DEC.vhd"
11: vcom -explicit -93 "AES256_TOP.vhd"
12: vcom -explicit -93 "AES256_tb.vhd"
13: vsim -t 1ps -lib work AES256_tb #進入仿真設(shè)置,時間單位為1ps,庫指定為work,AES256_tb就是指你的top層設(shè)計的名字
14: do {AES256_tb_wave.fdo} #執(zhí)行*.fdo文件,用來添加信號和變量或者內(nèi)部的寄存器到波形(WAVE)窗口
15: view wave #打開波形窗口
16: view structure #打開架構(gòu)(structure)窗口
17: view signals #打開信號列表窗口
18: run 1000ns #運行1000ns
19: do {AES256_tb.udo} #運行用戶定義的腳本
只要編譯的時候沒有出現(xiàn)語法錯誤或者是找不到定義的庫文件等錯誤提示,一般會很容易的看到仿真的波形,而不用手動進行操作。這樣方便了仿真的整個過程,而無需用很多鼠標點擊操作。
現(xiàn)在通過一個具體的實例來說明如何運用腳本來實現(xiàn)ModelSim的仿真。
工具版本:ISE10.1 ,ModelSim 6.5a
1. 創(chuàng)建ISE工程
首先通過ISE創(chuàng)建test.vhd 和test_tb.vhd文件并添加到工程中,這里不細說如何創(chuàng)建HDL源代碼。
然后配置ISE的仿真器,右鍵選中FPGA芯片,點擊properTIes,然后在Simulator選擇Modelsim-SE VHDL。
圖1. 工程屬性
在source窗口選擇“Behavioral SimulaTIon”,可以看到工程中的test_tb.vhd(testbench文件)。選中test_tb.vhd文件,在Process窗口中雙擊Simulate Behavioral Model,ISE開始調(diào)用ModelSim,這是ISE自動生成了三個腳本文件:test_tb.fdo, test_tb_wave.fdo和test_tb.udo。
圖2. Behavioral SimulaTIon 窗口
看看三個腳本文件的內(nèi)容吧。
test_tb.fdo內(nèi)容如下:
1: vlib work #添加library
2: vcom -explicit -93 "test.vhd" #編譯test的頂層文件
3: vcom -explicit -93 "test_tb.vhd" #編譯test_tb的testbench文件
4: vsim -t 1ps -lib work test_tb #進入仿真,時間單位1ps,仿真test_tb
5: do {test_tb_wave.fdo} #執(zhí)行*.fdo腳本文件,用于添加仿真波形
6: view wave #打開波形窗口
7: view structure #打開structure窗口
8: view signals #打開信號窗口
9: run 1000ns #仿真運行1000ns
10: do {test_tb.udo} #執(zhí)行*.udo腳本文件,用于執(zhí)行用戶定義的腳本命令
test_tb_wave.fdo內(nèi)容如下():
1: ## Project Navigator simulaTIon template: test_tb_wave.fdo
2: ## You may edit this file to control your simulation.
3: add wave * ##添加Top層所有的端口信號
test_tb.ufo內(nèi)容為空白,是留著給用戶自己添加。
對我們來說最有用的就是test_tb.fdo文件了,只要稍微修改就可以成為一個針對這個工程的很好的用于仿真的腳本。當然我們可以自己手動來編寫類似的腳本,用ISE自動生成主要是為了涂個省事。
2.調(diào)用ModelSim進行仿真
在圖2中,Process窗口中雙擊Simulate Behavioral Model,進入ModelSim仿真環(huán)境。請仔細觀察ModelSim Transcript窗口中消息的輸出。內(nèi)容如下:
1: # do {test_tb.fdo} #<-------執(zhí)行腳本文件
2: # ** Warning: (vlib-34) Library already exists at "work".
3: # Model Technology ModelSim SE vcom 6.5 Compiler 2009.01 Jan 22 2009 #<-----編譯test.vhd得到的message
4: # -- Loading package standard
5: # -- Loading package std_logic_1164
6: # -- Loading package std_logic_arith
7: # -- Loading package std_logic_unsigned
8: # -- Compiling entity test
9: # -- Compiling architecture test of test
10: # Model Technology ModelSim SE vcom 6.5 Compiler 2009.01 Jan 22 2009 #<-----編譯test.vhd得到的message
11: # -- Loading package standard
12: # -- Loading package std_logic_1164
13: # -- Loading package std_logic_arith
14: # -- Loading package std_logic_unsigned[!--empirenews.page--]
15: # -- Compiling entity test_tb
16: # -- Compiling architecture behavior of test_tb
17: # vsim -lib work -t 1ps test_tb #仿真設(shè)置命令行
18: # Loading std.standard
19: # Loading ieee.std_logic_1164(body)
20: # Loading ieee.std_logic_arith(body)
21: # Loading ieee.std_logic_unsigned(body)
22: # Loading work.test_tb(behavior)#1 #加載test_tb
23: # .main_pane.wave.interior.cs.body.pw.wf #打開wave窗口
24: # .main_pane.structure.interior.cs.body.struct #列出structure
25: # .main_pane.objects.interior.cs.body
注:在test_tb.fdo的每一行都可以在ModelSim Transcript窗口中分開一行一行執(zhí)行。
然后可以觀察到仿真波形文件。
3. 調(diào)試代碼
或許仿真出來的結(jié)果不是我們想要的,必須的修改代碼,然后再仿真。那我們應該怎么辦呢?
在trasncript窗口輸入:
1: quit -sim #退出仿真
2: do test_tb.fdo #修改代碼完成后重新執(zhí)行該腳本進行仿真
在仿真的波形的時候,我們不僅僅希望看到Top層設(shè)計的端口信號的波形,還希望能觀察到內(nèi)部信號是如何變化的,所以我們在Sim窗口中找到內(nèi)部的信號放到wave中進行觀察。但是如果我們重新運行當初test_tb.fdo文件,我們又再一次只能看到Top層設(shè)計的端口信號的波形,而內(nèi)部信號的波形已經(jīng)被刪除。那我們應該如何保存和運用我們仿真波形文件呢?
我現(xiàn)在需要觀察內(nèi)部的一個寄存器輸出:tmp信號,見圖4。Ctrl+S,保存波形文件。默認保存為工程目錄下/wave.do,但是我們將用波形文件保存為test_tb_wave.fdo文件,這樣做的好處可以不用修test_tb.fdo文件。
圖4.內(nèi)部信號觀察
我們重新運行test_tb.fdo腳本文件之后,輸出的波形是圖4,而不是圖3。
差不多常用的VHDL仿真命令都用上了,我相信這樣做肯定會提高仿真的效率。如果想要熟悉更多的ModelSim的仿真命令,請查看ModelSim的用書手冊。