首页 > 代码库 > modelsim仿真脚本化环境

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仿真脚本化环境