【发布时间】:2016-02-25 10:07:07
【问题描述】:
我正在尝试一些在移动到新的模拟时间步之前应该阻塞的代码(类似于在 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) 的行时,它的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);
我看到消息 Doing stuff 和 Did stuff,但 Wait trig done 永远不会出现。模拟在到达finish(1) 之前也会停止。一位模拟器告诉我,这是因为没有安排更多活动。
所有模拟器都表现出相同的行为,所以一定有我遗漏的东西。谁能解释发生了什么?
【问题讨论】:
标签: system-verilog