System verilog Systemverilog派生的进程在父进程执行阻塞语句后执行

System verilog Systemverilog派生的进程在父进程执行阻塞语句后执行,system-verilog,System Verilog,本文提交了一个与Systemverilog LRM相矛盾的示例: …在分叉后台进程时,允许 新创建的子流程有机会在 继续执行父进程。这很容易 使用以下代码完成: 然而,IEEE Systemverilog LRM指出: “join_none。父进程继续与并发执行 派生的所有进程。派生的进程不 开始执行,直到父线程执行阻塞语句 或终止。” 是哪一个?这里没有矛盾。这样看: 加入\u无。父进程继续与fork生成的所有进程并发执行。在父线程执行阻塞语句或终止之前,生成的进程不会开始执行 我们被告知分叉

本文提交了一个与Systemverilog LRM相矛盾的示例:

…在分叉后台进程时,允许 新创建的子流程有机会在 继续执行父进程。这很容易 使用以下代码完成:

然而,IEEE Systemverilog LRM指出:

“join_none。父进程继续与并发执行 派生的所有进程。派生的进程不 开始执行,直到父线程执行阻塞语句 或终止。”


是哪一个?

这里没有矛盾。这样看:

加入\u无
。父进程继续与fork生成的所有进程并发执行。在父线程执行阻塞语句或终止之前,生成的进程不会开始执行

我们被告知分叉过程不会立即启动。它们等待产生它们的父进程屈服(通过终止或遇到阻塞语句)。fork语句基本上对进程进行调度。调度器只有在已经运行的线程(父进程)产生时才有机会开始执行它们


您引用的第一个示例建议您给派生的进程一个开始执行的机会。为此,它要求您引入一个
#0
语句。当父进程遇到阻塞语句
#0
时,它会生成阻塞语句。由此产生的进程有机会开始执行。

顺便说一句,我知道这只是一个简单的例子,但我绝不建议在代码中的任何地方使用#0。如果你不理解使用它的意义,你就不会理解使用它所产生的问题。@Greg谢谢,这是有道理的#0是一个阻塞语句,它使父级屈服于分叉的子级#0是“time-0-delay”阻塞语句。
program test;
  initial begin
    fork
        process1;
        process2;
        process3;
     join_none

      #0;
      // parent process continue
  end
endprogram