systemverilog 中 uvm_event 与event 区别


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不行。

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM