fork块内部的奇怪行为

时间:2016-09-26 08:01:35

标签: repeat system-verilog fork-join

我有一个看起来像这样的块:

fork
       begin    
           $display("before repeat");          
           repeat (delay_before_rsp2data) #1ps;
           $display("after repeat");

           $display("some information"); 
           `ovm_do_on_with("do some stuff");   
       end
join_none

在几乎所有情况下它都可以正常工作,但在一个案例中(我发现),在`ovm_do_on_with行之后,它跳回到重复行,并从那里继续。我知道这种情况正在发生,因为显示的是:

before repeat
after repeat
some information
[all the displays from the `ovm_do_on_with part]
after repeat
some information
[all the displays from the `ovm_do_on_with part]

我试过把整个'重复'前端块内部的行,使用for循环切换它,以及更多类似的组合,但总是相同的行为。

知道可能导致这种情况的原因是什么?

1 个答案:

答案 0 :(得分:4)

您似乎正在执行fork ... join_none多次(可能是循环),我猜delay_before_rsp2data是随机的。 如果是这种情况,那么您看到的after repeat可能与before repeat不在同一个帖子中。

我的建议,添加某种id来调试和跟踪它来自哪个线程。例如

int id=0;

task my_fork;
  fork
    automatic int k; // !! must be automatic
    begin
      id++; k = id;
      $display("before repeat, id %d", k);
      repeat(delay) #1ps;
      $display("after repeat, id %d", k);
      `uvm_do_on_with();
    end
  join_none
endtask

然后你应该能够跟踪线程并将它们关联起来。 请务必在automatic中使用fork join_none变量,以使其线程具有唯一id

一些简单的例子:

http://www.edaplayground.com/x/4vRd