我正在尝试让ModelSim模拟在特定事件发生时或超时后停止,以先到者为准。
我尝试了一种纯软件方法,使用while循环并在每次迭代时发出run 1 ns
命令并检查条件是否已满足:
set clockCycles 0
set clockCycleLimit 200
while {/some_signal != 1 && $clockCycles < $clockCycleLimit} {
run 1 ns
set clockCycles [expr {$clockCycles + 1}]
}
这有效,但有点慢。因此,我尝试使用when
命令的新方法。
when {/some_signal == '1'} {
stop
}
run 200 ns
这种方式运行得非常快,而且更加优雅。我遇到的唯一问题是它在Transcript窗口中显示一条恼人的消息:每次运行此代码时都会“请求模拟停止”。
我使用此代码作为交互式ModelSim会话的一部分,这些消息不断出现,破坏了用户体验。我试图找到一种方法来禁用它们。到目前为止,我还没有发现任何有用的东西。
有人能帮忙吗?
谢谢!
答案 0 :(得分:0)
使用stop
或断点机制的所有内容似乎都会生成该消息;它甚至可能来自模拟引擎本身。似乎没有办法告诉stop
保持沉默(当然没有联系客户支持和希望)。
这意味着我能想到的唯一方法 - 这是一个丑陋的黑客 - 就是在when
&#39; s中启动另一个Tcl事件循环的副本回调脚本(使用vwait
或tkwait
)来支持GUI交互。代码很短,但你真的一定不能让模拟继续运行或被杀掉,除非完成这个内部事件循环然后让{{1}回调完成(或调用嘈杂的when
)。想想“运行模态对话框”而不是“运行整个GUI”。
如果模拟引擎本身使用Tcl事件循环来管理事物的调度,它仍然可能不起作用。 可能不是......但是我真的无法告诉你,所以你必须小心谨慎(不,我绝对不是被许可人,所以我不能为你测试)。这样做会导致C堆栈爆炸并导致实际问题,所以要小心。
答案 1 :(得分:0)
要将Modelsim
配置为不生成此类消息(可从5.6版获得),请键入下一个TCL命令:
set PrefMain(noRunMsg) 1