uvm_event

  • uvm_event是对SV中event类的一次封装。
  • 不同的组件可以共享同一个uvm_event,是通过uvm_event_pool这一全局资源池来实现的。它可以生成和获取通过字符串来索引的uvm_event对象。通过唯一的券聚资源池对象,在环境中任何一个地方的组件都可以从资源池中获取共同的对象,避免了组件之间的互相依赖
  • 通过uvm_event_pool::get_global得到一个uvm_event对象的句柄。两个地方调用get_global,先调用的会创建这个pool,后调用的只是获得这个pool的句柄

uvm_event_pool::get_global("trans_start")

  • 触发的方式:uvm_event.trigger();
  • 等待的方式:uvm_event.wait_trigger();
  • 再次触发:先reset()重置初始状态,再使用tigger()来触发
  • event传递对象

uvm_event.tigger(a); 

uvm_event.wait_tigger_data(b);

        这个对象a必须是uvm_object的扩展,才能将其句柄作为trigger()方法的参数

        wait_trigger_data()的参数b必须是uvm_object类,再$cast(a,b)

  • uvm_event添加回调函数:

class cb extends uvm_event_callback;

uvm_event.add_callback(cb);

### 关于 `uvm_event_pool` 中的 `get_global` 和 `get` 方法 #### 1. **`get_global` 方法** `get_global` 是一种全局访问机制,用于从全局事件池 (`uvm_event_pool`) 中获取指定名称的事件实例。此方法允许不同组件之间共享同一个事件句柄,从而实现跨组件的同步或通信功能。 调用方式如下: ```python uvm_event my_event = uvm_event_pool::get_global("event_name"); ``` 具体行为描述为: - 如果名为 `"event_name"` 的事件已存在于全局事件池中,则直接返回对应的事件句柄[^1]。 - 如果尚未创建该事件,则会自动创建一个新的 `uvm_event` 实例并将其存储到全局事件池中,随后返回新创建的句柄[^2]。 这种方法非常适合需要在多个独立模块间共享同一事件的情况。 --- #### 2. **`get` 方法** `get` 方法通常作用于局部范围内的事件池,而不是全局事件池。它主要用于在同一组件内部管理事件资源。 调用方式如下: ```python class my_component extends uvm_component; uvm_event local_event; function new(string name, uvm_component parent); super.new(name, parent); local_event = this.event_pool.get("local_event_name"); endfunction endclass ``` 其主要特点包括: - 它的作用域限定于当前组件的对象上下文中,因此不会影响其他组件中的事件池[^4]。 - 类似于 `get_global`,如果请求的事件不存在,则会动态创建新的事件实例。 需要注意的是,由于 `get` 不涉及全局共享逻辑,因此更适合局限于单一组件内部使用的场景。 --- #### 3. **两者的区别与联系** | 特性 | `get_global` | `get` | |---------------------|---------------------------------------|------------------------------------| | **作用范围** | 全局 | 局部 | | **适用场景** | 多个组件间的事件共享 | 单一组件内部的事件管理 | | **事件池位置** | 存储于静态全局变量 | 存储于组件自身的事件池 | 两者的核心差异在于它们所操作的事件池的不同——一个是全局的静态池,另一个则是特定组件的私有池[^5]。 --- #### 示例代码对比 以下是分别使用 `get_global` 和 `get` 创建事件的示例: ##### 使用 `get_global` ```systemverilog program test_program; initial begin uvm_event shared_event = uvm_event_pool::get_global("shared_event"); fork begin : trigger_thread $display("[%0t] Triggering 'shared_event'", $time); shared_event.trigger(); end begin : wait_thread $display("[%0t] Waiting for 'shared_event'...", $time); shared_event.wait_trigger(); $display("[%0t] Event triggered!", $time); end join end endprogram ``` ##### 使用 `get` ```systemverilog class example_component extends uvm_component; uvm_event private_event; function new(string name, uvm_component parent); super.new(name, parent); private_event = this.event_pool.get("private_event"); endfunction task run_phase(uvm_phase phase); fork begin : trigger_thread $display("[%0t] Triggering 'private_event'", $time); private_event.trigger(); end begin : wait_thread $display("[%0t] Waiting for 'private_event'...", $time); private_event.wait_trigger(); $display("[%0t] Event triggered!", $time); end join endtask endclass ``` --- ### 总结 无论是 `get_global` 还是 `get`,它们都提供了灵活的方式来管理和操作事件。前者适用于多组件协作的需求,后者则更侧重于单组件内部的功能封装。开发者应根据实际需求选择合适的方法以优化设计结构和性能表现.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值