1.同步的方法
(1) 在sv中,用于同步的方法有event, semaphore和mailbox;
(2) 在UVM中,用于同步的方法为uvm_event;
(3) uvm_event不仅能实现不同组间进程间同步的功能,还能像TLM通信一样传递数据,并且作用范围更广(TLM通信只能局限于uvm_component之间,而uvm_event不限于此);
2.uvm_event的使用示例
(1)通过uvm_event_pool::get_global_pool()函数获取全局的单实例类uvm_event_pool类型对象的句柄;
(2)两个initial块中调用get_global_pool返回同一个uvm_event_pool类型对象的句柄;
(3)通过uvm_event_pool.get(“ev”)可以得到一个名字为”ev”的uvm_event对象的句柄;
(4)在uvm_event中,触发的方式是uvm_event.trigger(); 而等待触发的方式是wait_ptrigger() (电平触发)和wait_trigger()(上升沿触发);
3.uvm_event相关function/task
3.1 wait_on
(1) 等待事件处于activated状态,如果事件已经被触发,这个task会立即返回;一旦事件被触发,它将一直保持"on"状态直到事件reset;
3.2 wait_off
(1) 如果事件已经被触发,并且处于"on"状态,该task会等待该事件通过调用reset而关掉;
(2) 如果事件没有被触发,该task会立即返回;
3.3 wait_trigger
(1) 等待事件被触发;
3.4 reset
4.uvm_event与event的区别
(1) uvm_event的基础是event,只不过对event的触发与等待进行了扩展;
(2) event被->触发后,会触发用@/wait(event.triggered())等待该事件的对象; uvm_event通过trigger()来触发,会触发使用wait_trigger()/wait_ptrigger()等待的对象;
(3) 如果再次触发事件,event只需使用->来触发; uvm_event需要先通过reset()方法重置初始状态,再使用trigger()来触发;
(4) event无法携带更多的信息; uvm_event可以通过trigger(uvm_event data=null)的可选参数,将要伴随触发的数据信息都写到该触发事件中,而等待该事件的对象可以通过方法wait_trigger_data(output uvm_object data)来获取事件触发时写入的数据对象;
(5) event触发时无法直接触发回调函数; uvm_event可通过add_callback函数来添加回调函数;
(6) event无法直接获取等待它的进程数目,而uvm_event可以通过get_num_waiters()来获取等待它的进程数目;