繁体   English   中英

关于event.triggered的使用的困惑

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM