转自:http://www.51hei.com/bbs/dpj-39977-1.html
--------------《modelsim仿真平台的搭建——理论篇》--------------------------
一、简介
通常情况下,每当用硬件描述语言(HDL)设计完逻辑电路之后,我们接着要做的一件非常重要的事情就是对逻辑电路的功能进行仿真。那用什么软件对其进行仿真呢?笔者用得比较多的是Mentor公司的modelsim,他是业界最优秀的HDL仿真软件。而大多数人习惯基于它的图形界面操作来对逻辑电路进行仿真。这些操作看似简单方便,殊不知图形界面仿真会消耗很多时间,尤其仿真大量数据时该现象会特别明显。这时我就在想,有没有什么办法既可以达到仿真的目的又可以减少仿真的时间呢?想了想,办法还是有的,就是搭建一个统一的验证平台,即需要观察仿真波形时,用图形界面方式;当仿真大量数据时,用命令形式。
二、验证平台的架构
该平台是基于批处理、脚本、一键化的可运行于图形界面或命令形式的仿真机制的。图1所示为验证平台的文件组织架构,下面将分别对各文件夹的作用进行介绍。
图1 验证平台文件组织结构
1、 test
验证平台的顶层文件夹。
2、 rtl
存放rtl的文件夹。
3、 verify
存放与验证相关的文件夹。
4、 run
存放与启动modelsim仿真相关的批处理文件。
5、 script
存放与modelsim仿真相关的脚本文件。
6、 testbench
存放测试文件。
7、 log
存放modelsim仿真过程中产生的垃圾文件。
三、验证平台的运行机制
验证平台的运行机制如图2所示,通过批处理和脚本文件之间的调用、传递参数来启动仿真的。其中do文件的执行顺序如图3所示。
图2 验证平台运行机制
图3 do文件执行顺序
-------------《modelsim仿真平台的搭建——额外篇》-----------------------
为了下一篇博文《验证平台的搭建——实现篇》更好地描述,这里需要增加额外的一篇博文来介绍altera器件库的编译,并以quartusII13.0器件库编译为例。
1、在modelsim安装目录下新建文件夹altera_lib_1(altera_lib文件夹之前在我的电脑上已经建立过,并存放着器件库)用于器件库编译的地方(用户可在任意路径下新建该库文件),如图1所示。
图1 新建库文件夹
2、选择电脑“开始”菜单,找到quartusII13.0的器件库编译工具并左键单击,如图2所示。
图2 器件库编译工具
3、在弹出的对话框中设置库编译参数的设置,包括仿真软件modelsim、需要编译的器件、库语言以及库文件夹的选择,如图3所示。设置好参数后点击Start Complation开始器件库的编译,如图4所示。
图3 库编译参数设置
图4 正在编译器件库
4、当库编译完成后,将弹出如图5所示的对话框。点击OK、Close完成器件库的编译。
图5 器件库编译完成
6、器件库编译后,在库文件夹altera_lib_1中产生相应的器件库,如图6和图7所示。也可以打开modelsim.ini文件看里面生成的内容,如图8所示,很明显与生成的器件库一一对应。
图6 编译产生的器件库1
图7 编译产生的器件库2
图8 打开modelsim.ini文件
----------------《modelsim仿真平台的搭建——实现篇》---------------------------------------------------
一、简介
在前面的博文中已经介绍了“验证平台”搭建的原因、理论基础以及结构框架,那么今天就以最简单功能(即modelsim既可运行于图形界面模式下也可运行于命令模式下,更多功能只能靠自己去扩展了)来介绍一下该验证平台是如何搭建的!
二、批处理文件内容介绍
根据理论篇的验证平台架构可知,验证平台的启动以及参数的传递是从run目录下的批处理文件开始的。那就先从这里开始吧。在run目录下新建如图1所示的批处理文件。
图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脚本文件。下面将对各脚本的内容进行介绍。
图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所示。
图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所示。
图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的功能是正确的。
图3 PLL仿真结果
如果不指定器件库的话,将出现错误,如图4所示。
图4 编译错误
好像讲完了,其他的就自己去创造吧。哈哈*^_^*