【UVM】Singleton Pattern In UVM
在面向对象的设计中,经常会需要创建一个独一无二,只能有一个实例的对象,这种模式经常用于缓存(Cache)、线程池(threadpool)、注册表(registry)等,通过这个独一无二的对象就可以很容易的找到一个全局的访问起点。可能会有人认为也可以通过全局变量的方式实现全局的访问,但是全局变量一般情况下需要在程序一开始创建好,那么如果需要创建的这个全局变量比较耗费资源,且程序一开始并不会使用它,将会造成资源的浪费。为此,利用面向对象程序设计中的静态变量、静态方法和适当的修饰符实现的singleton pattern class就可以实现在需要时才构建对应的对象。
通过上述示例,只需要在需要产生该类实例时调用对应的静态函数(get)即可实现该类的一个实例,同时可以确保该类有且仅有一个实例,通过该实例提供了一个全局访问的起点top。
UVM是基于面向对象思想构建的一种验证方法,其典型的树形结构就是通过一个根节点实现了对该树状结构各节点的组织、遍历和执行的。该根节点所在的类为uvm_root,其实现就是一个典型的singleton pattern class结构,具体代码如下:
73行声明了静态函数get(),uvm_root的实例就是通过类名调用该静态函数实现的,该函数的具体实现见292~299行。
180行声明了该类的构造函数访问属性为私有,那么该构造函数只能被该类中的函数或者变量进行访问。
194行声明静态局部句柄m_inst,该句柄可被该类及其子类访问。
292~299行为get的实现,293行判断m_inst是否未被实例化,因为第一次调用,所以m_inst为null,接着执行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树状结构仅有一个根节点。