分叉块内的奇怪行为

Strange behavior inside fork block

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

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]

我试过将整个 'repeat' 行放在一个 before end 块中,用 for 循环切换它,以及更多类似的组合,但始终是相同的行为。

知道是什么原因造成的吗?

您似乎不止一次执行了 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

那么您应该能够跟踪线程并将它们关联起来。 请记住在 fork join_none 中使用 automatic 变量,以便它的线程具有唯一的 id.

一些简单的例子:

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