UVM笔记(1)uvm_event和uvm_event_pool

一、介绍

在system verilog中会用到@,wait() 和->来控制进程,若未触发则会处于等待状态。此外,sv还支持事件event, 邮箱mailbox, 旗语semaphore三种线程控制的功能。event主要是用于二者之间线程的控制,mailbox主要是用于二者之间的数据通信,一端发送数据,一端接收数据,semaphore主要是具有多线程控制,提供多个“钥匙”给用户使用,详细的用法参考其他资料。UVM也提供类似的功能uvm_event,它与前面的功能的区别在于,uvm_event封装了更多功能,包括事件计数和用于解决竞争问题的功能。而uvm_event_pool实现了不同组件共享一个uvm_event,避免组件之间的依赖。

二、uvm_event功能

下面是uvm_event的大部分功能
在这里插入图片描述
下面是相关的代码示例(代码没有体现它的核心功能,事件在各个组件共享)

task my_case0::main_phase(uvm_phase phase);
   my_transaction tr;
   edata d = new();
   ecb cb = new();
   uvm_object tmp;
   d.data =100;
   super.main_phase(phase);
    fork 
        begin
            uvm_event_pool temp_pool = uvm_event_pool::get_global_pool();
            uvm_event tp1 = temp_pool.get("tp1");
            uvm_event tp2 = uvm_event_pool::get_global("tp2");
            `uvm_info(get_type_name(),"event1 will trigger!", UVM_NONE);
            #100ns;
            tp1.trigger();
            #100ns;
            `uvm_info(get_type_name(),"event 1 is triggered!", UVM_NONE);
            tp2.trigger(d);
        end
        begin
            uvm_event_pool temp_pool = uvm_event_pool::get_global_pool();
            uvm_event tp1 = temp_pool.get("tp1");
            uvm_event tp2 = uvm_event_pool::get_global("tp2");
            tp1.wait_trigger();
            `uvm_info(get_type_name(),"event1 is received!", UVM_NONE);
            tp2.wait_trigger_data(tmp);
            `uvm_info(get_type_name(),"event2 is received!", UVM_NONE);
            if($cast(d,tmp)) `uvm_info(get_type_name(),$sformatf("data is %0h",d.data),UVM_NONE)
        end
    join 
endtask

下面是打印日志

UVM_INFO my_case0.sv(159) @ 5900000: uvm_test_top [my_case0] event1 will trigger!
UVM_INFO my_case0.sv(172) @ 6000000: uvm_test_top [my_case0] event1 is received!
UVM_INFO my_case0.sv(163) @ 6100000: uvm_test_top [my_case0] event 1 is triggered!
UVM_INFO my_case0.sv(174) @ 6100000: uvm_test_top [my_case0] event2 is received!
UVM_INFO my_case0.sv(175) @ 6100000: uvm_test_top [my_case0] data is 64

三、uvm_event_pool和uvm_event的继承类

uvm_event_pool是将“字符串”和uvm_event关联起来,并且它是全局可用的,生命周期伴随着整个仿真过程,也就是静态变量。
下面是它们的继承类,详细内容具体看uvm源码
uvm_evnet_pool -> uvm_object_string_pool#(uvm_object) -> uvm_pool -> uvm_object -> uvm_void
uvm_event -> uvm_event_base -> uvm_object -> uvm_void

参考文献和博客
https://blog.csdn.net/zyj0oo0/article/details/120264318

`uvm_event` 是 UVM(Universal Verification Methodology)中的一种同步机制,用于线程之间的通信同步,可携带 `uvm_object` 类型的数据,在 UVM 中被广泛用于各种通信同步操作,如线程间同步、消息传递等。以下是 `uvm_event` 的详细使用方法: #### 1. 声明 `uvm_event` 对象 可以直接声明 `uvm_event` 对象,也可以通过 `uvm_event_pool` 来获取全局的 `uvm_event` 对象。 ```systemverilog // 直接声明 uvm_event my_event; // 通过 uvm_event_pool 获取 uvm_event_pool event_pool = uvm_event_pool::get_global_pool(); uvm_event global_event = event_pool.get("global_event_name"); ``` #### 2. 等待事件 线程可以使用 `wait_trigger` 方法来等待 `uvm_event` 被触发。 ```systemverilog initial begin // 等待事件触发 my_event.wait_trigger(); $display("Event has been triggered!"); end ``` #### 3. 触发事件 使用 `trigger` 方法触发 `uvm_event`,可以选择传递 `uvm_object` 类型的参数。 ```systemverilog uvm_object my_obj; initial begin // 创建 uvm_object 实例 my_obj = new(); // 触发事件并传递参数 my_event.trigger(my_obj); end ``` #### 4. 获取触发时传递的参数 在等待事件的线程中,可以使用 `get_trigger_data` 方法获取触发事件时传递的参数。 ```systemverilog uvm_object trigger_data; initial begin my_event.wait_trigger(); trigger_data = my_event.get_trigger_data(); if (trigger_data != null) begin $display("Event triggered with data!"); end end ``` #### 5. 清除事件 使用 `reset` 方法可以清除事件的触发状态,使得后续线程可以再次等待该事件。 ```systemverilog initial begin // 触发事件 my_event.trigger(); // 清除事件状态 my_event.reset(); // 再次等待事件 my_event.wait_trigger(); $display("Event triggered again!"); end ``` #### 6. 检查事件是否已触发 使用 `is_triggered` 方法可以检查事件是否已经被触发。 ```systemverilog initial begin if (my_event.is_triggered()) begin $display("Event has already been triggered."); end else begin $display("Event has not been triggered yet."); end end ``` ### 示例代码 ```systemverilog import uvm_pkg::*; `include "uvm_macros.svh" module tb; uvm_event my_event; initial begin // 创建事件 my_event = new("my_event"); // 启动等待线程 fork begin my_event.wait_trigger(); $display("Thread 1: Event has been triggered!"); end begin #10ns; // 触发事件 my_event.trigger(); $display("Event triggered!"); end join end endmodule ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值