UVM——同步通信元件

同步通信元件

SV用来做线程同步的元件分别是semaphore、event、mailbox。
UVM中需要解决不同组件之间的线程同步问题,如果线程同步发生在不同组件,这就要求组件之间可以通过某种方法实现同步。而event或semaphore会因为层次索引的形式破坏UVM组件的封闭性,因此UVM定义了以下类来实现组件之间的同步:
- uvm_event,uvm_event_pool和uvm_event_callback
- uvm_barrier,uvm_barrier_pool
这两组类分别用于服务两个组件之间的同步和多个组件之间的同步。回调函数作为一种实现基类复用的手段,在UVM中被封装为uvm_callback类。

uvm_event

不同组件可以共享一个uvm_event,该共享方式是通过uvm_event_pool这一全局资源池来实现的,而非通过跨层次的句柄传递。这个资源池类uvm_object_string_pool #(T)的子类,它可以生成和获取通过字符串来索引的uvm_event对象。通过全局资源池,环境中的任何组件都可以从资源池获取共享的对象句柄,避免了组件之间的相互依赖。
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_event可以通过get_num_waiters()来获取等待它的进程数目。

//实例
class edata extends uvm_object;
	int data;
	`uvm_object_utils(edata)
	...
endclass

class ecb extends uvm_event_callback;
	`uvm_object_utils(ecb)
	...
	function bit pre_trigger(uvm_event e, uvm_object data = null);
		`uvm_info("EPRETRIG", $sformatf("before trigger event %s", e.get_name()), UVM_LOW)
		return 0;
	endfunction
	function void post_trigger(uvm_event e, uvm_object data = null);
		`uvm_info("EPOSTRIG", $sformatf("after trigger event %s", e.get_name()), UVM_LOW)
	endfunction
endclass

class comp1 extends uvm_component;
	uvm_event e1;
	`uvm_component_utils(comp1)
	...
	function void build_phase(uvm_phase phase);
		super.build_phase(phase);
		e1 = uvm_event_pool::get_global("e1");		//借助全局的event_pool查看是否有一个名叫e1的event。没有就自动创建
	endfunction
	task run_phase(uvm_phase phase);
		edata d = new();
		ecb cb = new();
		d.data = 100;
		#10ns;
		e1.add_callback(cb);		//将event与callback做关联,trigger会触发callback的pre_triger和post_triger
		e1.trigger(d);
		`uvm_info("ETRIG", $sformatf
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值