我尝试使用ModelSim(6.5 PE)中的TCL脚本(TCL版本8.4)自动进行VHDL代码的单元测试。
基于relevant TCL-reference manual,我目前能够使用onbreak {}
命令处理断言,如下所示,这允许我以受控方式继续或停止模拟。
但是,我还希望能够在该处理程序中获得更多上下文,特别是触发中断的断言的文件名,行号和标签。 然后,我会将此信息转发给持续集成工具。
proc break_handler {} {
upvar #0 now now
# this is where I would need some more information about the current break point:
set break_point_information "???"
puts "Break: after $now with $break_point_information!"
# prevent infinite simulation:
if {$some_condition} {
stop
} else {
run -continue
}
}
# Skipped: scripted compilation of project
# Stop on Note (1) ... Failure (4)
set BreakOnAssertion 1
onbreak { break_handler }
# Skipped: scripted simulation start and report generation
我想要的信息基本上已经打印到控制台
# ** Warning: End of Testbench
# Time: 1234 ns Iteration: 0 Process: /something/testing File: C:/something.vhd
# Break in Process testing at C:/comething.vhd line 1234
因此,我可能会记录并解析transcript file
。但是,这首先是我想要避免的......
我最接近的是使用[runStatus -full]
,但这提供了更少的信息(例如break simulation_stop
}。
答案 0 :(得分:2)
我们开发的免费开源VUnit(https://github.com/LarsAsplund/vunit)提供了您所需要的功能。它将指向错误位置并为您提供调用堆栈。如果没有错误,我们基本上有一个内部信号由testbench(最后的test_runner_cleanup过程)设置为true。如果由于任何原因没有设置该信号(如果测试平台设置为在失败的断言上停止,则可能根本不会调用该过程)我们的Python脚本调用的一段tcl代码将会看到。这是来自https://github.com/LarsAsplund/vunit/blob/master/vunit/modelsim_interface.py
的tcl片段run -all
set failed [expr [examine -internal ${status_boolean}]!=TRUE]
if {$failed} {
catch {
# tb command can fail when error comes from pli
echo
echo "Stack trace result from 'tb' command"
echo [tb]
echo
echo "Surrounding code from 'see' command"
echo [see]
}
}