分叉块内的奇怪行为
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
.
一些简单的例子:
我有一个看起来像这样的块:
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
.
一些简单的例子: