story · 2020年05月25日

SystemVerilog​概念浅析之singleton class

SystemVerilog中Singleton class是指只有一个对象(object)的类。这个对象只创建一次,为所需的全局变量提供一个namespaces。

Singleton class定义全局的行为,例如printing。

Singleton class 在compile-time创建一个对象,然后在run-time操作其中的成员,不需要用户在仿真时在建立一个新的实例。

program top;
class singleton;
   int unsigned var1;

  //  Need to declare it as static, as  it is accessed by static method 'create'
  static  singleton single;

  //  Declared as 'protected', so  user can't directly create instance of this class
  protected functionnew();
  endfunction:new

  static functionsingleton  create();
     if (single ==null) begin
       $display("Object  single is null, so creating new object");
       single =new();
     end
     return single;
  endfunction:create
endclass:singleton
singleton s1,  s2;
initial begin
     s1 = singleton ::create();
     $display (" 1  : s1.var1 = %0d",  s1.var1);
     s1.var1 =10;
     $display (" 2  : s1.var1 = %0d",  s1.var1);

     s2 = singleton ::create();
     $display (" 3  : s2.var1 = %0d",  s2.var1);

     s2.var1 =20;
     $display (" 4  : s2.var1 = %0d",  s2.var1);
     $display (" 5  : s1.var1 = %0d",  s1.var1);
  end
endprogram



Output:    

//   1 : s1.var1 = 0
//   2 : s1.var1 = 10
//   3 : s2.var1 = 10
//   4 : s2.var1 = 20
//   5 : s1.var1 = 20
A singleton object is a globally accessiblestatic object providing customizable service methods.

Synopsys UVM1.2 Workshop

在下面的例子中:

class service_class;
           protected static service_class me =get();
           static function service_class get();
                      if(me = null) me = new() ;
                       return me ;
            endfunction
extern virtual function void error (string msg) ;
endclass



error method需要用户自行定义所需要的行为。

在UVM的workshop中使用了一个名称为proxy\_class的singleton class很好地诠释了其在factory机制的应用。

class proxy_class#(type T =base) ;
           type proxy_class#(T)  this_type ;  //just for coding convenience
           protected function new();
endfunction

static function this_type get();
           if(me== null) me = new() ;
           return me;
endfunction
static function T create();
           create=new() ;
function
endcase
class driver xtends base;
           typedef proxy_class(driver) proxy ;
endclass

class monitor xtends base;
           typedef proxy_class(monitor) proxy ;
endclass
class environment ;
           driver drv ;
           monitor mon;
           function new;
           drv = driver::proxy::create() ;
           mon = monitor::proxy::create() ;
endfunction
endclass



这个proxy class提供了一个创建不同的singleton bject的机制。

为了使proxy class更有意义,我们需要一个virtual base classfactory机制。proxy class根据不同的factory注册和base class生成特定的proxy object。

本文转载自公众号:芯片数字实验室
原文链接:
https://mp.weixin.qq.com/s/cjb6ZDa0uWkj8ts0VECcog
未经作者同意,请勿转载!

推荐阅读
SystemVerilog概念浅析之Covergroup

想了解更多内容,欢迎关注芯片数字实验室专栏
推荐阅读
关注数
12320
内容数
222
前瞻性的眼光,和持之以恒的学习~
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息