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 ../
时间: 2024-08-30 02:44:31

modelsim仿真脚本化环境的相关文章

关于xilinx ise10.1与modelsim仿真库编译

关于xilinx ise10.1与modelsim仿真库编译(2011-08-21 01:00:39)转载▼标签:杂谈 分类: FPGA 首先介绍一下Xilinx几个主要的仿真库(路径:D:\Xilinx\11.1\ISE\verilog\src\) 1. Unsim文件夹:Library of Unified component simulation models.仅用来做功能仿真,包括了Xilinx公司全部的标准元件.每个元件使用一个独立的文件,这样是为了方便一些特殊的编译向导指令,如`us

Quartus和Modelsim仿真ROM模块

新建一个工程 选择工程保存路径,为工程取一个名字 Page 2 of 5 直接点击next ? ? Page 4 of 5 直接点击next ? 下面为工程添加文件 ? 需要注意模块名和模块所在文件的文件名要一致,下面的代码保存在Wave.v这个文件中 module Wave( input i_clk, input i_rst_n, output reg[7:0] led ); ? parameter Delay500MS = 10; ? reg clk_led; reg[24:0] cnt;

JavaScript 客户端JavaScript之脚本化HTTP(通过XMLHttpRequest)

XMLHttpRequest对象的设计目的是为了处理由普通文本或XML组成的响应:但是,一个响应也可能是另外一种类型,如果用户代理(UA)支持这种内容类型的话. 大多数浏览的客户端JavaScript都包含此功能. HTTP协议 规定了Web浏览器如何从Web服务请求文档,如何向Web服务器传送表单内容,以及如何响应 这些请求和传递. Web浏览器处理了很多HTTP(通常HTTP并不在脚本的控制之下) 1.用户点击一个链接 2.提交一个表单 3.输入一个URL 通常JavaScript代码可能脚

ModelSim仿真入门 精讲

ModelSim仿真入门之一:软件介绍 编写这个教程之前,为了让不同水平阶段的人都能阅读,我尽量做到了零基础入门这个目标,所有的操作步骤都经过缜密的思考,做到了详细再详细的程度. 如果您是FPGA开发方面的初学者,那么这个教程一定能够帮助你在仿真技术上越过新人的台阶:如果您是FPGA开发的老手,这篇文档也并非对您没有帮助,您可以把教程发给其他刚入门的同事,免去您亲自上阵指导的麻烦,把主要的精力放在更有价值的地方. 一.FPGA设计仿真验证简介 严格来讲,FPGA设计验证包括功能仿真.时序仿真和电

脚本化自动构建openstack计算节点间免密码ssh登录

openstack 实例的调整大小和移植功能,都要求计算节点间免密码ssh登录,对于已有的计算节点和新增的计算节点,如何简单快速的使它们之间能够互相两两免密码登录,博主给出了一套实用的脚本. 可先参考脚本化自动部署openstack一文,搭建好环境. 文件清单为: nopasswd-login-controller-to-compute.sh  控制节点可以免密码登录所有的计算节点 nopasswd-login-compute-to-compute.sh    计算节点可以免密码登录其他计算节点

用ModelSim仿真SDRAM操作

之前写了两篇关于Modelsim仿真的blog,其中模块管脚的命名可能让人觉得有些奇怪,其实不然,之前的两篇内容都是为了仿真SDRAM操作做铺垫的. 由于SDRAM的仿真过程相对比较复杂,也比较繁琐.故可能需要不止一篇blog来完成. 在开始仿真之前,如果对SDRAM原理以及时序不是很了解的朋友,推荐看一下如下这篇文章: SDRAM-高手进阶,终极内存技术指南——完整进阶版 OK,下面正式开始仿真的过程. 通过看内存技术指南,我们大概可以总结出SDRAM的工作过程: 上电后进入200us的输入稳

Java 脚本化编程指南

译文出处: coyee   原文出处:docs.oracle Java脚本化API为谁准备? 脚本语言的一些有用的特性是: 方便:大多数脚本语言都是动态类型的.您通常可以创建新的变量,而不声明变量类型,并且您可以重用变量来存储不同类型的对象.此外,脚本语言往往会自动执行许多类型的转换,例如, 必要时 将数字10转换为"10". 开发快速原型:您可以避免编辑编译运行周期,只使用"编辑运行"! 应用扩展/定制:你可以"具体化"的部分应用程序,例如一些

NPAPI脚本化接口

http://blog.csdn.net/hgl868/article/details/8576531 scriptable接口的实现,与属性有关的函数为HasProperty.GetProperty.SetProperty.在JS中设置属性(以bar为例)用plugin.bar=barvalue;来设置,获取属性直接用plugin.bar;如果要为插件创建属性,必须要在HasProperty中返回true,在GetProperty一般调用NPN_GetProperty(mNpp,sWindow

深入理解脚本化CSS系列第一篇——脚本化行内样式

× 目录 [1]用法 [2]属性 [3]方法 前面的话 脚本化CSS,通俗点说,就是使用javascript来操作CSS.引入CSS有3种方式:外部样式,内部样式和行间样式.本文将主要介绍脚本化行间样式 基本用法 行间样式又叫内联样式,使用HTML的style属性进行设置 <div style="height: 40px;width: 40px;background-color: blue;"></div> element元素节点提供style属性,用来操作CS