UVM与单例模式

博客围绕验证平台共享资源对象u_global_resource的句柄获取问题展开。先介绍朴素方案及其缺点,后提出单例模式,该模式可让使用方无需关注对象创建和句柄传递细节。同时探讨了单例模式中各对象调用get()时的竞争问题及解决方案,还说明了单例模式的应用场景和UVM应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Singleton Pattern

场景

u_global_resource为验证平台的共享资源对象,组件env/rm/scoreboard/agent/sequencer/driver/monitor都需要用u_global_resource中的变量。

问题

env/rm/…/monitor如何获取u_global_resource的句柄?
image.png

方案 - 朴素

将句柄逐层/跨层次传递。
缺点
1 新增/删除组件时,需要修改相应的u_global_resource句柄传递代码;
2 组件路径/名字修改时,需要修改相应的u_global_resource句柄传递代码;
3 必须保证先创建u_global_resource对象再传递其句柄的序列
思考:can we do better?

image.png

//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?

  1. 能不能将u_global_resource句柄的获取与组件的路径/名字去耦合?
  2. global_resource中能否提供统一的接口get()获取唯一对象的句柄?使用方无需关注global_resource对象的创建,句柄的传递等细节。

方案 - 单例模式

singleton
优点:
无需关注对象的构造和句柄的传递。统一使用单例提供的接口get()函数获取唯一对象的句柄。

image.png

image.png

image.png

问题:各对象在调用get()时碰到竞争怎么办?

image.png

!!!
thread1和thread2同时调用get()时,若碰到竞争,分别返回两个不同实例。与单例初衷违背。

方案1: 全局的单例实例在类装载时构建。

初始化时创建对象,其他线程在调用get()时,m_inst已经存在,直接返回句柄,从而消除竞争。
image.png

方案2: 加锁?

方案3: 多thread调用get()保序?

总结

Singleton pattern
模式说明:单例对象的类必须保证只有一个实例存在
应用场景:整个系统只需要拥有一个全局对象
应用举例:多进程/多模块共享资源/通信/同步等信息
UVM应用:
UVM Root
UVM Factory
UVM Pool,
UVM Resource Pool,
UVM Global report server,
UVM command line processor

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值