【问题标题】:Systemverilog spawned processes execute after parent executes blocking statementSystemverilog 衍生进程在父进程执行阻塞语句后执行
【发布时间】:2014-10-23 03:44:45
【问题描述】:

这篇题为Systemverilog Event Regions Race Avoidance & Guidelines的论文提交了一个与Systemverilog IEEE 1800-2012 LRM相矛盾的例子:

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

program test;
  initial begin
    fork
        process1;
        process2;
        process3;
     join_none

      #0;
      // parent process continue
  end
endprogram

但是 IEEE Systemverilog LRM IEEE 1800-2012 声明:

"join_none.父进程继续并发执行 由 fork 产生的所有进程。产生的进程不 开始执行直到父线程执行阻塞语句 或终止。”

这是什么?

【问题讨论】:

  • 顺便说一句,我知道这只是一个简单的例子,但我绝不建议在代码中的任何地方使用 #0。不理解使用的意义,就不会理解使用带来的问题。

标签: system-verilog


【解决方案1】:

这里没有矛盾。这样看:

join_none。父进程继续与 fork 产生的所有进程同时执行。在父线程执行阻塞语句或终止之前,派生的进程不会开始执行。

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

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

【讨论】:

  • .@Greg 谢谢,这是有道理的。 #0 是一个阻塞语句,它导致父级让步给分叉的子级。 #0 是一个 'time-0-delay' 阻塞语句。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-02
  • 2018-04-16
  • 2017-03-19
  • 2015-11-14
相关资源
最近更新 更多