Tcl ModelSim在执行[gets stdin]时冻结

Tcl ModelSim在执行[gets stdin]时冻结,tcl,modelsim,Tcl,Modelsim,我有一个TCL stript来指导我的ModelSim模拟。我希望能够打破模拟,要求用户提供一些输入,然后继续vsim\u break并不是我想要的。我尝试了设置用户输入[gets stdin],但模拟器立即冻结。还有其他方法吗?当您执行获取stdin时,Tcl(通常)会等待,直到收到标准输入的一行。如果您想让GUI(或其他后台处理系统)继续运行,但仍在等待命令,则需要稍微不同的方法 proc getStdinLine {} { set ::user_input [gets stdin]

我有一个TCL stript来指导我的ModelSim模拟。我希望能够打破模拟,要求用户提供一些输入,然后继续
vsim\u break
并不是我想要的。我尝试了
设置用户输入[gets stdin]
,但模拟器立即冻结。还有其他方法吗?

当您执行
获取stdin
时,Tcl(通常)会等待,直到收到标准输入的一行。如果您想让GUI(或其他后台处理系统)继续运行,但仍在等待命令,则需要稍微不同的方法

proc getStdinLine {} {
    set ::user_input [gets stdin]
}
fileevent stdin readable getStdinLine
vwait ::user_input
# Unregister the callback
fileevent stdin readable {}

当心此代码可能存在重入问题;如果您的脚本在等待时设法返回到同一点,它很容易陷入真正的混乱。这是因为
vwait
记录了C堆栈上等待的内容;即使在Tcl 8.6中也是如此(尽管它有协同程序,如果ModelSim足够合作的话,您可以使用它来创建一个解决方案)。

感谢您的回答,它现在工作得更好了。是否可以从ModelSim控制台而不是stdin请求用户输入?当需要用户输入时切换到unix控制台有点难看。@Andy这是一个好问题,但我不知道答案(因为我不是ModelSim用户,并且在不同的领域工作)。我确实知道ModelSim使用Tk,所以您应该能够弹出一个对话框(带有
顶层
标签
条目
),但这太多了,无法在注释中使用。