基于脚本的modelsim自动化仿真笔记

文章描述:-2022年3月30日发(作者:蔡鸿文)基于脚本的modelsim⾃动化仿真笔记  这⾥记录⼀下基于脚本的modelsim⾃动化仿真的⼀些知识和模板,以后忘记了可以到这⾥查。转载请标明出处: 。⼀、基本介绍  这⾥介绍⼀下如何利⽤脚本调⽤modelsim进⾏⾃动化仿真,随笔前⾯先介绍⼀下前仿真,随笔结尾处介绍后仿真。前仿真的基本介绍如下所⽰,由于我的笔记是写在.do⽂件中,因此我这⾥也给代码的格

-

基于脚本的modelsim自动化仿真笔记2022年3月30日发(作者:蔡鸿文)


基于脚本的modelsim⾃动化仿真笔记
  这⾥记录⼀下基于脚本的modelsim⾃动化仿真的⼀些知识和模板,以后忘记了可以到这⾥查。转载请标明出处: 。
⼀、基本介绍
  这⾥介绍⼀下如何利⽤脚本调⽤modelsim进⾏⾃动化仿真,随笔前⾯先介绍⼀下前仿真,随笔结尾处介绍后仿真。前仿真的基本介绍如
下所⽰,由于我的笔记是写在.do⽂件中,因此我这⾥也给代码的格式,如下所⽰:
# #表⽰注释,modelsim不⽀持中⽂,因此可能不能识别注释
#①退出当前仿真功能,退出当前的⼯程,跟在modelsim界⾯的命令⾏敲⼊命令的效果⼀样,之后就可以创建其他的⼯程
quit -sim
#②清除命令⾏显⽰信息;在命令⾏‘敲⼊这个命令,回车’的效果⼀样
.main clear
#③创建库:vlib:创建库到⼀个物理⽬录中,也就是创建⽂件夹⽬录了。
#可以理解库为某⼀个路径的⽂件夹,⽤来存储modelsim的⼀些数据⽂件;
#创建库的格式vlib ,默认库的名字为work
#下⾯的代码意思是:1-在当前路径(.do⽂件的路径)下,创建lib⽂件夹;相当于在命令⾏敲‘vlib lib 回车’
#2-在当前路径的lib⽂件夹下,创建work⽂件夹库;相当于在命令⾏敲‘vlib .libwork’
vlib .lib
vlib .libwork
#④映射逻辑库到物理⽬录;也就是说,在modelsimGUI界⾯的Library选项卡⾥⾯创建⼦选项,这个⼦选项就叫做逻辑库,
#编译⼯程之后,得到⼀堆编译⽂件,这些⽂件名就放在这个逻辑库选项卡⾥⾯。但是编译得到的是实体⽂件,这些⽂件必须
#有⼀个⽬录存储,因此就需要把逻辑库映射到物理(⽂件夹)⽬录,也就是把那些得到的实体⽂件放在某⼀个⽂件夹⽬录(路径当中)
#这样,就可以在实际⽂件夹⾥⾯查看编译得到的⽂件内容,⽽不是单单从选项卡⾥⾯看到名字⽽已
#注意,在映射之前,⼀定要先创建好对应的物理路径
#语法为 vmap work(逻辑库名称) (库的路径)
#下⾯的代码意思是:在modelsim界⾯的library选项卡创建⼀个叫work的选项卡(逻辑库),编译之后得到的⽂件名称就在,
#相应的⽂件就放在.libwork这个⽂件夹⾥⾯。
#当然逻辑库的名字不⼀定是work(modelsim默认是work就⼀般取做work),也可以是top_xxxx,如果是top_xxx(vmap work .libwork)
#那么在modelsim界⾯的library选项卡创建的选项卡名称就是top_xxxx,但是编译之后得到的⽂件还是存放到.libwork的路径⽂件夹中
vmap work .libwork
#⑤编译Verilog 源代码,将编译得到的信息⽂件与编译的⽂件放到④的逻辑库⾥⾯,库名缺省编译到work本地库,⽂件按顺序编译。
#语法为vlog –work(固定格式) work(逻辑库名字) .v .v(要编译的⽂件:路径⽂件)
#主要是编译设计⽂件,测试⽂件,调⽤的IP核.v⽂件,相应的库⽂件,通配符...xxx*.v,要注意编译的顺序
#注意,.v⽂件应该是放在设计或者仿真的⽂件⾥⾯,不要仿真逻辑库路径⾥⾯,逻辑库路径在编译之后会⾃然得复制过来
#下⾯代码的意思是:编译xxx.v这两个⽂件,将编译得到的⽂件与源⽂件放到 work这个⽂件夹⾥⾯。
vlog -work work .tb_ex_shift_reg.v
vlog -work work ...design*.v
#⑥编译完后启动仿真,语法格式为vsim –lib .
#下⾯的代码意思是:优化部分参数(-voptargs=+acc),链接到默认的work 库,启动仿真顶层测试逻辑库(work)⾥⾯的tb_ex_shift_reg⽂件
vsim -voptargs=+acc _ex_shift_reg
#⑦添加波形与分割线。
#添加波形:就是添加要显⽰波形,语法格式:add wave
#。。。如果添加的波形不只是顶层模块的,还有顶层下⾯的例化模块的信号,
#就是#add wave 测试顶层的名字例化⼦模块的例化名字⼦模块信号的名字
#。。。add wave #-radix ?hexadecimal tb_topmydesigndata #-radix ?参数是约束bus是以那种进制显⽰。
#例如:binary 、ascii、unsigned、octal、hex
#。。。add wave –format logic tb_topmydesignclk #-format 参数是约束波形为那种类型,
#包括 logic ;literal; analog-step; analog-interpolated;
#add wave -radix bin tb_ex_shift_rego_lvds_d 以⼆进制格式显⽰o_lvds_d波形信号
#添加分割线:不同的信号之间进⾏分割,语法格式是add wave -divider {分割线的名字}。
#分割线所处的位置是相对于波形信号的。下⾯代码的意思就是在lvds_clock信号上⾯添加了⼀条分割线。
add wave -divider {tb_ex_shift_reg_111}
add wave tb_ex_shift_reglvds_clock
add wave tb_ex_shift_regrst_n
add wave tb_ex_shift_reglvds_d
add wave tb_ex_shift_regi_30
add wave -radix bin tb_ex_shift_rego_lvds_d
add wave -divider {ex_shift_reg_inst_888}
#add wave 测试顶层的名字例化模块的例化名字信号的名字
add wave tb_ex_shift_regex_shift_reg_inst*
#⑧运⾏,格式是 run 运⾏时间
run 1us


