gpt4 book ai didi

verification - 在systemverilog中正确使用 "disable fork"

转载 作者:行者123 更新时间:2023-12-04 05:29:23 36 4
gpt4 key购买 nike

我有一些类似于以下的伪代码:

for (lets say 10 iterations)
begin
// Do some configuration changes
fork
begin
///apply input to design
end
begin
while (1)
/// at particular point update expected status / values
end
begin
while (1)
/// read status and verify with expected values
end
join_any
end

从代码:仅输入应用程序可以中断fork,因为其他两个线程在while(1)下工作
我想禁用每次迭代之间的所有线程,即一旦应用了输入流-禁用所有生成的线程,直到下一次迭代开始(使用新配置)

所以我将上面的代码修改为
 ....
join_any
disable_fork
end

但这似乎也禁用了for循环/或类似的东西,我不明白,但效果是测试挂了。
有人可以向我解释原因和解决方案吗?

最佳答案

“disable fork”不仅杀死您的fork ... join_any启动的进程,而且杀死执行disable-fork的同一进程的后代。如果您在此进程的生命周期中较早启动了任何其他进程(例如,使用fork ... join_none),那么这些其他进程也将被杀死。

您可以通过使fork ... join_any及其以后的禁用分支在自己的新子进程中运行来轻松地防止这种情况的发生。这限制了禁用前叉的效果,因此它只能影响您关心的新启动的进程,并且保证不会有其他有害的影响。

通过将整个困惑包含在“fork begin ... end join”中,如下所示:

fork begin // isolate the following code as a single child process
fork // launch the processes you wish to manage
apply_input();
update_status();
verify_status();
join_any // kill off the *_status threads when apply_input terminates
disable fork;
end join // end of child process isolation

这是fork ... join_any和fork ... join_none的一个众所周知的问题。最近在Verification Guild论坛上进行了讨论,并在Sutherland和Mills的书“Verilog和SystemVerilog陷阱”的第79和80节中进行了介绍。

在一行上放上“fork begin”和“end join”是不寻常的,但是我喜欢它作为一种方法,可以很明显地看出我正在同步 fork 一个子进程。通常,这样做是没有用的,但是在这种情况下,这是必不可少的。

这个习惯用法非常普遍,而且很容易出错,以至于您可能希望将其封装在一对宏中(我不喜欢这样,但是...):
`define BEGIN_FIRST_OF fork begin fork
`define END_FIRST_OF join_any disable fork; end join

现在您可以写...
`BEGIN_FIRST_OF
apply_input();
update_status();
verify_status();
`END_FIRST_OF

其中的名称“... FIRST_OF”旨在反射(reflect)与执行相同操作的Specman(e)语言构造的相似性。

关于verification - 在systemverilog中正确使用 "disable fork",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14287446/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com