uvm_event中wait_trigger和wait_ptrigger的不同
// Task: wait_trigger
// Waits for the event to be triggered.
// If one process calls wait_trigger in the same delta as another process
// calls <trigger>, a race condition occurs. If the call to wait occurs
// before the trigger, this method will return in this delta. If the wait
// occurs after the trigger, this method will not return until the next
// trigger, which may never occur and thus cause deadlock.
virtual task wait_trigger ();
num_waiters++;
@m_event;
endtask
// Task: wait_ptrigger
// Waits for a persistent trigger of the event. Unlike <wait_trigger>, this
// views the trigger as persistent within a given time-slice and thus avoids
// certain race conditions. If this method is called after the trigger but
// within the same time-slice, the caller returns immediately.
virtual task wait_ptrigger ();
if (m_event.triggered)
return;
num_waiters++;
@m_event;
endtask
-
@会阻塞一个进程,直到@的事件被触发(->)后,该进程才会unblock。如果事件触发(->event)在@event先执行,则@event的进程会一直被阻塞住。如果->event和@event发生在同一个time step,就会造成竞争冒险,因为无法确认他们哪一个先执行。
-
event的triggered属性的持续时间是一个time step, 因此它解决了触发事件和等待事件在同一个time step时的竞争冒险问题。只要wait(event.triggered)在->event之前执行,或者在同一个time step执行,都能正确地等到事件。
wait_trigger的用法:
1)如果wait_trigger在trigger之后调用,那@是等不到->的,就不会被trigger触发。
2)在wait_trigger被trigger过一次之后,并不用调用event.reset()重置event。依然可以使用wait_trigger阻塞并等待下一次的trigger。
wait_ptrigger的用法:
与wait_trigger的区别就是多了个对m_event.triggered的判断。这个triggered的标记,会保持一个time slot,下一个time slot就会丢失。如果触发过,会立即返回。
所以wait_ptrigger是使用在如下场合:当trigger()和wait()的调用可能发生在同一个cycle时,并且懒得区分谁可能会被先调用,那么就用wait_ptrigger,可以保证同一个time slot调用时,依然能够被触发。
浙公网安备 33010602011771号