代码之家  ›  专栏  ›  技术社区  ›  Shankhadeep Mukerji

为什么输出总是在fork join\u none中打印j=5?

  •  0
  • Shankhadeep Mukerji  · 技术社区  · 7 年前

    我有一段代码展示了以下行为。我希望看到10个并行线程,第一个线程:j=0,第五个线程:j=4,都在模拟时间0ns下运行。此外,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。

    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 
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   dave_59    7 年前

    假设代码生成10个并行线程,这是正确的。然而 fork/join_none initial i for 循环“”。

    此外,这10个线程没有定义执行顺序-它们都处于竞争状态。$displays或assignment可以以任何顺序出现,因此有可能 j 显示器 x 。您可能会从不同的工具中获得不同的结果

    。您需要创建副本 j 对于 对于 使用 automatic 一、 对于每个回路@艾曼展示了一种方法。

        2
  •  1
  •   Emman    7 年前

    在变量开始执行之前,可能需要向其添加一个“自动”,自动存储类变量映射到堆栈上。调用函数时,函数中声明的所有局部(非静态)变量都映射到堆栈中的各个位置。由于此类变量仅存在于堆栈上,因此一旦函数执行完成,它们就不再存在,堆栈相应收缩。含义范围保持活动状态,直到到达所有子进程的末尾。

       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