--------------《modelsim仿真平臺的搭建——理論篇》--------------------------
一、簡介 通常情況下,每當用硬件描述語言(HDL)設計完邏輯電路之后,我們接著要做的一件非常重要的事情就是對邏輯電路的功能進行仿真。那用什么軟件對其進行仿真呢?筆者用得比較多的是Mentor公司的modelsim,他是業界最優秀的HDL仿真軟件。而大多數人習慣基于它的圖形界面操作來對邏輯電路進行仿真。這些操作看似簡單方便,殊不知圖形界面仿真會消耗很多時間,尤其仿真大量數據時該現象會特別明顯。這時我就在想,有沒有什么辦法既可以達到仿真的目的又可以減少仿真的時間呢?想了想,辦法還是有的,就是搭建一個統一的驗證平臺,即需要觀察仿真波形時,用圖形界面方式;當仿真大量數據時,用命令形式。 二、驗證平臺的架構 該平臺是基于批處理、腳本、一鍵化的可運行于圖形界面或命令形式的仿真機制的。圖1所示為驗證平臺的文件組織架構,下面將分別對各文件夾的作用進行介紹。
5100000011-6357873064330000009509567.jpg (47.71 KB, 下載次數: 202)
下載附件
2015-11-1 16:28 上傳
圖1 驗證平臺文件組織結構 1、 test 驗證平臺的頂層文件夾。 2、 rtl 存放rtl的文件夾。 3、 verify 存放與驗證相關的文件夾。 4、 run 存放與啟動modelsim仿真相關的批處理文件。 5、 script 存放與modelsim仿真相關的腳本文件。 6、 testbench 存放測試文件。 7、 log 存放modelsim仿真過程中產生的垃圾文件。 三、驗證平臺的運行機制 驗證平臺的運行機制如圖2所示,通過批處理和腳本文件之間的調用、傳遞參數來啟動仿真的。其中do文件的執行順序如圖3所示。
5100000011-6357873069196900004873597.jpg (102.04 KB, 下載次數: 228)
下載附件
2015-11-1 16:28 上傳
圖2 驗證平臺運行機制
5100000011-6357873073226200006025914.jpg (53.91 KB, 下載次數: 211)
下載附件
2015-11-1 16:28 上傳
圖3 do文件執行順序
-------------《modelsim仿真平臺的搭建——額外篇》-----------------------
為了下一篇博文《驗證平臺的搭建——實現篇》更好地描述,這里需要增加額外的一篇博文來介紹altera器件庫的編譯,并以quartusII13.0器件庫編譯為例。
1、在modelsim安裝目錄下新建文件夾altera_lib_1(altera_lib文件夾之前在我的電腦上已經建立過,并存放著器件庫)用于器件庫編譯的地方(用戶可在任意路徑下新建該庫文件),如圖1所示。
5100000011-6357873644537200008315304.bmp (596.72 KB, 下載次數: 239)
下載附件
2015-11-1 16:28 上傳
圖1 新建庫文件夾 2、選擇電腦“開始”菜單,找到quartusII13.0的器件庫編譯工具并左鍵單擊,如圖2所示。
5100000011-6357873652630200008048711.bmp (600.1 KB, 下載次數: 219)
下載附件
2015-11-1 16:28 上傳
圖2 器件庫編譯工具 3、在彈出的對話框中設置庫編譯參數的設置,包括仿真軟件modelsim、需要編譯的器件、庫語言以及庫文件夾的選擇,如圖3所示。設置好參數后點擊Start Complation開始器件庫的編譯,如圖4所示。
5100000011-6357873786368800002993322.bmp (1.67 MB, 下載次數: 248)
下載附件
2015-11-1 16:28 上傳
圖3 庫編譯參數設置
5100000011-6357873842488000005123236.bmp (1.67 MB, 下載次數: 255)
下載附件
2015-11-1 16:28 上傳
圖4 正在編譯器件庫 4、當庫編譯完成后,將彈出如圖5所示的對話框。點擊OK、Close完成器件庫的編譯。
5100000011-6357873895026600005184016.bmp (481.19 KB, 下載次數: 246)
下載附件
2015-11-1 16:28 上傳
圖5 器件庫編譯完成 6、器件庫編譯后,在庫文件夾altera_lib_1中產生相應的器件庫,如圖6和圖7所示。也可以打開modelsim.ini文件看里面生成的內容,如圖8所示,很明顯與生成的器件庫一一對應。
5100000011-6357873898698700005407333.bmp (852.75 KB, 下載次數: 253)
下載附件
2015-11-1 16:28 上傳
圖6 編譯產生的器件庫1
5100000011-6357873921741400008121088.bmp (1.89 MB, 下載次數: 243)
下載附件
2015-11-1 16:28 上傳
圖7 編譯產生的器件庫2
5100000011-6357886869714400004688036.bmp (210.24 KB, 下載次數: 196)
下載附件
2015-11-1 16:28 上傳
圖8 打開modelsim.ini文件
----------------《modelsim仿真平臺的搭建——實現篇》---------------------------------------------------
一、簡介 在前面的博文中已經介紹了“驗證平臺”搭建的原因、理論基礎以及結構框架,那么今天就以最簡單功能(即modelsim既可運行于圖形界面模式下也可運行于命令模式下,更多功能只能靠自己去擴展了)來介紹一下該驗證平臺是如何搭建的! 二、批處理文件內容介紹 根據理論篇的驗證平臺架構可知,驗證平臺的啟動以及參數的傳遞是從run目錄下的批處理文件開始的。那就先從這里開始吧。在run目錄下新建如圖1所示的批處理文件。
5100000011-6357887457653600001610444.bmp (205.26 KB, 下載次數: 211)
下載附件
2015-11-1 16:28 上傳
圖1 新建各批處理文件 各批處理文件的作用正如命名那樣,其中sim.bat主要設置各種變量、參數的判斷及執行相應的功能等,sim_start.bat起到啟動驗證平臺并傳遞參數的功能。下面對各批處理文件內容的實現進行介紹。 1、sim.bat 打開sim.bat文件,開始內容的編寫。首先是關閉顯示信息和清屏,如程序清單1所示。
程序清單1 @echo off
cls 設置各文件夾路徑變量,如程序清單2所示。
程序清單2 set verify_path=....erify
set run_path=..
un
set script_path=..script
set rtl_path=....
tl
set tb_path=.. estbench
set log_path=..log
if not exist %log_path% (md %log_path%) 設置變量的默認值,包括器件庫的確定、modelsim界面啟動與否、使用幫助、清除日志等,如程序清單3所示。
程序清單3 set LIBRARY=nolib
set GUI=0
set usage=0
set clr=0 進入log目錄,讓垃圾文件都產生在log目錄下,如程序清單4所示。
程序清單4 cd %log_path% 判斷是否有參數傳遞過來(包括是否需要編譯器件庫、是否基于圖形界面仿真、是否啟動幫助顯示信息以及是否清楚垃圾文件)并做相應的處理,如程序清單5所示。
程序清單5 :decode_parameter
if not "%1" == "" (
if "%1" == "-lib" (set LIBRARY=%2)
if "%1" == "-gui" (set GUI=1)
if "%1" == "help" (set usage=1)
if "%1" == "clean" (set clr=1)
SHIFT /1
goto decode_parameter
) 設置仿真庫,以上一篇博文《驗證平臺的搭建——額外篇》為基礎,該平臺目前以只支持altera器件庫為例,如程序清單6所示。
程序清單6 if "%LIBRARY%" == "altera" (
xcopy /Y C:modeltech64_10.2caltera_lib_1modelsim.ini .
set MODELSIM=.modelsim.ini
echo "use altera lib"
) 啟動modelsim軟件并根據參數決定驗證平臺運行于圖形界面下或命令行下,如程序清單7所示。
程序清單7 if "%usage%" == "0" (
if "%clr%" == "0" (
if "%GUI%" == "1" (
vsim -do ../script/full_sim.do
) else (
vsim -c -do ../script/full_sim.do
)
)
) 顯示幫助信息,如程序清單8所示。
程序清單8 if "%usage%" == "1" (
echo 腳本使用方法
echo "call sim "
echo options:
echo "-lib 指定仿真庫,默認值為nolib,目前僅支持altera器件庫"
echo "-gui 加上該參數表示modelsim運行在界面下,否則運行在命令下"
echo "help 顯示幫助信息"
echo "clean 清除log目錄下所有文件"
) 返回run目錄,如程序清單9所示。
程序清單9 cd %run_path% 清除垃圾文件,如程序清單10所示。
程序清單10 if "%clr%" == "1" (
rd %log_path% /s /q
md %log_path%
) 2、顯示幫助信息.bat
調用sim.bat并傳遞help參數,如程序清單11所示。
程序清單11 call sim help
pause 3、清除log目錄下的文件.bat
調用sim.bat并傳遞clean參數,如程序清單12所示。
程序清單12
call sim clean 4、sim_start.bat
該批處理文件的使用,將在下一篇博文《驗證平臺的搭建——應用篇》進行詳細介紹。
三、do腳本文件內容介紹 在script目錄下新建如圖2所示的do腳本文件。下面將對各腳本的內容進行介紹。
5100000011-6357939784661800005917259.bmp (336.15 KB, 下載次數: 267)
下載附件
2015-11-1 16:28 上傳
圖2 新建各do腳本文件 1、full_sim.do 該腳本文件的作用是獲取批處理文件傳遞過來的變量、獲取文件列表、編譯、仿真、添加波形、運行等,如程序清單13所示。
程序清單13 transcript off
onbreak {resume}
set lib $::env(LIBRARY)
set gui $::env(GUI)
set notb $::env(notb)
se et verify_path $::env(verify_path)
set run_path $::env(run_path)
set script_path $::env(script_path)
set rtl_path $::env(rtl_path)
set tb_path $::env(tb_path)
set log_path $::env(log_path)
set verify_path [string map {"\" "/"} $verify_path] set run_path [string map {"\" "/"} $run_path]
set script_path [string map {"\" "/"} $script_path]
set rtl_path [string map {"\" "/"} $rtl_path]
set tb_path [string map {"\" "/"} $tb_path]
set log_path [string map {"\" "/"} $log_path]
do $script_path/filelist.do
do $script_path/vlog.do
do $script_path/vsim.do
do $script_path/wave.do
run -all
quit 2、filelist.do
該腳本文件的作用是獲取文件列表,如程序清單14所示。
程序清單14 proc search_ver_rtl {dir_name file_ver_id} {
set dirlist [glob -directory $dir_name -nocomplain -type d *]
foreach fname [glob -directory $dir_name -nocomplain -types f "*.v" "*.sv"] {
puts $file_ver_id $fname
}
foreach dir $dirlist {
search_ver_rtl $dir $file_ver_id
}
}
set file_list_ver [file join $log_path "filelist_ver.f"]
if {[file exist $file_list_ver]} {
file delete $file_list_ver
}
set file_ver_id [open $file_list_ver w]
search_ver_rtl $rtl_path $file_ver_id
search_ver_rtl $tb_path $file_ver_id
close $file_ver_id 3、vlog.do
該腳本文件的作用是編譯庫和列表文件,如程序清單15所示。
程序清單15 if {[file exists $log_path/rtl_work]} {
vdel -lib $log_path/rtl_work -all
}
vlib $log_path/rtl_work
vmap work $log_path/rtl_work
vlog -sv -incr +initreg=r+0 +notimingchecks -quiet -timescale 1ns/1ps -cover bcestf -work work -f $file_list_ver 4、vsim.do 該腳本文件的作用是啟動仿真并判斷是否需要用到器件庫,如程序清單16所示。
程序清單16 if {$lib == "altera"} {
vsim -suppress 3009 -t 1ps -quiet -L altera_ver -L lpm_ver -L sgate_ver -L altera_mf_ver -L altera_lnsim_ver -L cyclone_ver -L cycloneii_ver -L cycloneiii_ver -L cycloneiiils_ver -L cycloneive_ver -L cycloneiv_hssi_ver -L cycloneiv_pcie_hip_ver -L cycloneiv_ver -L work -voptargs="+acc" -wlf $log_path/vsim.wlf work.testbench
} else {
vsim -suppress 3009 -t 1ps -quiet -L work -voptargs="+acc" -wlf $log_path/vsim.wlf work.testbench
} 5、wave.do
該腳本文件的作用是在圖形模式下調用波形窗口和添加波形信號等,如程序清單17所示。
程序清單17 view wave
add wave *
#log -r /* 四、總結
上面簡單介紹了驗證平臺中批處理和do腳本文件的內容,里面具體什么意思不重要,關鍵是如何把它給運用起來,否則一切都是浮云。請留意下一篇博文《驗證平臺的搭建——應用篇》。
~~
---------------------《modelsim仿真平臺的搭建——應用篇》------------------------------------------------
基于上一篇博文《驗證平臺的搭建——實現篇》的基礎上,講講該驗證平臺的使用方法。 一、基本參數設置 針對不同的計算機以及軟件的安裝路徑,需要對驗證平臺的一些參數進行設置。首先是器件庫的路徑設置,打開批處理文件sim.bat,根據具體情況進行設置,如圖1所示。
5100000011-6357939909638300009496640.bmp (877.15 KB, 下載次數: 248)
下載附件
2015-11-1 16:28 上傳
圖1 庫路徑的設置 其次是設置需要用到哪些器件庫,打開do腳本文件vsim.do,可根據具體需求進行設置(這里用到的器件庫有altera_ver、lpm_ver、sgate_ver、altera_mf_ver、altera_lnsim_ver等),如程序清單1所示。
程序清單1 if {$lib == "altera"} {
vsim -suppress 3009 -t 1ps -quiet -L altera_ver -L lpm_ver -L sgate_ver -L altera_mf_ver -L altera_lnsim_ver -L
cyclone_ver -L cycloneii_ver -L cycloneiii_ver -L cycloneiiils_ver -L cycloneive_ver -L cycloneiv_hssi_ver -L
cycloneiv_pcie_hip_ver -L cycloneiv_ver -L work -voptargs="+acc" -wlf $log_path/vsim.wlf work.testbench
} else {
vsim -suppress 3009 -t 1ps -quiet -L work -voptargs="+acc" -wlf $log_path/vsim.wlf work.testbench
} 一般情況下,以上參數只需設置一次。
二、驗證平臺啟動參數設置 關于驗證平臺的啟動參數說明可雙擊批處理文件“顯示幫助信息.bat”進行查看,如圖2所示。
5100000011-6357940130960400008504462.bmp (546.87 KB, 下載次數: 270)
下載附件
2015-11-1 16:28 上傳
圖2 顯示幫助信息 而參數的設置是在批處理文件“sim_start.bat”中進行的。驗證平臺運行于命令下且不需要器件庫,如程序清單2所示;驗證平臺運行于命令下且需要器件庫,如程序清單3所示;驗證平臺運行于圖形界面下且不需要器件庫,如程序清單4所示;驗證平臺運行于圖形界面下且需要器件庫,如程序清單5所示。
程序清單2 call sim 程序清單3
call sim -lib altera 程序清單4
call sim -gui 程序清單5
call sim -lib altera -gui 接下來,舉一個簡單的例子并通過驗證它的功能來介紹驗證平臺的使用。此次要驗證的是altera的PLL核,輸入時鐘為50MHz,輸出時鐘為100MHz和50MHz,IP核參數設置如程序清單6所示。
程序清單6 altpll_component.bandwidth_type = "AUTO",
altpll_component.clk0_divide_by = 1,
altpll_component.clk0_duty_cycle = 50,
altpll_component.clk0_multiply_by = 2,
altpll_component.clk0_phase_shift = "0",
altpll_component.clk1_divide_by = 1,
altpll_component.clk1_duty_cycle = 50,
altpll_component.clk1_multiply_by = 1,
altpll_component.clk1_phase_shift = "0",
altpll_component.compensate_clock = "CLK0",
altpll_component.inclk0_input_frequency = 20000,
altpll_component.intended_device_family = "Cyclone IV E", 相應的測試代碼如程序清單7所示。
程序清單7 `timescale 1ns/1ps
module testbench;
reg rst;
reg clk_in_50M;
wire clk_out_100M;
wire clk_out_50M;
wire locked;
parameter CLK_CYCLE = 20;
initial
begin
clk_in_50M = 0;
forever #(CLK_CYCLE/2)
clk_in_50M = ~clk_in_50M;
end
sys_pll u_sys_pll (
.areset ( rst ),
.inclk0 ( clk_in_50M ),
.c0 ( clk_out_100M),
.c1 ( clk_out_50M ),
.locked ( locked )
);
initial
begin
rst = 1;
#(CLK_CYCLE*10);
rst = 0;
#(CLK_CYCLE*1000);
$stop;
end
endmodule 由于需要查看輸入輸出時鐘的波形關系,因此PLL功能的驗證主要基于圖形界面。又因為對PLL的仿真需要器件庫,故驗證平臺的仿真參數設置如程序清單8所示。
程序清單8 call sim -lib altera -gui 雙擊sim_start.bat批處理文件,啟動仿真,仿真結果如圖3所示。輸入50MHz的時鐘、輸出100MHz和50MHz的時鐘,很顯然,PLL的功能是正確的。
5100000011-6357940166116800009659543.bmp (201.5 KB, 下載次數: 209)
下載附件
2015-11-1 16:28 上傳
圖3 PLL仿真結果 如果不指定器件庫的話,將出現錯誤,如圖4所示。
圖4 編譯錯誤 好像講完了,其他的就自己去創造吧。哈哈*^_^*
|