systemverilog OOP 单例模式 Singleton object UVM_TOP

UVM 源码中有使用到singleton object, 即单实例。 比如class:uvm_root, 有且只有一个实例。

OOP中的设计模式有很多,单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。

link:https://www.runoob.com/design-pattern/design-pattern-tutorial.html

Singleton class

  • Used to define a "global" activity such as printing or class factory
  • No instance(object) of the singleton class exists
  • Contains only static properties and methods
    class print;
        static int err_count=0, max_errors=10;
        static function void  error (sting msg);
            $display("@%t:ERROR %s",$realtime,msg);
            if(err_count++ > max_errors)
                $finish;
        endfunction:error
    endclass:print
    
    
    if(expect != actual)
        print::error("Actual did not match expected");

    singleton class 内都是使用static修饰的变量和方法(静态变量,可全局访问,在编译时分配内存空间),无须创建实例,通过class_name:: 的形式即可调用。

Singleton object

  • A singleton object is a globally accessible static object which provides customized service methods
  • One and only one object in existence, created at compile-time
  • Globally accessible at run-time
  • Can have static and non-static members
  • class factory;
        static local factory me;
        static function factory get();
            if(me==null) 
                me=new();
            return me;
        endfunction:get
        protected function new();
        endfunction:new
        extern function void print();
    endclass:factory
    
    factory f=factory::get();
         

       factory的实例me是静态的对象,并使用local修饰:只能被当前类的方法访问,不同对象间可以互相访问。扩展类不行。

          *嵌套的类可以访问被嵌套类的local、protected、static等成员,有完全访问权。

          构造函数new() 使用 protected修饰,表明能被当前类或者扩展类中的方法访问,不同对象间可以互相访问。

          所以要新建一个实例,只能通过get()函数。而get()函数是静态方法,通过factory::get()调用。

          同时一但factory::get()被执行一次,factory的实例me 就不在是null。

          最后如果在其他地方调用factory::get(),只会指向静态变量me所指向的唯一实例。

以下为uvm_root 中的单例模式:

  • systemverilog OOP 单例模式 Singleton object UVM_TOP_第1张图片

       systemverilog OOP 单例模式 Singleton object UVM_TOP_第2张图片

systemverilog OOP 单例模式 Singleton object UVM_TOP_第3张图片

你可能感兴趣的:(UVM,systemverilog)