前言
UVM需要解决组件之间的线程同步问题。SV中可以用event、semaphore和mailbox进行线程同步,但是考虑到UVM组件的封闭性原则,不推荐采用层次索引的形式来索引公共的event或者semaphore,UVM通过如下的类来达到组件之间的同步:
- 两个组件之间的同步:uvm_event,uvm_event_pool 和 uvm_event_callback
- 多个组件之间的同步:uvm_barrier ,uvm_barrier_pool
1. uvm_event
不同组件可以共享一个uvm_event,这不需要通过跨层次传递uvm_event对象句柄来实现共享,该共享方式是通过uvm_event_pool 这个全局资源池来实现的。
uvm_event_pool 资源池是uvm_object_string_pool #(T)的子类,它可以生成和获取通过字符串来索引的uvm_event对象。
通过全局资源池(唯一的),环境中任何组件都可以从资源池获取共享的对象句柄,这样就避免了组件之间的互相依赖。
e1 = uvm_event_pool::get_global("实例名");//获取句柄
//有的话就会返回这个句柄,没有的话就会先创建一个e1句柄
uvm_event类与event相比,区别在于:
- event被 -> 触发后,会触发使用@等待该事件的对象;uvm_event通过trigger()来触发,会触发wait_trigger()等待该事件的对象;
- 如果要再次等待事件触发,event只需要再次用 -> 来触发,而uvm_event需要先通过reset()方法重置初始状态,再使用trigger()来触发;
- event无法携带更多的信息,而uvm_event可以通过trigger(T data=null)的可选参数,将伴随触发的数据对象都写入到该触发事件中,而等待该事件的对象可以通过方法wait_trigger_data(output T data)来获取事件触发时写入的数据对象;
- event触发时无法直接触发回调函数,而uvm_event可以通过add_callback(uvm_event_callback cb,bit append = 1)函数来添加回调函数;
- event无法直接获取等待它的进程数目,而uvm_e