【uvm】uvm_event同步

本文详细介绍了UVM中的uvm_event如何实现同步,包括其与传统event的区别,以及uvm_event_pool和uvm_event_callback的使用。uvm_event不仅提供事件触发和等待,还能传递数据,适用于组件间非常规数据流同步。通过uvm_event_pool实现全局共享,uvm_event_callback支持预触发和后触发操作。

原文

篇10-uvm通信之uvm_event & uvm_event_pool & uvm_event_callback
参考资料
(1) UVM通信篇之六:同步通信元件(上) - 路科验证的日志 - EETOP 创芯网论坛 (原名:电子顶级开发网) -

1.同步的方法

(1) 在sv中,用于同步的方法有event, semaphore和mailbox;

(2) 在UVM中,用于同步的方法为uvm_event;

(3) uvm_event不仅能实现不同组间进程间同步的功能,还能像TLM通信一样传递数据,并且作用范围更广(TLM通信只能局限于uvm_component之间,而uvm_event不限于此);

补充: 什么情况下会使用uvm_event呢?

组件之间的常规的数据流向是通过TLM通信方法实现的,比如sequencer与driver之间,或者monitor与scoreboard之间。然而有些时候,数据的传输的偶然触发的,并且需要立即响应,这个时候uvm_event就是得力的助手了。同时,uvm_event也解决了一个重要问题,那就是在一些uvm_object和uvm_component对象之间如果要发生同步,那么无法通过TLM传输,因为TLM传输必须是在组件(component)和组件之间进行的。譬如,在sequence与sequence之间要进行同步,或者sequence与driver之间要进行同步,都可以借助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对象的句柄;如果名字为"ev"的uvm_event对象不存在,会在第一次调用get_global()函数时创建这样一个对象。

(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()/wait_trigger_data()/wait_ptrigger_data()等待的对象;

(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()来获取等待它的进程数目;

5.uvm_event_pool

(1) 不同的组件可以共享同一个uvm_event,这不是通过跨层次传递uvm_event对象句柄来实现共享的,因为这并不符合组件环境封闭的原则。这种共享同一个uvm_event对象是通过uvm_event_pool这一全局资源池来实现的。

(2) uvm_event_pool这个资源池类是uvm_object_string_pool #(T)的子类,它可以生成和获取通过字符串来索引的uvm_event对象。通过全局资源池对象(唯一的),在环境中任何一个地方的组件都可以从资源池中获取共同的对象,这就避免了组件之间的互相依赖。

6.uvm_event_callback

(1) 可以从uvm_event_callback进行类的派生,并实现pre_trigger与post_trigger函数,之后将该派生类通过add_callback函数添加到uvm_event中;

(2) pre_trigger()有返回值,如果返回值为1,则表示uvm_event不会被trigger,也不会再执行post_trigger()方法;如果返回值为0,则会继续trigger该事件对象。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值