首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么输出总是在fork join_none中打印j=5?

为什么输出总是在fork join_none中打印j=5?
EN

Stack Overflow用户
提问于 2017-08-10 16:44:34
回答 2查看 112关注 0票数 0

我有一段代码,它表现出以下行为。我期望看到10个并行线程,比如第一线程: j=0和第五个线程: j=4,它们都以0 ns的模拟时间运行。此外,j=i和$display是并行运行的,因此在$display执行时,j仍然是x。

代码语言:javascript
复制
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上试了试。

代码语言:javascript
复制
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 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-11 00:15:47

假设您的代码产生10个并行线程,这一假设是正确的。但是,在父线程阻塞或终止之前,fork/join_none不会启动这些线程中的任何一个。在您的例子中,它是在initial块进程终止之后。此时,退出for循环`后,i的值为5。

此外,这10个线程没有定义的执行顺序-它们都在竞争中。$displays或赋值可以以任何顺序出现,因此j可能会显示x。不同的工具可能会得到不同的结果

要使您的代码显示0,1,...,4,您不能对j使用静态变量。您需要使用一个automaticfor循环的每次迭代创建一个j副本,该automatic使用每个循环的当前i值进行初始化。@Emman展示了一种做到这一点的方法。

票数 1
EN

Stack Overflow用户

发布于 2017-08-10 17:11:25

在开始执行之前,您可能需要向变量添加一个" automatic“,自动存储类变量将映射到堆栈上。调用函数时,函数中声明的所有局部(非静态)变量都会映射到堆栈中的各个位置。因为这些变量只存在于堆栈中,所以一旦函数执行完成,堆栈就会相应地收缩,它们就不存在了。这意味着作用域保持活动状态,直到到达所有子进程的末尾。

代码语言:javascript
复制
   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 
   endmodule
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45608673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档