谁能解释系统verilog中的fork和loop?

时间:2016-10-25 00:44:04

标签: loops system-verilog fork-join

我正在经历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
  • 有人能解释一下我的实际情况吗?

  • 如果我将automatic变量移到fork之外会发生什么?

    for(int j=1; j <=3; ++j) begin
        automatic int k = j;
        fork
            begin
                .... # use k here
            end
        join_none
    end
    
  • 如果我在循环中移动循环会怎样?

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

提前致谢。

2 个答案:

答案 0 :(得分:4)

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

如果你在fork中移动for循环,那么你只会得到一个由fork产生循环的进程。然后,使用j或k无关紧要,因为循环内的代码按顺序执行。

答案 1 :(得分:0)

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