如何在检测到测试夹具问题时向Questa Vsim返回状态码?
需求背景与问题
我原本使用基于Icarus Verilog的测试bench,目前正在切换到Questa模拟器。这些测试bench支持单独调用或批量执行。Icarus有扩展特性允许返回非零状态码,我通过头文件中的Verilog宏来处理不同模拟器的差异,宏定义如下:
// Allow modsim/questa and other simulators to run. // $finish_and_return iverilog extention allows *FAIL* status to halt // make. This will pause unit tests. Otherwise, the output must be // buffered (and non-real time). `ifdef __ICARUS__ `define RETURN_STAT(status) $finish_and_return(status) `else `define RETURN_STAT(status) $finish() `endif `ifdef QUESTA `define TRACE(name) "\"name.vcd\"" `else `define TRACE(name) "\"name.lxt\"" `endif
多数单元测试在两款模拟器下表现一致,但某款测试在Questa中存在差异(此为背景,非本次核心问题)。我现在需要修改RETURN_STAT宏,使其在Questa环境下也能返回状态码。测试bench由TCL脚本调用,脚本内容如下:
# Simulate the design. vsim -coverage -voptargs="+cover=bcesfx" $test_name -do "coverage save -onexit coverage.cov; run -all"
随后通过vsim.exe -c -do questa.tcl启动仿真,最终需要将状态码返回给make工具。
此前有类似的VHDL相关问题,但不确定是否适用于Verilog。注释中提到的“否则输出必须被缓冲(非实时)”,指的是通过$display()打印'PASS'或'FAIL',再在Makefile中用grep捕获结果,但我需要保留所有仿真输出。另外,测试bench中还有一个名为run_failed的reg变量,如果Vsim能将这个变量的值传递给TCL脚本或系统环境变量,我也可以利用这种方式实现状态码返回。
内容的提问来源于stack exchange,提问作者artless-noise-bye-due2AI
相关产品推荐
相关产品推荐

