【问题标题】:Strange behavior inside fork block叉块内的奇怪行为
【发布时间】:2016-09-26 08:01:34
【问题描述】:

我有一个如下所示的块:

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 循环切换它,以及更多类似的组合,但始终是相同的行为。

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

【问题讨论】:

  • 也许你应该发一个MCVE。我看不出问题,但您可能需要检查您的分号。前两个$displays 之后应该有一个。
  • 这不是真正可验证的,因为它只在特定种子进入区块的特定时间发生,我不知道我是否可以提供更多信息。

标签: repeat system-verilog fork-join


【解决方案1】:

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

【讨论】:

  • 是的,就是这样(顺便说一句,在被困这两天后,我在你回复前大约 10 分钟就知道了)。谢谢!这一切都在一个永远循环中,其第一行是“get”,所以分叉不断被一个新的数据包打断。解决方案是简单地将延迟移动到 'ovm_do' 调用的序列中,不让新数据包中断流并覆盖变量(这些变量不够本地)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-11
  • 1970-01-01
  • 2012-05-15
  • 1970-01-01
  • 1970-01-01
  • 2016-07-09
  • 2023-04-09
相关资源
最近更新 更多