有人可以解释系统 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
谁能给我解释一下到底发生了什么?
如果我将 automatic
变量移到分叉之外会怎样?
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
提前致谢。
将自动变量移到 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
我正在经历 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
变量移到分叉之外会怎样?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
提前致谢。
将自动变量移到 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