Singleton Pattern
文章目录
场景
u_global_resource为验证平台的共享资源对象,组件env/rm/scoreboard/agent/sequencer/driver/monitor都需要用u_global_resource中的变量。
问题
env/rm/…/monitor如何获取u_global_resource的句柄?
方案 - 朴素
将句柄逐层/跨层次传递。
缺点:
1 新增/删除组件时,需要修改相应的u_global_resource句柄传递代码;
2 组件路径/名字修改时,需要修改相应的u_global_resource句柄传递代码;
3 必须保证先创建u_global_resource对象再传递其句柄的序列
思考:can we do better?
//top.sv
global_resource u_global_resource = new();
top.env.u_global_resource = top.u_global_resource;
top.env.scoreboard.global_resource = top.u_global_resource;
top.env.in_agent.global_resource = top.u_global_resource;
… …
思考:can we do better?
- 能不能将u_global_resource句柄的获取与组件的路径/名字去耦合?
- global_resource中能否提供统一的接口get()获取唯一对象的句柄?使用方无需关注global_resource对象的创建,句柄的传递等细节。
方案 - 单例模式
singleton
优点:
无需关注对象的构造和句柄的传递。统一使用单例提供的接口get()函数获取唯一对象的句柄。
问题:各对象在调用get()时碰到竞争怎么办?
!!!
thread1和thread2同时调用get()时,若碰到竞争,分别返回两个不同实例。与单例初衷违背。
方案1: 全局的单例实例在类装载时构建。
初始化时创建对象,其他线程在调用get()时,m_inst已经存在,直接返回句柄,从而消除竞争。
方案2: 加锁?
方案3: 多thread调用get()保序?
总结
Singleton pattern
模式说明:单例对象的类必须保证只有一个实例存在
应用场景:整个系统只需要拥有一个全局对象
应用举例:多进程/多模块共享资源/通信/同步等信息
UVM应用:
UVM Root
UVM Factory
UVM Pool,
UVM Resource Pool,
UVM Global report server,
UVM command line processor