在ModelSim onbreak中获取触发断言的上下文

时间:2015-01-08 12:24:36

标签: tcl vhdl modelsim

我尝试使用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}。

1 个答案:

答案 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]
    }
 }