优雅结束 VHDL 测试平台仿真
当 VHDL 测试平台达到预期执行末尾,您会希望仿真器干净停止,并尽可能将控制权返回给调用脚本。本文回顾主流 VHDL 仿真器中停止仿真的常用可靠技术,提供 ModelSim、Vivado 和 Tcl 脚本的代码示例。
1. 使用 finish 过程 (VHDL‑2008)
std.env 包的 finish 例程是结束无错误完成测试平台最直接的方式。仅以 VHDL‑2008 编译测试平台;RTL 可保持早期标准。
use std.env.finish; ... SEQUENCER_PROC : process begin -- Insert testbench logic here wait until stop_condition; report "Calling 'finish'"; finish; end process;
默认情况下,finish 会在 GUI 中弹窗确认终止。若偏好自动退出——尤其是批处理模式——给 vsim 加 -onfinish stop 开关:
vsim -onfinish stop work.using_finish_tb
批处理模式 (vsim -c) 下,仿真器干净退出并将控制权返回 Shell,适合回归脚本:
jonas@ubuntu:~/stop_tb$ vsim -c -do 'vsim work.using_finish_tb; run -all' # … # ** Note: Calling 'finish' # Time: 1 ms Iteration: 0 Instance: /using_finish_tb # End time: 22:58:31 on Jun 21,2020, Elapsed time: 0:00:00 # Errors: 0, Warnings: 8 jonas@ubuntu:~/stop_tb$
存在两个重载:procedure FINISH; 和 procedure FINISH (STATUS : INTEGER);。状态值仿真器相关,不建议依赖它作为退出码。ModelSim 可在 Tcl 脚本用 exit -code <value> 显式设置 Shell 退出码。
2. 使用 stop 过程 (VHDL‑2008)
stop 例程暂停仿真——适合人工检查或稍后恢复。表现如断点。
use std.env.stop; ... SEQUENCER_PROC : process begin wait until stop_condition; report "Calling 'stop'"; stop; end process;
脚本驱动工作流中,stop 会进入 Tcl Shell,除非手动发 exit 否则脚本挂起。因此 finish 通常更适合自动化运行。
3. 利用断言失败
部分设计者故意引发断言失败终止测试平台。此法适用于所有 VHDL 版本,无需额外导入:
SEQUENCER_PROC : process begin wait until stop_condition; assert false report "Test: OK" severity failure; end process;
虽保证仿真器终止,但控制台会报告 failure 即使测试成功,会误导将失败视为错误的自动化回归工具。
4. 用 Tcl 回调控制终止
为更灵活控制——如检查信号或清理——可将 VHDL 信号绑定到 Tcl 回调。VHDL 测试平台在所有测试用例完成时置位布尔 stop_condition。
signal stop_condition : boolean; begin -- Example: toggle after 1 ms stop_condition <= not stop_condition after 1 ms; SEQUENCER_PROC : process begin -- testbench logic wait; -- keep the process dormant end process;
ModelSim
when {stop_condition} { stop echo "Test: OK" } run -all
stop_condition 变真时回调运行,打印消息并暂停仿真。可用 exit 替代 stop 立即退出仿真器。
Vivado
set sim_fileset sim_1 launch_simulation -simset [get_filesets $sim_fileset] add_condition -notrace stop_condition { stop puts "Test: OK" } run all
-notrace 标志抑制命令回显,保持控制台整洁。
最终建议
跨所有主流仿真器,VHDL‑2008 finish 过程仍是最可移植、最脚本友好的选择。它在 GUI 和批处理环境下都能干净终止仿真,无残留交互提示。
不过,Tcl 回调在需要暂停仿真并即时检查/操作信号时提供强大调试能力。
下载示例工程
ModelSim 用户提交邮箱可收到包含四个演示测试平台的 Zip 包。(Vivado 用户稍加修改即可复现示例。)
VHDL