有人可以解释系统 verilog 中的 fork 和循环吗?

can someone explain fork and loop in system verilog?

我正在经历 SV LRM section 9.3.2 并且有这个疑问,我粘贴下面的示例以供参考

for(int j=1; j <=3; ++j)
    fork
        automatic int k = j;
        begin
            .... # use k here
        end
    join_none

提前致谢。

将自动变量移到 fork 之外,但仍在 for 循环的 begin/end 块内具有相同的效果。循环的每次迭代都会获得自己的 k 本地副本,并使用 j 的当前循环值进行初始化。因此,您获得了 k 的三个副本,其值为 1,2 和 3。并且 fork/join_none 生成的每个进程都绑定到 k 的每个本地副本。由于 fork/join_none 在循环内部,因此您产生了三个进程。

如果您将 for 循环移动到 fork 内,那么您只会得到一个由 fork 生成的进程,其中有一个循环。那么使用 j 还是 k 都没有关系,因为循环内的代码是顺序执行的。

1、3 的效果相同,fork...join 的每个线程都将采用正确的 j 值(j = 1,2,3...全部采用)。

但对于第二种情况,由于您是在线程外为 k 赋值,因此所有线程都将采用 k 的最后一个值。

这是每个案例的示例代码。

// Code 1
for(int j=1; j <=3; ++j)
    fork
        automatic int k = j;
        begin
          $display("Current Value - %0d", k);
        end
    join_none
    wait_fork;

// Output of Code 1
Current Value - 1
Current Value - 2
Current Value - 3

// Code 2
for(int j=1; j <=3; ++j)
begin
    automatic int k = j;
    fork
        begin
          $display("Current Value - %0d", k);
        end
    join_none
end
wait_fork;

// Output of Code 2
Current Value - 3
Current Value - 3
Current Value - 3

// Code 3
fork
    for(int j=1; j <=3; ++j)
      begin
        automatic int k = j;
        $display("Current Value - %0d", k);
      end
join_none
wait fork;

// Output of Code 3
Current Value - 1
Current Value - 2
Current Value - 3