modelsim仿真脚本化环境
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了modelsim仿真脚本化环境相关的知识,希望对你有一定的参考价值。
刚开始学习modelsim仿真的时候,基本上都是按照图形界面的流程,建立工程--》添加设计代码--》编译--》打开仿真波形界面。但是,每次重复这些操作会感到很繁琐,而且,对于大的工程,动辄几十上百个设计文件,一个一个添加,费时费力又容易遗漏,所以想提高效率,脚本化环境是最佳的选择。
以下是自己在参考了网上一些资料和教程之后,整理的modelsim仿真脚本,供大家参考,也希望能有高人多多指教。
脚本的功能:
- 自动搜索源代码并生产filelist文件
- 自动编译并根据需要是否打开图形界面,并自动加载波形文件
- 对于多个testcase的仿真,能够方便地选择不同的case进行仿真。
脚本列表
名称 | 描述 |
get_code.tcl | 自动搜索自动目录下的verilog文件,并编译 |
sim.do | 设置顶层文件,通过vsim命令,启动仿真 |
sim.bat | 批处理文件,新建运行目录,并执行get_code.tcl和sim.do文件 |
下图是我仿真验证Xilinx fifo的目录
ipcore_dir是fifo生成目录
src存放设计源代码
sim下面是仿真目录,包含tb,tc,以及仿真脚本。
_work是自动建立的,在里面运行仿真,前面加个_作为区别。
启动仿真命令
@echo of
sim.bat _work
以下是仿真脚本的源文件
get_code.tcl
set code_file "vlog.f" file delete -force "$code_file" ### 源代码搜索子程序 proc file_search {file_dir file_name} { set path_list "" if {[glob -directory $file_dir -nocomplain -- $file_name] != ""} { append path_list [glob -directory $file_dir -nocomplain -- $file_name]\\n; } foreach sub_dir [lsort -dictionary [glob -directory $file_dir -type d -nocomplain *]] { append path_list [file_search $sub_dir $file_name]; } return $path_list; } ### 搜索.v 文件 proc gen_vlg_list {output_list directory_filter} { set file_list [file_search $directory_filter *.\\[vV\\]] set code_list [open [file join [pwd] $output_list] a] foreach file_list_all $file_list { puts $code_list "$file_list_all" } close $code_list } ### 搜索.vo程序 proc gen_vo_list {output_list directory_filter} { set file_list [file_search $directory_filter *.vo] set code_list [open [file join [pwd] $output_list] a] foreach file_list_all $file_list { puts $code_list "$file_list_all" } close $code_list } ### 搜索.vhd程序 proc gen_vhd_list {output_list directory_filter} { set file_list [file_search $directory_filter *.vhd] set code_list [open [file join [pwd] $output_list] a] foreach file_list_all $file_list { #puts $code_list "$file_list_all" vcom -work work "$file_list_all" } close $code_list } ### #### 添加 `include 搜索路径 ############## ################################################################### # compile ################################################################### if {[file exists work] == 0} { exec vlib work exec vmap work work } set incdir_list [open $code_file a] puts $incdir_list [format "+incdir+../tb"] close $incdir_list gen_vlg_list $code_file ../tb gen_vlg_list $code_file ../../src gen_vlg_list $code_file ../../ipcore_dir #gen_vhd_list $code_file ../../ipcore_dir/example_design/ if { [file exists compile_error] == 1 } { file delete -force compile_error } if {[catch {exec vlog -incr -sv -novopt -work work -f $code_file > compile.log} err_info]} { set err_flag [open compile_error a] puts $err_flag [format "compile error" ] exec notepad [file nativename compile.log] exit }
sim.do
#set tb_module cnt_tb set path [pwd] set proj_dir [file dirname $path] set tbfile [glob -nocomplain [file join [file join $proj_dir "tb" ] "*_tb.v"]] regsub {.*/(\\w+)\\.v} $tbfile {\\1} tb_module # puts "Top level is $tb_module" quit -sim #### vsim startup # vsim -l vsim.log -quiet -novopt -t ns +notimingcheck -L XilinxCoreLib_ver -L unisims_ver glbl -L work $tb_module onerror {resume} radix hex if { [file exists wave.do] } { do wave.do } else { add wave /$tb_module/* } #run -all
sim.bat
@echo off
:: testcase
set TC=%1
:: gui or not: -c = not gui; [empty] = gui
set vsim_c=%2
md %TC%
CD %TC%
:: 复制mcu rom code
::copy ..\\..\\integration_kit\\validation\\tests\\%TC%.bin image.bin
::pause
:: 获取文件列表 并编译
tclsh85 ..\\get_code.tcl
:: 启动modelsim仿真
if not exist compile_error vsim -do ..\\sim.do %vsim_c%
if not exist compile_error start vsim.log
cd ../
以上是关于modelsim仿真脚本化环境的主要内容,如果未能解决你的问题,请参考以下文章