uvm_event和uvm_event_pool

文章目录

  • 前言
  • 1、uvm_event
  • 2、uvm_event_pool
  • 总结


前言


1、uvm_event

uvm_event类有两种不同的操作模式:边沿敏感和电平敏感。

边沿敏感模式包括:trigger(),wait_trigger(),wait_ptrigger()和wait_ptrigger_data() 方法。不要使用reset(),is_on(),is_off(),wait_on()和wait_off()方法。
wait_*方法会被阻塞,在调用trigger()时释放。

电平敏感模式包括:trigger(),reset(),is_on(),is_off(),wait_on()和wait_off()方法,不要使用任何wait_*trigger方法。
trigger()方法将事件状态设置为ON,并释放该事件的所有现有wait_trigger()和wait_on()。

reset()方法将事件状态设置为OFF并释放该事件的所有wait_off()。如果用于边沿敏感等待,reset()调用将在之后解除触发器!如果事件被用作边缘敏感的同步机制,你不应该调用reset() !

下图是UVM-1.1中关于uvm_event的实现。
uvm_event和uvm_event_pool_第1张图片
uvm_event和uvm_event_pool_第2张图片

下图是UVM-1.2 & IEEE UVM中关于uvm_event的实现。
uvm_event和uvm_event_pool_第3张图片

2、uvm_event_pool

uvm_event_pool顾名思义,用于存放uvm_event的一个池子。通过这个池子,uvm_event可以被全局访问。

uvm_event和uvm_event_pool_第4张图片
uvm_event和uvm_event_pool_第5张图片
必须选择使用uvm_event作为电平敏感事件或边沿敏感事件,不能把这两种使用模式混在一起。
对于电平敏感的同步,使用trigger()打开事件,使用reset()关闭事件。
对于边沿敏感的同步,只使用trigger()来触发边缘,不要调用reset()方法。
在使用事件作为边沿敏感同步时,调用reset()方法将解除触发机制,这将导致任何trigger()调用都不能再释放该事件,极有可能导致线程被锁定。

电平敏感的事件同步如下所示,利用uvm_event_pool.get_global(“reset”),获取一个用于全局复位的复位事件reset_event,利用reset_event.trigger()来触发打开事件,利用reset_event.reset()来关闭事件。
uvm_event和uvm_event_pool_第6张图片
uvm_event和uvm_event_pool_第7张图片
uvm_event_pool的应用示例如下所示,同样先利用uvm_event_pool.get_global(“reset”),获取一个用于全局复位的复位事件reset_event,这个reset_event是全局的,在上面的reset_monitor中进行触发和复位,在这里利用reset_event.wait_on()来阻塞进程,用于同步控制。
uvm_event和uvm_event_pool_第8张图片


总结

本文主要记录一下uvm_event和uvm_event_pool的介绍和使用。

你可能感兴趣的:(UVM,uvm_event,uvm_event_pool)