我正在经历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
提前致谢。
答案 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