基于tcl脚本的modelsim仿真命令

使用tcl脚本与使用图形化界面的modelsim步骤大致相同
先给出一个实例:

//退出当前仿真功能,退出当前的工程,之后可以创建其他的工程
quit -sim
//清除命令行信息
.main clear

//创建库:vlib:创建库到一个物理目录中,也就是创建文件夹目录了(可以理解库为某一个路径的文件夹,用来存储modelsim的一些数据文件)
//创建库的格式vlib <library name>,默认库的名字为work
vlib    ./lib (在当前路径(.do文件的路径)下,创建lib文件夹)
vlib    ./lib/work(在当前路径的lib文件夹下,创建work文件夹库)

//映射逻辑库到物理目录;也就是说,在modelsimGUI界面的Library选项卡里面创建子选项,这个子选项就叫做逻辑库
//(编译工程之后,得到一堆编译文件,这些文件名就放在这个逻辑库选项卡里面。但是编译得到的是实体文件,这些文件必须有一个目录存储,因此就需要把逻辑库映射到物理(文件夹)目录,也就是把那些得到的实体文件放在某一个文件夹目录(路径当中))
//在映射之前,一定要先创建好对应的物理路径vmap work(逻辑库名称)  <library name>(库的路径)
vmap     work ./lib/work

//编译Verilog 源代码,将编译得到的信息文件与编译的文件放到④的逻辑库里面,库名缺省编译到work本地库,文件按顺序编译。
//vlog –work(固定格式)  work(逻辑库名字)  <file1>.v <file2>.v(要编译的文件:路径/文件)
//(主要是编译设计文件,测试文件,调用的IP核.v文件,相应的库文件,通配符./../xxx/*.v,要注意编译的顺序)
//编译xxx.v这两个文件,将编译得到的文件与源文件放到 work这个文件夹里面。
vlog    -work    work    ./tb_ex_shift_reg.v
vlog    -work    work    ./../design/*.v

//编译完后启动仿真,语法格式为vsim –lib <library name>.<top level design>
//优化部分参数(-voptargs=+acc),链接到默认的work 库,启动仿真顶层测试逻辑库(work)里面的tb_ex_shift_reg文件
vsim    -voptargs=+acc    work.tb_ex_shift_reg

//添加波形:就是添加要显示波形,语法格式:add wave <mydesign>/<signal>
//如果添加的波形不只是顶层模块的,还有顶层下面的例化模块的信号,add wave 测试顶层的名字/例化子模块的例化名字/子模块信号的名字
//add wave #-radix ?hexadecimal tb_top/mydesign/data #-radix ?参数是约束bus是以那种进制显示。例如:binary 、ascii、unsigned、octal、hex
//add wave –format logic tb_top/mydesign/clk #-format 参数是约束波形为那种类型,logic ;literal; analog-step; analog-interpolated
//add    wave    -radix bin    tb_ex_shift_reg/o_lvds_d  以二进制格式显示o_lvds_d波形信号
//添加分割线:不同的信号之间进行分割,语法格式是add    wave    -divider    {分割线的名字}
add    wave    -divider    {tb_ex_shift_reg_111}
add    wave    tb_ex_shift_reg/lvds_clock
add    wave    tb_ex_shift_reg/rst_n
add    wave    tb_ex_shift_reg/lvds_d 
add    wave    tb_ex_shift_reg/i_30 
add    wave    -radix bin    tb_ex_shift_reg/o_lvds_d  
add    wave    -divider    {ex_shift_reg_inst_888}

//add wave 测试顶层的名字/例化模块的例化名字/信号的名字
add    wave    tb_ex_shift_reg/ex_shift_reg_inst/*

run    1us

前仿真脚本与过程(优化、状态机名称、颜色等)内容,如下所示:

#①退出当前仿真功能,退出当前的工程,跟在modelsim界面的命令行敲入命令的效果一样,之后就可以创建其他的工程
quit -sim
#②清除命令行显示信息
.main clear
#③创建库
vlib    ./lib/
vlib    ./lib/work_a/
vlib    ./lib/design/
vlib    ./lib/altera_lib/
#④映射逻辑库到物理目录
vmap    base_space ./lib/work_a/
vmap    design    ./lib/design/
vmap    altera_lib ./lib/altera_lib/
#⑤编译Verilog 源代码
vlog    -work base_space    ./tb_mealy.v
vlog    -work design        ./../design/*.vo
vlog    -work altera_lib    ./altera_lib/*.v
#⑥编译完后启动仿真
# -t 运行仿真的时间精度是ns
# -L 是链接库关键字
#......-t 时间单位,表示仿真的时间精度
#代码中-t ns:表示以ns为单位的精度进行仿真
#......首先是 -voptargs=+acc 后面的-L解释:
#由于创建了多个逻辑映射库,而启动仿真的时候的是需要链接库,因此 -L 逻辑映射库1 -L 逻辑映射库2... 就把映射库链接起来。
#映射完库之后,需要启动顶层的测试设计文件,而顶层测试设计文件是在某一个库中,因此是 顶层文件所在的逻辑.顶层文件了。
#后面的意思就是:链接 altera_lib  base_space  design这三个逻辑库,启动仿真顶层测量逻辑库base_space名字叫tb_mealy的文件
vsim    -t ns  -voptargs=+acc    -L altera_lib -L base_space -L design base_space.tb_mealy

#信号显示成字符的方法
#......创建虚拟的结构体,用来产生虚拟信号。为什么要产生虚拟信号呢?因为在波形上面看111之类的,不知道状态的变化
#因此要在状态机中,可以添加虚拟先后,把4'b0001,显示成S1这里的,方便观看
#语法为:virtual    type { {被替换16进制  用来显示的符号} {} {} ...} 结构体名字 
#......创建完虚拟类型的结构体类型后,要进行转换显示的信号还需要两步:
#首先进行强制转换:例如  virtual    function {(vir_new_signal)tb_mealy/mealy_inst/Curr_st} new_state
#就是 将要显示的 Curr_st信号 用一个类型为虚拟信号类型的  new_state 强制转换代替
#然后在添加波形显示就可以了如: #add wave  -color red    tb_mealy/mealy_inst/new_state
# -color red 是以什么颜色显示
virtual    type {
{01 S1}
{02 S2}
{04 S3}
{08 S4}
{10 S5}
{20 S6}
} vir_new_signal
#⑦添加波形与分割线
add wave    -divider {tb_mealy_1}
add wave    tb_mealy/*
add wave    -divider {mealy}
#顶层/例化的名字/* 其中*号是通配符,匹配所有信号
add wave    tb_mealy/mealy_inst/*
#创建一个vir_new_signal 类型的信号,也就是把Currt_st进行类型转换
virtual    function {(vir_new_signal)tb_mealy/mealy_inst/Curr_st} new_state
add wave  -color red    tb_mealy/mealy_inst/new_state
#⑧运行,格式是 run 运行时间
run 1us

当我们设计当中有IP核的时候,我们就添加相应的库,一个简单的调用了IP的自动化仿真脚本如下所示:

quit -sim
.main clear

vlib     work

vlog    ./tb_ex_ipcore.v      
vlog    ./altera_lib/*.v
vlog    ./../design/*.v
vlog    ./../quartus_prj/ipcore_dir/pll1.v
vlog    ./../quartus_prj/ipcore_dir/rom_8x256.v

vsim    -voptargs=+acc    work.tb_ex_ipcore

add wave tb_ex_ipcore/ex_ipcore_inst/*

run 1000ns

前仿真(即功能仿真)通用的脚本文件

#Exit current simulation
quit -sim
#Clear command line information
.main    clear
#Creating Libraries(Folder path),example : vlib ./   
#基本不用改,除非你要改变库名称和路径
#vlib    ./lib/
#vlib    ./lib/work_a/
#vlib    ./lib/design/
#vlib    ./lib/altera_lib/
vlib     work


#map logic lib to folder path ,example:
#基本不用改,除非你要改变逻辑库名称
#vmap    base_space ./lib/work_a/        modelsim will creat a tab named base_space
#vmap    design    ./lib/design/
#vmap    altera_lib ./lib/altera_lib/    simulat the IP core will use 
vmap    work    work


#Compile verilog Code ,exmaple : vlog -work [logic library's name] [the will Compiled file's path and name ] 
#vlog    -work base_space    ./tb_mealy.v-----the tb file -->altera_lib file --> design file name-->ip core name(not_inst)  
#这里要添加你的RTL文件、TB文件、IP核的.文件、IP核需要用到的库文件
vlog    -work    work    ./tb_module.v

#Start-up simulation example :
#vsim    -t ns  -voptargs=+acc    -L [logic library1] -L [logic library2] ... [logic library of the tb file].[tb'sname]
#当你的TB文件的名字不是tb_module时,需要修改;
#当你需要添加其他优化选项时需要改
vsim    -t ns  -voptargs=+acc    work.tb_module

#add wave and divider 
#当你需要添加分割线时需要修改
#add    wave    -divider        {divider's name}
#add     wave      (-color red)    tb_xxx/*  |||||| #add     wave      (-color red)    tb's name/xxx_inst/signal
add        wave    tb_module/*

#run time 
run 1ms

后仿真脚本内容如下所示:

#①退出当前仿真功能,退出当前的工程,跟在modelsim界面的命令行敲入命令的效果一样,之后就可以创建其他的工程
quit -sim
#②清除命令行显示信息
.main clear
#③创建库
vlib    ./lib/
vlib    ./lib/work_a/
vlib    ./lib/design/
vlib    ./lib/altera_lib/
#④映射逻辑库到物理目录
vmap    base_space ./lib/work_a/
vmap    design    ./lib/design/
vmap    altera_lib ./lib/altera_lib/
#⑤编译Verilog 源代码
vlog    -work base_space    ./tb_mealy.v
vlog    -work design        ./../design/*.vo
vlog    -work altera_lib    ./altera_lib/*.v
#⑥编译完后启动仿真
# -t 运行仿真的时间精度是ns
# -L 是链接库关键字
#......-t 时间单位,表示仿真的时间精度
#代码中-t ns:表示以ns为单位的精度进行仿真
#......-sdfmax加后面的信号文件,表示添加后仿真中的延时信息
#语法格式是 -sdfmax 仿真模块顶层/仿真模块的例化名字=仿真模块的.sdo文件
#......首先是 -voptargs=+acc 后面的-L解释:
#由于创建了多个逻辑映射库,而启动仿真的时候的是需要链接库,因此 -L 逻辑映射库1 -L 逻辑映射库2... 就把映射库链接起来。
#映射完库之后,需要启动顶层的测试设计文件,而顶层测试设计文件是在某一个库中,因此是 顶层文件所在的逻辑.顶层文件了。
#后面的意思就是:链接 altera_lib  base_space  design这三个逻辑库,启动仿真顶层测量逻辑库base_space名字叫tb_mealy的文件
vsim    -t ns -sdfmax tb_mealy/mealy_inst=ex_mealy_v.sdo -voptargs=+acc    -L altera_lib -L base_space -L design base_space.tb_mealy

#信号显示成字符的方法,但是后仿真中不用虚拟信号
#......创建虚拟的结构体,用来产生虚拟信号。为什么要产生虚拟信号呢?因为在波形上面看111之类的,不知道状态的变化
#因此要在状态机中,可以添加虚拟先后,把4'b0001,显示成S1这里的,方便观看
#语法为:virtual    type { {被替换16进制  用来显示的符号} {} {} ...} 结构体名字 
#......创建完虚拟类型的结构体类型后,要进行转换显示的信号还需要两步:
#首先进行强制转换:例如  virtual    function {(vir_new_signal)tb_mealy/mealy_inst/Curr_st} new_state
#就是 将要显示的 Curr_st信号 用一个类型为虚拟信号类型的  new_state 强制转换代替
#然后在添加波形显示就可以了如: #add wave  -color red    tb_mealy/mealy_inst/new_state
# -color red 是以什么颜色显示
virtual    type {
{01 S1}
{02 S2}
{04 S3}
{08 S4}
{10 S5}
{20 S6}
} vir_new_signal
#⑦添加波形与分割线
add wave    -divider {tb_mealy_1}
add wave    tb_mealy/*
add wave    -divider {mealy}
#顶层/例化的名字/* 其中*号是通配符,匹配所有信号
add wave    tb_mealy/mealy_inst/*
#创建一个vir_new_signal 类型的信号,也就是把Currt_st进行类型转换
#virtual    function {(vir_new_signal)tb_mealy/mealy_inst/Curr_st} new_state
#add wave  -color red    tb_mealy/mealy_inst/new_state
#⑧运行,格式是 run 运行时间
run 1us

在仿真代码的时候,可以使用了独立的modelsim、altera自带的modelsim、ISE自带的Isim
(1)建议使用FPGA工具自带的仿真工具的情况:

  • (带IP核的)简单的设计
  • 仿真时间不需要太长的

使用自带的工具,只需把可综合代码(包括IP核.qip文件)读进QuartusII工程、设置仿真的tb文件。然后在工具那里执行仿真就可以了。
(2)建议使用独立modelsim仿真的情况:

  • 复杂的设计,代码总行数达到上万的代码(包含IP核)----使用脚本设计。
  • 需要仿真很久的、很精细的设计(比如计数器)
  • 混合语言仿真的时候

前仿真(功能仿真),一般只需要设计文件跟测试文件,因此直接使用独立版本的modelsim就可以了。如果是后仿真或者带有各种IP核的仿真,则可以这样做:用QII/ISE/Vivado调用独立的modelsim进行仿真。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章