UVM与订阅者模式

背景

问题

一个模块/对象和多个对象之间传输数据

class sender;
	function notify(receiver_1 *r1, receiver_2 *r2);
		r1.process_1(data);
		r2.process_2(data);
	endfunction
endclass

class receiver_1;
	function process_1(int value);
		……
	endfunction
end class

class receiver_2;
	function process_2(int value);
		……
		……
	endfunction
end class

方案 - 朴素

发送方通过接收方的指针,去调用接收方的具体处理方法,并将发送数据作为参数传入

一个模块/对象和多个对象之间传输数据
直观的做法:
发送方通过接收方的指针,去调用接收方的具体处理方法,并将发送数据作为参数传入

class sender;
	function notify(receiver_1 *r1, receiver_2 *r2,receiver_3 *r3 );
		r1.process_1(data);
		r2.process_2(data);
		r3.process_3(data);
	endfunction;
endclass

缺点:
增加/删除/修改观察者,都要修改sender的notify代码,两者强耦合。
思考:can we do better?
sender知道的太多。
能不能将所有的观察者归一化?然后用一个list容器容纳所有观察者,这样sender发送过程就是遍历list容器。

方案 - 订阅者模式

一个模块/对象和多个对象之间传输数据
采用观察者模式:
接收方统一继承自一个虚基类,重写基类函数,具体的观察者(接收者)的基类指针加入/退出某个发送者的群(容器observer_list),利用多态特性;

一个模块/对象和多个对象之间传输数据
采用订阅者模式:
发送方不需要知道接收方(增/删/改)的信息,只负责把数据广播出去

class sender;
	function notify( );
		for( int i=0,  i<observer_list.size(), i++) begin
			observer_list[i].process( data );
		end
	endfunction;

	int data;
	function observer_list_add(observer_base);
endclass

Analysis port support:
1-to-multiple component
All observer’s write( ) functions called when mon call aport.write(tr1):

总结

Observer pattern
模式说明:
一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知
应用场景:
当其中一个对象的变更会影响其他对象,却又不知道多少对象必须被同时变更时。
UVM应用:
UVM TLM: uvm_analysis_export
UVM Subscriber,
UVM Monitor,
UVM Coverage,
UVM Scoreboards

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值