SystemVerilog Static Class Members

Static class members 


Class members can be created with the keyword static. class members with the keyword static are called as static class members. the class can have static properties and static methods (functions and tasks). a single copy of static variables is shared across multiple instances.

Static Properties


  • The class can have multiple instances, each instance of the class will be having its own copy of variables.
  • Sometimes only one version of a variable is required to be shared by all instances. These class properties are created using the keyword static.

Syntax


static <data_type> <property_name>;

Static Methods


Static methods are the same as static properties,
  • a static method can access only static properties of the class and access to the non-static properties is illegal and lead to a compilation error.
  • Static methods cannot be virtual

Note:
Static class properties and methods can be used without creating an object of that type.

Syntax


static task/function <method_name>;

Static properties example


In the below example,
The class has the variable packet_id, which is the unique ID assigned to the packet;
Static variable no_of_pkts_created, no_of_pkts_created will get incremented on every object creation.

no_of_pkts_created is assigned to packet_id.

class packet;
  
  //class properties
  byte packet_id;
    
  //static property to keep track of number of pkt's created
  static byte no_of_pkts_created;
  
  //constructor
  function new();
    //incrementing pkt count on creating an object
    no_of_pkts_created++;
    packet_id = no_of_pkts_created;
  endfunction
  
  //method to display class prperties
  function void display();
    $display("--------------------------------------");
    $display("\t packet_id  = %0d",packet_id);
    $display("--------------------------------------");
  endfunction 
endclass

module static_properties;
  packet pkt[3];

  initial begin
    foreach(pkt[i]) begin
      pkt[i] = new();
      pkt[i].display();
    end
  end  
endmodule

 Simulator Output 

--------------------------------------
packet_id  = 1
--------------------------------------
--------------------------------------
packet_id  = 2
--------------------------------------
--------------------------------------
packet_id  = 3
--------------------------------------

Execute the above code on 



Static method example


Below example shows the declaration of a static function.

class packet;
  
  //class properties
  byte packet_id;
    
  //static property to keep track of number of pkt's created
  static byte no_of_pkts_created;
  
  //constructor
  function new();
    //incrementing pkt count on creating an object
    no_of_pkts_created++;
    packet_id = no_of_pkts_created;
  endfunction
  
  //method to display class prperties
  function void display();
    $display("--------------------------------------");
    $display("\t packet_id  = %0d",packet_id);
    $display("--------------------------------------");
  endfunction 
endclass

module static_properties;
  packet pkt[3];

  initial begin
    foreach(pkt[i]) begin
      pkt[i] = new();
      pkt[i].display();
    end
  end  
endmodule

 Simulator Output 

--------------------------------------
3 packets created.
--------------------------------------

Execute the above code on 

Static method trying to access a non-static variable


In the below example,
The static function tries to access the non-static variable of the class, which leads to a compilation error.

class packet;
  byte packet_id;
  
  //static property to keep track of number of pkt's created
  static byte no_of_pkts_created;
  
  //constructor
  function new();
    //incrementing pkt count on creating an object
    no_of_pkts_created++;
  endfunction
    
  //Static method to display class prperties
  static function void display_packets_created();
    $display("--------------------------------------");
    $display("\t Packet Id is %0d",packet_id);
    $display("\t %0d packets created.",no_of_pkts_created);
    $display("--------------------------------------");
  endfunction 
endclass

module static_properties;
  packet pkt[3];

  initial begin
    foreach(pkt[i]) begin
      pkt[i] = new();
    end
    pkt[0].display_packets_created();
  end  
endmodule

 Simulator Output 

Error-[SV-AMC] Non-static member access
testbench.sv, 19
$unit, "packet_id"
  Illegal access of non-static member 'packet_id' from static method
  'packet::display_packets_created'.

Execute the above code on 



Accessing static class properties without creating an object


In the below example,

Static class variable (no_of_pkts_created) and Static class function (display_packets_created) is accessed with class handle which is not constructed (new() is not done).

class packet;
    
  //static property to keep track of number of pkt's created
  static byte no_of_pkts_created;
  
  //constructor
  function new();
    //incrementing pkt count on creating an object
    no_of_pkts_created++;
  endfunction
    
  //Static method to display class prperties
  static function void display_packets_created();
    $display("--------------------------------------");
    $display("\t %0d packets created.",no_of_pkts_created);
    $display("--------------------------------------");
  endfunction 
endclass

module static_properties;
  packet pkt[3];
  packet p;

  initial begin
    foreach(pkt[i]) begin
      pkt[i] = new();
    end
    
    //Accesing static Variable with class handle p
    $display("--------------------------------------");
    $display("\t %0d packets created.",p.no_of_pkts_created);
    $display("--------------------------------------");    
    
    //Accesing static Method with class handle p
    p.display_packets_created();
  end  
endmodule

 Simulator Output 

--------------------------------------
3 packets created.
--------------------------------------
--------------------------------------
3 packets created.
--------------------------------------

Execute the above code on