modelsim脚本对于小的RTL代码开发可以省去testbench的编写,写一个小的脚本运行查看设计的代码功能的正确性,方便简单,基本指令很简单,如下:
vlib 文件夹
vmap 映射文件夹名//以上两个文件夹名一致
vcom(编译VHDL代码)/vlog(编译Verilog代码) 要编译的.vhd / .v文件名
vsim -L 文件夹(-L是表示仿真的时候包含“文件夹”库中所有模块。) 文件夹.文件名(此处文件名不要加后缀) -t 1ns(-t 1ns是仿真时序图上最小的时间单位,如果不加-t 1ns,默认的是ps。)
add wave -r *(将test里所有的信号都添加到波形图里。(这行代码会自动将波形图调用出来)r 表示 region。)
接下来是对时钟和各输入信号复制,用的语句有repeat ,force, run等,下面是一个例子
注:modelsim脚本使用过程中遇到的问题,第三行的命令字,当开发的是VHDL语言时用的是vcom
但是如果用的verilog开发的硬件语言时,该命令字要改成vlog,其他不变
vlib work //定义库文件夹名为work
vmap work //定义映射文件夹名为work
vlog signal_generate.v //要编译的文件是.v文件用的命令是vlog,如果是.vhd用vcom
vsim -L work work.signal_generate -t 1ns //要进行仿真的是work文件夹下的signal_generate文件
add wave -r *
force -repeat 2 clk 0 0,1 1 //产生周期为2ns 低电平,占空比1:1,高电平 高电平占用时间是1ns(各颜色对应的意义)
run 500 //接上面的时序运行500个2ns周期的时钟。
force reset 1 //在RTL代码设计里面的reset复位信号,一开始赋值为1
run 10 //reset的值为1运行10ns也就是5个时钟周期(每个时钟周期2ns)
force reset 0 //将reset的值复位为0
run 490 //运行接下来一直为低
1.对于二进制和十六进制的数据,应该的写法是2#00111010或者是16#FA,与Verilog中的进制数写法不同如二进制8'b00111100(8代表位宽,b代表二进制数,表示的位宽为8的二进制数)或者8'hFA(表示的是位宽为8的十六进制数FA)。
2.在后面的run的时间是一直累加的,force -repeate就已经是一直循环了,具体循环多少,取决于后面所有的run后面的数据的累加,如下面的例子:
上面是一个并转串的RTL代码设计。下面是对应的脚本写法:
vlib work
vmap work
vlog converter.v
vsim -L work work.converter -t 1ns
add wave -r *
force -repeat 2 clk 0 0,1 1 //时钟重复
force reset 1 //取reset为1走两个时钟间隔(一个时钟周期,2指的是2ns)
run 2
force reset 0 //之后将reset的值赋值为0
force din 2#01001110 //二进制数的赋值方式
force en 1
force load 1 //将en和load均赋值为1走6个时间单位
run 6
force load 0 //后赋值load为0
run 22 //最终走994个时间单位,至此所有的时间会走2+6+22共30ns
// 时间单位。如果不加最后这句run整个仿真是不会有波形的。
注意看仿真结果是最后跑了30个ns单位
将脚本文件保存成后缀为.do的文件,并和RTL代码放在同一目录下面,启动Modelsim后,Modelsim的工作目录切换到设计代码的目录下(File –> Change Directory )。随后在Modelsim的命令行里输入 do sim.do ,回车。即可出现上面的仿真波形。有疑点还请多指教。 |