我有一个看起来像这样的块:
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循环切换它,以及更多类似的组合,但总是相同的行为。
知道可能导致这种情况的原因是什么?
答案 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
。
一些简单的例子: