我有一段代码,它表现出以下行为。我期望看到10个并行线程,比如第一线程: j=0和第五个线程: j=4,它们都以0 ns的模拟时间运行。此外,j=i和$display是并行运行的,因此在$display执行时,j仍然是x。
module tb;
integer i,j;
initial
for(i=0;i<5;i++)
fork
j = i;
$display("Value of j is %d at time=%d \n", j, $time);
join_none
endmodule我得到了以下输出。谁能解释一下。我用VCS在EDAPlayground上试了试。
Value of j is 5 at time= 0
Value of j is 5 at time= 0
Value of j is 5 at time= 0
Value of j is 5 at time= 0
Value of j is 5 at time= 0 发布于 2017-08-11 00:15:47
假设您的代码产生10个并行线程,这一假设是正确的。但是,在父线程阻塞或终止之前,fork/join_none不会启动这些线程中的任何一个。在您的例子中,它是在initial块进程终止之后。此时,退出for循环`后,i的值为5。
此外,这10个线程没有定义的执行顺序-它们都在竞争中。$displays或赋值可以以任何顺序出现,因此j可能会显示x。不同的工具可能会得到不同的结果
要使您的代码显示0,1,...,4,您不能对j使用静态变量。您需要使用一个automatic为for循环的每次迭代创建一个j副本,该automatic使用每个循环的当前i值进行初始化。@Emman展示了一种做到这一点的方法。
发布于 2017-08-10 17:11:25
在开始执行之前,您可能需要向变量添加一个" automatic“,自动存储类变量将映射到堆栈上。调用函数时,函数中声明的所有局部(非静态)变量都会映射到堆栈中的各个位置。因为这些变量只存在于堆栈中,所以一旦函数执行完成,堆栈就会相应地收缩,它们就不存在了。这意味着作用域保持活动状态,直到到达所有子进程的末尾。
module tb;
integer i,j;
initial
for(i=0;i<5;i++)
fork
automatic int j=i;
begin
$display("Value of j is %d at time=%d \n", j, $time);
end
join_none
endmodulehttps://stackoverflow.com/questions/45608673
复制相似问题