近日在工作中遇到了@event和wait(event.triggered)的细微差别。与周边同事讨论了一圈,发现大家都貌似懂他们的区别,但都无法特别严谨细致地进行解释。
针对这种语法上的细节,建议直接从LRM原文着手。下面是相关的原文
1. @会阻塞一个进程,直到@的事件被触发(->)后,该进程才会unblock。如果事件触发(->event)在@event先执行,则@event的进程会一直被阻塞住。如果->event和@event发生在同一个time step,就会造成竞争冒险,因为无法确认他们哪一个先执行。
2. event的triggered属性的持续时间是一个time step, 因此它解决了触发事件和等待事件在同一个time step时的竞争冒险问题。只要wait(event.triggered)在->event之前执行,或者在同一个time step执行,都能正确地等到事件。
补充:
如何理解time step呢?
systemverilog是为离散事件执行模型(discrete event execution)所定义的一种语言。怎么理解呢?离散指的是仿真时间(simulation time)上的离散性,仿真基于时间片进行,只对有效的时刻点进行仿真。而这个在仿真时间维度上的离散时间片,就称为time slot或者time step。