Tcl ModelSim:在';何时';块

Tcl ModelSim:在';何时';块,tcl,modelsim,Tcl,Modelsim,我试图让ModelSim模拟在特定事件发生时停止,或在超时后停止,以先到者为准 我尝试了一种纯软件方法,使用while循环,在每次迭代时发出run1ns命令,并检查是否满足条件: set clockCycles 0 set clockCycleLimit 200 while {/some_signal != 1 && $clockCycles < $clockCycleLimit} { run 1 ns set clockCycles [expr {$clo

我试图让ModelSim模拟在特定事件发生时停止,或在超时后停止,以先到者为准

我尝试了一种纯软件方法,使用while循环,在每次迭代时发出
run1ns
命令,并检查是否满足条件:

set clockCycles 0
set clockCycleLimit 200
while {/some_signal != 1 && $clockCycles < $clockCycleLimit} {
    run 1 ns
    set clockCycles [expr {$clockCycles + 1}]
}
这运行速度非常快,更加优雅。我唯一的问题是,每次代码运行时,它都会在文本窗口中显示一条恼人的消息:“Simulation stop requested”

我将此代码用作交互式ModelSim会话的一部分,这些消息不断出现会破坏用户体验。我正试图找到一种使它们失效的方法。到目前为止,我还没有找到任何有效的方法

有人能帮忙吗


谢谢

所有使用
stop
或断点机制的东西似乎都会生成该消息;它甚至可能来自模拟引擎本身。似乎没有办法告诉
stop
保持沉默(当然,除了联系客户支持和希望之外)

这意味着我能想到的唯一方法——这是一个丑陋的黑客行为——是在
when
的回调脚本(使用
vwait
tkwait
)中启动另一个Tcl事件循环副本,以支持GUI交互。代码很短,但您确实不能让模拟继续运行或终止,除非完成此内部事件循环,然后在回调结束时让
(或调用嘈杂的
停止
)。考虑“运行模式对话框”而不是“运行整个GUI”


如果模拟引擎本身使用Tcl事件循环来管理事物的调度,那么它可能仍然不起作用。可能不是……但我真的说不出来,所以你必须谨慎行事(不,我肯定不是持牌人,所以我不能为你测试)。出错可能会导致C堆栈崩溃并导致实际问题,因此要小心。

要配置
Modelsim
以不生成此类消息(可从5.6版获得),请键入下一个TCL命令:

set PrefMain(noRunMsg) 1

@凯文卡迪约的谨慎是值得的。Modelsim在Tcl事件循环中包含了一些自定义的黑客行为,以实现其断点功能,这就是为什么Tcl
source
命令与其扩展的
do
命令之间存在不同的行为。
set PrefMain(noRunMsg) 1