在SystemVerilog构建测试平台时,经常会用到event来实现多个进程之间的同步处理,例如一个进程处于等待某事件发生,当该事件发生了那么对应的进程将会被执行。但是有时候我们会遇到明明已经触发了事件,为什么对应的进程还处于挂起等待状态呢?本文将示例说明其中原因。
event实际上是一个静态对象句柄指向一个同步的对象,当有进程等待一个某个事件时,这个进程就会被放入这个同步对象中的一个队列中,对于一个事件实际上是可以有多个进程对于这个事件处于一种等待的状态。那么如何让一个进程对于一个事件处于挂起等待状态呢?在SystemVerilog中可以通过@和wait来实现对于事件的等待。
具体触发和阻塞使用方式如下:
触发线程: -> event_name;
阻塞线程:@event_name/ wait(event_name.triggered);
首先,我们先了解下触发事件的方式有哪些。常用的事件触发方式有两种,一种是经常用到的”->”,一种是”->>”,其中”->”直到触发成功才会执行该语句下面的语句,而”->>”不对等到event触发了才执行其后的语句。
【示例】
【仿真结果】
示例中13行等待5个时间单位后使用”->”触发flag1,其后的语句在触发了flag1后才执行,即”->”阻塞了其后语句的执行。18行使用”->>”触发flag2,此时有个前提是flag1触发,即flag1先于flag2触发,但是19行的执行并没有等待”->>”触发完flag2后才执行,即18行的”->>”