仿真(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信号:

tcl

quit -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 里运行这个文件?

  1. 打开 ModelSim。

  2. 在 Transcript(底部的命令行窗口)里,切换到你的文件所在目录:

    tcl

    cd D:/your_project_folder
  3. 输入命令执行你的脚本:

    tcl

    do simulate.do

第四步:最常用的几条命令解释(直接记这几句就够了)

命令作用示例
quit -sim关闭当前仿真会话(相当于重置环境)quit -sim
vlib work创建一个名为work的库文件夹vlib work
vlog *.v编译所有.v文件vlog full_adder.v
vsim work.模块名加载某个模块进行仿真vsim work.tb_top
add wave *添加当前层级所有信号到波形图add wave sim:/tb_top/*
add wave -r *递归添加所有子模块的信号add wave -r /*
run -all一直运行到仿真结束($stop)run -all
run 100ns只运行100纳秒run 100ns
restart重置仿真时间为0,不清除信号restart
force强制给信号赋值(命令行方式)force a 1

第五步:一个你马上就能用起来的终极版

既然你刚写完Full_adder,在项目文件夹里新建sim.do,直接复制粘贴这个:

tcl

quit -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.vtb_Full_adder.v所在的文件夹下启动 ModelSim,输入do sim.do,波形就会自动出来。以后你跑任何实验,只要把tb_full_adder改成你的顶层 TB 名字就行了。