[英]Confusion regarding usage of event.triggered
我正在尝试一些应该阻塞的代码,直到进入新的模拟时间步骤(类似于在e中等待sys.tick_start
)。
我尝试编写一个执行此操作的函数:
task wait_triggered();
event e;
`uvm_info("DBG", "Waiting trig", UVM_NONE)
-> e;
$display("e.triggered = ", e.triggered);
wait (!e.triggered);
`uvm_info("DBG", "Wait trig done", UVM_NONE)
endtask
它背后的想法是我触发一些事件,这意味着当控制到达wait(!e.triggered)
线wait(!e.triggered)
时,它的triggered
字段将变为1。 该行应在下一个时隙中解除阻塞,此时将triggered
清除。
为了测试这个,我添加了一些消耗模拟时间的其他线程:
fork
wait_triggered();
begin
`uvm_info("DBG", "Doing stuff", UVM_NONE)
#1;
`uvm_info("DBG", "Did stuff", UVM_NONE)
end
join
#1;
$finish(1);
我看到消息做东西和做过的东西 ,但Wait trig done永远不会到来。 模拟也在到达finish(1)
之前停止。 一位模拟器告诉我,这是因为没有安排其他事件。
所有模拟器都表现出相同的行为,因此必须有一些我缺少的东西。 谁能解释一下发生了什么?
问题在于wait (!e.triggered);
当e.triggered
从1变为零时。 它必须在无法安排任何内容的区域中进行更改,因此无论是在当前时隙结束时更改,还是在下一个时隙的开头都不可观察。 因此, wait
将等待当前时间段的结束,从未到来。
我认为最接近你要找的是#1step
。 这将阻止最小的模拟精确时间步长。 但我必须相信,有一种更好的方法来编码你想要的东西,而不必知道时间是否在推进。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.