⼆、前仿真进阶
  上⾯的仿真基础能够仿真基本的模块了,下⾯再来引⼊⼀些“酷炫”的知识:前仿真脚本与过程(优化、状态机名称、颜⾊等)内容,如
下所⽰:
#①退出当前仿真功能,退出当前的⼯程,跟在modelsim界⾯的命令⾏敲⼊命令的效果⼀样,之后就可以创建其他的⼯程
quit -sim
#②清除命令⾏显⽰信息
.main clear
#③创建库
vlib .lib
vlib .libwork_a
vlib .libdesign
vlib .libaltera_lib
#④映射逻辑库到物理⽬录
vmap base_space .libwork_a
vmap design .libdesign
vmap altera_lib .libaltera_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__mealy
#信号显⽰成字符的⽅法
#......创建虚拟的结构体,⽤来产⽣虚拟信号。为什么要产⽣虚拟信号呢?因为在波形上⾯看111之类的,不知道状态的变化
#因此要在状态机中,可以添加虚拟先后,把4'b0001,显⽰成S1这⾥的,⽅便观看
#语法为:virtual type { {被替换16进制 ⽤来显⽰的符号} {} {} ...} 结构体名字
#......创建完虚拟类型的结构体类型后,要进⾏转换显⽰的信号还需要两步:
#⾸先进⾏强制转换:例如 virtual function {(vir_new_signal)tb_mealymealy_instCurr_st} new_state
#就是 将要显⽰的 Curr_st信号 ⽤⼀个类型为虚拟信号类型的 new_state 强制转换代替
#然后在添加波形显⽰就可以了如: #add wave -color red tb_mealymealy_instnew_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_mealymealy_inst*
#创建⼀个vir_new_signal 类型的信号,也就是把Currt_st进⾏类型转换
virtual function {(vir_new_signal)tb_mealymealy_instCurr_st} new_state
add wave -color red tb_mealymealy_instnew_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_prjipcore_dirpll1.v
vlog ...quartus_prjipcore_dirrom_8x256.v
vsim -voptargs=+acc _ex_ipcore
add wave tb_ex_ipcoreex_ipcore_inst*
run 1000ns
  上⾯介绍的知识中,既介绍了普通模块的仿真脚本,也介绍了有IP核设计的脚本仿真,下⾯给出⼀个通⽤的脚本⽂件,当然这个⽂件只
适合⽤于前仿真(即功能仿真),⾄于后仿真后⾯介绍。模板如下所⽰:
#Exit current simulation
quit -sim
#Clear command line information
.main clear
#Creating Libraries(Folder path),example : vlib .
#基本不⽤改,除⾮你要改变库名称和路径


#vlib .lib
#vlib .libwork_a
#vlib .libdesign
#vlib .libaltera_lib
vlib work
#map logic lib to folder path ,example:
#基本不⽤改,除⾮你要改变逻辑库名称
#vmap base_space .libwork_a modelsim will creat a tab named base_space
#vmap design .libdesign
#vmap altera_lib .libaltera_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 _module
#add wave and divider
#当你需要添加分割线时需要修改
#add wave -divider {divider's name}
#add wave (-color red) tb_xxx* |||||| #add wave (-color red) tb's namexxx_instsignal
add wave tb_module*
#run time
run 1ms


四、后仿真
   前⾯介绍的都是前仿真,这⾥就记录⼀下后仿真,脚本内容如下所⽰,其中有些内容是跟前仿真类似的:
#①退出当前仿真功能,退出当前的⼯程,跟在modelsim界⾯的命令⾏敲⼊命令的效果⼀样,之后就可以创建其他的⼯程
quit -sim
#②清除命令⾏显⽰信息
.main clear
#③创建库
vlib .lib
vlib .libwork_a
vlib .libdesign
vlib .libaltera_lib
#④映射逻辑库到物理⽬录
vmap base_space .libwork_a
vmap design .libdesign
vmap altera_lib .libaltera_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_mealymealy_inst=ex_mealy_ -voptargs=+acc -L altera_lib -L base_space -L design base__mealy
#信号显⽰成字符的⽅法,但是后仿真中不⽤虚拟信号
#......创建虚拟的结构体,⽤来产⽣虚拟信号。为什么要产⽣虚拟信号呢?因为在波形上⾯看111之类的,不知道状态的变化
#因此要在状态机中,可以添加虚拟先后,把4'b0001,显⽰成S1这⾥的,⽅便观看
#语法为:virtual type { {被替换16进制 ⽤来显⽰的符号} {} {} ...} 结构体名字
#......创建完虚拟类型的结构体类型后,要进⾏转换显⽰的信号还需要两步:
#⾸先进⾏强制转换:例如 virtual function {(vir_new_signal)tb_mealymealy_instCurr_st} new_state
#就是 将要显⽰的 Curr_st信号 ⽤⼀个类型为虚拟信号类型的 new_state 强制转换代替
#然后在添加波形显⽰就可以了如: #add wave -color red tb_mealymealy_instnew_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_mealymealy_inst*
#创建⼀个vir_new_signal 类型的信号,也就是把Currt_st进⾏类型转换
#virtual function {(vir_new_signal)tb_mealymealy_instCurr_st} new_state


#add wave -color red tb_mealymealy_instnew_state
#⑧运⾏,格式是 run 运⾏时间
run 1us

五、仿真⼯具选择⼼得
  最后在仿真代码的时候,可以使⽤了独⽴的modelsim、altera⾃带的modelsim、ISE⾃带的Isim。在这⾥总结⼀下,也算是⼀种⼼得体
会吧:
(1)建议使⽤FPGA⼯具⾃带的仿真⼯具的情况:
①(带IP核的)简单的设计
②仿真时间不需要太长的

使⽤⾃带的⼯具,只需把可综合代码(包括IP核.qip⽂件)读进QuartusII⼯程、设置仿真的tb⽂件。然后在⼯具那⾥执⾏仿真就可以了。

(2)建议使⽤独⽴modelsim仿真的情况:
①复杂的设计,代码总⾏数达到上万的代码(包含IP核)----使⽤脚本设计。
②需要仿真很久的、很精细的设计(⽐如计数器)
③混合语⾔仿真的时候

(3)前仿真(功能仿真),⼀般只需要设计⽂件跟测试⽂件,因此直接使⽤独⽴版本的modelsim就可以了。如果是后仿真或者带有各种IP
核的仿真,则可以这样做:⽤QIIISEVivado调⽤独⽴的modelsim进⾏仿真。


基于脚本的modelsim⾃动化仿真笔记
  这⾥记录⼀下基于脚本的modelsim⾃动化仿真的⼀些知识和模板,以后忘记了可以到这⾥查。转载请标明出处: 。
⼀、基本介绍
  这⾥介绍⼀下如何利⽤脚本调⽤modelsim进⾏⾃动化仿真,随笔前⾯先介绍⼀下前仿真,随笔结尾处介绍后仿真。前仿真的基本介绍如
下所⽰,由于我的笔记是写在.do⽂件中,因此我这⾥也给代码的格式,如下所⽰:
# #表⽰注释,modelsim不⽀持中⽂,因此可能不能识别注释
#①退出当前仿真功能,退出当前的⼯程,跟在modelsim界⾯的命令⾏敲⼊命令的效果⼀样,之后就可以创建其他的⼯程
quit -sim
#②清除命令⾏显⽰信息;在命令⾏‘敲⼊这个命令,回车’的效果⼀样
.main clear
#③创建库:vlib:创建库到⼀个物理⽬录中,也就是创建⽂件夹⽬录了。
#可以理解库为某⼀个路径的⽂件夹,⽤来存储modelsim的⼀些数据⽂件;
#创建库的格式vlib ,默认库的名字为work
#下⾯的代码意思是:1-在当前路径(.do⽂件的路径)下,创建lib⽂件夹;相当于在命令⾏敲‘vlib lib 回车’
#2-在当前路径的lib⽂件夹下,创建work⽂件夹库;相当于在命令⾏敲‘vlib .libwork’
vlib .lib
vlib .libwork
#④映射逻辑库到物理⽬录;也就是说,在modelsimGUI界⾯的Library选项卡⾥⾯创建⼦选项,这个⼦选项就叫做逻辑库,
#编译⼯程之后,得到⼀堆编译⽂件,这些⽂件名就放在这个逻辑库选项卡⾥⾯。但是编译得到的是实体⽂件,这些⽂件必须
#有⼀个⽬录存储,因此就需要把逻辑库映射到物理(⽂件夹)⽬录,也就是把那些得到的实体⽂件放在某⼀个⽂件夹⽬录(路径当中)
#这样,就可以在实际⽂件夹⾥⾯查看编译得到的⽂件内容,⽽不是单单从选项卡⾥⾯看到名字⽽已
#注意,在映射之前,⼀定要先创建好对应的物理路径
#语法为 vmap work(逻辑库名称) (库的路径)
#下⾯的代码意思是:在modelsim界⾯的library选项卡创建⼀个叫work的选项卡(逻辑库),编译之后得到的⽂件名称就在,
#相应的⽂件就放在.libwork这个⽂件夹⾥⾯。
#当然逻辑库的名字不⼀定是work(modelsim默认是work就⼀般取做work),也可以是top_xxxx,如果是top_xxx(vmap work .libwork)
#那么在modelsim界⾯的library选项卡创建的选项卡名称就是top_xxxx,但是编译之后得到的⽂件还是存放到.libwork的路径⽂件夹中
vmap work .libwork
#⑤编译Verilog 源代码,将编译得到的信息⽂件与编译的⽂件放到④的逻辑库⾥⾯,库名缺省编译到work本地库,⽂件按顺序编译。
#语法为vlog –work(固定格式) work(逻辑库名字) .v .v(要编译的⽂件:路径⽂件)
#主要是编译设计⽂件,测试⽂件,调⽤的IP核.v⽂件,相应的库⽂件,通配符...xxx*.v,要注意编译的顺序
#注意,.v⽂件应该是放在设计或者仿真的⽂件⾥⾯,不要仿真逻辑库路径⾥⾯,逻辑库路径在编译之后会⾃然得复制过来
#下⾯代码的意思是:编译xxx.v这两个⽂件,将编译得到的⽂件与源⽂件放到 work这个⽂件夹⾥⾯。
vlog -work work .tb_ex_shift_reg.v
vlog -work work ...design*.v
#⑥编译完后启动仿真,语法格式为vsim –lib .
#下⾯的代码意思是:优化部分参数(-voptargs=+acc),链接到默认的work 库,启动仿真顶层测试逻辑库(work)⾥⾯的tb_ex_shift_reg⽂件
vsim -voptargs=+acc _ex_shift_reg
#⑦添加波形与分割线。
#添加波形:就是添加要显⽰波形,语法格式:add wave
#。。。如果添加的波形不只是顶层模块的,还有顶层下⾯的例化模块的信号,
#就是#add wave 测试顶层的名字例化⼦模块的例化名字⼦模块信号的名字
#。。。add wave #-radix ?hexadecimal tb_topmydesigndata #-radix ?参数是约束bus是以那种进制显⽰。
#例如:binary 、ascii、unsigned、octal、hex
#。。。add wave –format logic tb_topmydesignclk #-format 参数是约束波形为那种类型,
#包括 logic ;literal; analog-step; analog-interpolated;
#add wave -radix bin tb_ex_shift_rego_lvds_d 以⼆进制格式显⽰o_lvds_d波形信号
#添加分割线:不同的信号之间进⾏分割,语法格式是add wave -divider {分割线的名字}。
#分割线所处的位置是相对于波形信号的。下⾯代码的意思就是在lvds_clock信号上⾯添加了⼀条分割线。
add wave -divider {tb_ex_shift_reg_111}
add wave tb_ex_shift_reglvds_clock
add wave tb_ex_shift_regrst_n
add wave tb_ex_shift_reglvds_d
add wave tb_ex_shift_regi_30
add wave -radix bin tb_ex_shift_rego_lvds_d
add wave -divider {ex_shift_reg_inst_888}
#add wave 测试顶层的名字例化模块的例化名字信号的名字
add wave tb_ex_shift_regex_shift_reg_inst*
#⑧运⾏,格式是 run 运⾏时间
run 1us


⼆、前仿真进阶
  上⾯的仿真基础能够仿真基本的模块了,下⾯再来引⼊⼀些“酷炫”的知识:前仿真脚本与过程(优化、状态机名称、颜⾊等)内容,如
下所⽰:
#①退出当前仿真功能,退出当前的⼯程,跟在modelsim界⾯的命令⾏敲⼊命令的效果⼀样,之后就可以创建其他的⼯程
quit -sim
#②清除命令⾏显⽰信息
.main clear
#③创建库
vlib .lib
vlib .libwork_a
vlib .libdesign
vlib .libaltera_lib
#④映射逻辑库到物理⽬录
vmap base_space .libwork_a
vmap design .libdesign
vmap altera_lib .libaltera_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__mealy
#信号显⽰成字符的⽅法
#......创建虚拟的结构体,⽤来产⽣虚拟信号。为什么要产⽣虚拟信号呢?因为在波形上⾯看111之类的,不知道状态的变化
#因此要在状态机中,可以添加虚拟先后,把4'b0001,显⽰成S1这⾥的,⽅便观看
#语法为:virtual type { {被替换16进制 ⽤来显⽰的符号} {} {} ...} 结构体名字
#......创建完虚拟类型的结构体类型后,要进⾏转换显⽰的信号还需要两步:
#⾸先进⾏强制转换:例如 virtual function {(vir_new_signal)tb_mealymealy_instCurr_st} new_state
#就是 将要显⽰的 Curr_st信号 ⽤⼀个类型为虚拟信号类型的 new_state 强制转换代替
#然后在添加波形显⽰就可以了如: #add wave -color red tb_mealymealy_instnew_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_mealymealy_inst*
#创建⼀个vir_new_signal 类型的信号,也就是把Currt_st进⾏类型转换
virtual function {(vir_new_signal)tb_mealymealy_instCurr_st} new_state
add wave -color red tb_mealymealy_instnew_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_prjipcore_dirpll1.v
vlog ...quartus_prjipcore_dirrom_8x256.v
vsim -voptargs=+acc _ex_ipcore
add wave tb_ex_ipcoreex_ipcore_inst*
run 1000ns
  上⾯介绍的知识中,既介绍了普通模块的仿真脚本,也介绍了有IP核设计的脚本仿真,下⾯给出⼀个通⽤的脚本⽂件,当然这个⽂件只
适合⽤于前仿真(即功能仿真),⾄于后仿真后⾯介绍。模板如下所⽰:
#Exit current simulation
quit -sim
#Clear command line information
.main clear
#Creating Libraries(Folder path),example : vlib .
#基本不⽤改,除⾮你要改变库名称和路径


#vlib .lib
#vlib .libwork_a
#vlib .libdesign
#vlib .libaltera_lib
vlib work
#map logic lib to folder path ,example:
#基本不⽤改,除⾮你要改变逻辑库名称
#vmap base_space .libwork_a modelsim will creat a tab named base_space
#vmap design .libdesign
#vmap altera_lib .libaltera_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 _module
#add wave and divider
#当你需要添加分割线时需要修改
#add wave -divider {divider's name}
#add wave (-color red) tb_xxx* |||||| #add wave (-color red) tb's namexxx_instsignal
add wave tb_module*
#run time
run 1ms


四、后仿真
   前⾯介绍的都是前仿真,这⾥就记录⼀下后仿真,脚本内容如下所⽰,其中有些内容是跟前仿真类似的:
#①退出当前仿真功能,退出当前的⼯程,跟在modelsim界⾯的命令⾏敲⼊命令的效果⼀样,之后就可以创建其他的⼯程
quit -sim
#②清除命令⾏显⽰信息
.main clear
#③创建库
vlib .lib
vlib .libwork_a
vlib .libdesign
vlib .libaltera_lib
#④映射逻辑库到物理⽬录
vmap base_space .libwork_a
vmap design .libdesign
vmap altera_lib .libaltera_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_mealymealy_inst=ex_mealy_ -voptargs=+acc -L altera_lib -L base_space -L design base__mealy
#信号显⽰成字符的⽅法,但是后仿真中不⽤虚拟信号
#......创建虚拟的结构体,⽤来产⽣虚拟信号。为什么要产⽣虚拟信号呢?因为在波形上⾯看111之类的,不知道状态的变化
#因此要在状态机中,可以添加虚拟先后,把4'b0001,显⽰成S1这⾥的,⽅便观看
#语法为:virtual type { {被替换16进制 ⽤来显⽰的符号} {} {} ...} 结构体名字
#......创建完虚拟类型的结构体类型后,要进⾏转换显⽰的信号还需要两步:
#⾸先进⾏强制转换:例如 virtual function {(vir_new_signal)tb_mealymealy_instCurr_st} new_state
#就是 将要显⽰的 Curr_st信号 ⽤⼀个类型为虚拟信号类型的 new_state 强制转换代替
#然后在添加波形显⽰就可以了如: #add wave -color red tb_mealymealy_instnew_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_mealymealy_inst*
#创建⼀个vir_new_signal 类型的信号,也就是把Currt_st进⾏类型转换
#virtual function {(vir_new_signal)tb_mealymealy_instCurr_st} new_state


#add wave -color red tb_mealymealy_instnew_state
#⑧运⾏,格式是 run 运⾏时间
run 1us

五、仿真⼯具选择⼼得
  最后在仿真代码的时候,可以使⽤了独⽴的modelsim、altera⾃带的modelsim、ISE⾃带的Isim。在这⾥总结⼀下,也算是⼀种⼼得体
会吧:
(1)建议使⽤FPGA⼯具⾃带的仿真⼯具的情况:
①(带IP核的)简单的设计
②仿真时间不需要太长的

使⽤⾃带的⼯具,只需把可综合代码(包括IP核.qip⽂件)读进QuartusII⼯程、设置仿真的tb⽂件。然后在⼯具那⾥执⾏仿真就可以了。

(2)建议使⽤独⽴modelsim仿真的情况:
①复杂的设计,代码总⾏数达到上万的代码(包含IP核)----使⽤脚本设计。
②需要仿真很久的、很精细的设计(⽐如计数器)
③混合语⾔仿真的时候

(3)前仿真(功能仿真),⼀般只需要设计⽂件跟测试⽂件,因此直接使⽤独⽴版本的modelsim就可以了。如果是后仿真或者带有各种IP
核的仿真,则可以这样做:⽤QIIISEVivado调⽤独⽴的modelsim进⾏仿真。

-

基于脚本的modelsim自动化仿真笔记

发布时间:2022-03-30 02:09:50
文章版权声明:除非注明,否则均为IT技术网-学习WEB前端开发等IT技术的网络平台原创文章,转载或复制请以超链接形式并注明出处。

发表评论

评论列表 (有 9 条评论,38人围观)
外墙漏水V铁粉1 minute ago Google Chrome 93.0.4577.82 Windows 10 x64
#由于创建了多个逻辑映射库
上海品牌设计V铁粉28 minutes ago Google Chrome 93.0.4577.82 Windows 10 x64
#由于创建了多个逻辑映射库
申万巴黎新经济净值V铁粉1 minute ago Google Chrome 93.0.4577.82 Windows 10 x64
⽤来存储modelsim的⼀些数据⽂件;#创建库的格式vlib
安装程序制作V铁粉4 minutes ago Google Chrome 93.0.4577.82 Windows 10 x64
但是编译得到的是实体⽂件
解放西路V铁粉15 minutes ago Google Chrome 93.0.4577.82 Windows 10 x64
仿真⼯具选择⼼得   最后在仿真代码的时候
镜像文件V铁粉8 minutes ago Google Chrome 93.0.4577.82 Windows 10 x64
但是后仿真中不⽤虚拟信号#......创建虚拟的结构体
2007年新会计准则V铁粉10 minutes ago Google Chrome 93.0.4577.82 Windows 10 x64
#就是#add wave 测试顶层的名字例化⼦模块的例化名字⼦模块信号的名字#
桌面切换软件V铁粉30 minutes ago Google Chrome 93.0.4577.82 Windows 10 x64
⽽启动仿真的时候的是需要链接库

最近发表

随便看看

热门文章

标签列表