uvm_event的基礎其實還是event,只不過event的觸發和等待兩個動作進行了很多擴展, 主要區別如下:
http://www.sohu.com/a/140684109_778637
event被->觸發之后,會觸發使用@等待該事件的對象;uvm_event通過trigger()來觸發,會觸發使用wait_trigger()等待的對象。如果要再次等待事件觸發,event只需要再次用->來觸發,而uvm_event需要先通過reset()方法重置初始狀態,再使用trigger()來觸發。
event無法攜帶更多的信息,而uvm_event可以通過trigger(uvm_event data = null)的可選參數,將所要伴隨觸發的數據信息都寫入到該觸發事件中,而等待該事件的對象可以通過方法wait_trigger_data(output uvm_object data)來獲取事件觸發時寫入的數據對象。這實際上是一個句柄的傳遞,句柄的類型是uvm_object,也就是說傳遞的對象句柄得是uvm_object類型的。那如何傳遞非uvm_object類型的對象呢,首先這個對象必須是uvm_object的子類或者子類的子類,然后才能將其句柄作為trigger()方法的參數,然后wait_trigger ()的參數必須是uvm_object類型的,可以用一個uvm_object類型的tmp作為參數傳遞句柄,然后使用$cast賦值給目標類型句柄。可以參考:http://www.sohu.com/a/140684109_778637
event觸發時無法直接觸發回調函數,而uvm_event可以通過add_callback(uvm_event_callback cb, bit append = 1)函數來添加回調函數。
event無法直接獲取等待它的進程數目,而uvm_event不但可以通過get_num_waiters()來獲取等待它的進程數目。
uvm_event 能夠使用callback機制(這里就不討論uvm_event_callback了,也不復雜), uvm_event能夠獲取目前事件的等待獲觸發狀態。兩者最大的區別還是uvm_event能夠傳遞數據,而event不行。