【UVM】Singleton Pattern In UVM

在面向对象的设计中,经常会需要创建一个独一无二,只能有一个实例的对象,这种模式经常用于缓存(Cache)、线程池(threadpool)、注册表(registry)等,通过这个独一无二的对象就可以很容易的找到一个全局的访问起点。可能会有人认为也可以通过全局变量的方式实现全局的访问,但是全局变量一般情况下需要在程序一开始创建好,那么如果需要创建的这个全局变量比较耗费资源,且程序一开始并不会使用它,将会造成资源的浪费。为此,利用面向对象程序设计中的静态变量、静态方法和适当的修饰符实现的singleton pattern class就可以实现在需要时才构建对应的对象。

在面向对象程序设计中,通常通过调用一个类的构造函数实现该类的实例化,一般情况下一个已定义的类可以实例化多次,所以构造函数一般情况下访问属性都是public。但是如果将构造函数的访问属性定义为私有,那么该函数就不能被非该类的任何代码调用,只能被该类内部的代码调用,所以看样子我们是不能获取到该类的实例了。其实为了解决这个问题,可以在该类中的函数对私有函数进行访问,因为public函数在该类未被实例化时不能调用,所以我们考虑将函数属性定义为静态,即静态函数。静态函数可以通过该类类名进行引用,通过该静态函数可以调用该类中所有的私有成员包括私有的构造函数,从而可通过调用该静态函数间接的实现对该类的实例化。综上所述,结合具体示例分析如下:
其中可以将具体实例化部分进一个放大分析如下:

通过上述示例,只需要在需要产生该类实例时调用对应的静态函数(get)即可实现该类的一个实例,同时可以确保该类有且仅有一个实例,通过该实例提供了一个全局访问的起点top

UVM是基于面向对象思想构建的一种验证方法,其典型的树形结构就是通过一个根节点实现了对该树状结构各节点的组织、遍历和执行的。该根节点所在的类为uvm_root,其实现就是一个典型的singleton pattern class结构,具体代码如下:

在使用UVM构建测试平台时进行用例传递时,我们通过在testbench顶层的initial中电泳run_test(命令行方式类似),通过传递对应的用例字符串实现对特定用例的调用,同时实现当前用例下的UVM树状结构,因为uvm_rootsingleton class,所以通过调用其中的静态函数get访问该类的构造函数实现了uvm_root的自实例,对应上述代码的38~39行,这也是为什么很多资料强调的UVM的根节点为top的原因。其中uvm_root的自实例主要是通过下述代码完成实现的。

73行声明了静态函数get(),uvm_root的实例就是通过类名调用该静态函数实现的,该函数的具体实现见292~299行。

180行声明了该类的构造函数访问属性为私有,那么该构造函数只能被该类中的函数或者变量进行访问。

194行声明静态局部句柄m_inst,该句柄可被该类及其子类访问

292~299行为get的实现,293行判断m_inst是否未被实例化,因为第一次调用,所以m_instnull,接着执行294行,调用uvm_root中的静态构造函数new()实现实例化一个m_inst(m_inst类型为uvm_root)298行把获取到的m_inst返回。在执行过程中,如果多次调用get,那么因为再次调用时m_inst已经在第一次调用时实例化过了,所以293~297就不会被执行,直接执行298行,即直接返回m_inst,从而保证了m_inst仅被实例化了一次,即uvm_root只被实例化了一次,也就保证了UVM树状结构仅有一个根节点。


全部评论
好高深啊,看不懂
点赞 回复 分享
发布于 2022-08-14 21:18

相关推荐

青春运维少年不会梦到...:实习大王
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务