一、介绍
在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
183

被折叠的 条评论
为什么被折叠?



