仿真(3):do文件写法
Q来教我写.do文件~A好的.do文件就是 ModelSim/QuestaSim 的批处理脚本。它把你手动点击鼠标或逐条输入命令的操作全部写在一个文件里一次性跑完。它本质上是Tcl 脚本扩展名是.do核心命令就那么几个。我教你写一个最通用的模板。第一步一个最通用的.do文件模板适用于任何项目用文本编辑器如 gedit、Notepad新建一个文件命名为simulate.do输入以下内容tcl# # 1. 清除上次仿真环境避免冲突 # quit -sim # # 2. 创建并映射工作库 # vlib work vmap work work # # 3. 编译所有 .v 和 .sv 文件 # # 方法 A如果当前目录下全是你的文件直接全部编译 vlog *.v *.sv # 方法 B如果只想编译指定的几个文件把注释去掉把方法A注释掉 # vlog full_adder.v # vlog tb_full_adder.v # # 4. 加载仿真指定顶层模块 # # 注意这里要加载的是 Testbench顶层而不是被测试的模块 vsim work.tb_full_adder # # 5. 添加波形信号 # # -r 表示递归添加所有子模块的信号 # * 表示添加该层级所有信号 add wave -r sim:/tb_full_adder/* # # 6. 运行仿真 # # -all 表示一直运行到遇到 $stop 或 $finish run -all # 或者你可以指定固定时间如果 TB 里没有自动结束的话 # run 100ns # # 7. 查看波形可选 # # 这行通常不用写因为图形界面会自动弹出 # view wave第二步如果你不想写 Testbench想手动给激励纯命令行方式如果你只有一个full_adder.v没有tb_full_adder.v那么.do文件需要手动force信号tclquit -sim vlib work vmap work work vlog full_adder.v # 加载模块 vsim work.full_adder # 添加信号 add wave -position insertpoint sim:/full_adder/* # 手动施加激励每隔10ns变化一次 force a 0 force b 0 force cin 0 run 10ns force a 0 force b 1 force cin 0 run 10ns force a 1 force b 0 force cin 0 run 10ns force a 1 force b 1 force cin 0 run 10ns # 最后退出 run 10ns quit -sim第三步如何在 ModelSim 里运行这个文件打开 ModelSim。在 Transcript底部的命令行窗口里切换到你的文件所在目录tclcd D:/your_project_folder输入命令执行你的脚本tcldo simulate.do第四步最常用的几条命令解释直接记这几句就够了命令作用示例quit -sim关闭当前仿真会话相当于重置环境quit -simvlib work创建一个名为work的库文件夹vlib workvlog *.v编译所有.v文件vlog full_adder.vvsim work.模块名加载某个模块进行仿真vsim work.tb_topadd wave *添加当前层级所有信号到波形图add wave sim:/tb_top/*add wave -r *递归添加所有子模块的信号add wave -r /*run -all一直运行到仿真结束$stoprun -allrun 100ns只运行100纳秒run 100nsrestart重置仿真时间为0不清除信号restartforce强制给信号赋值命令行方式force a 1第五步一个你马上就能用起来的终极版既然你刚写完Full_adder在项目文件夹里新建sim.do直接复制粘贴这个tclquit -sim vlib work vmap work work vlog *.v vsim work.tb_full_adder add wave -position insertpoint sim:/tb_full_adder/* run -all然后在你写好的Full_adder.v和tb_Full_adder.v所在的文件夹下启动 ModelSim输入do sim.do波形就会自动出来。以后你跑任何实验只要把tb_full_adder改成你的顶层 TB 名字就行了。