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
--------------------------------------

Click to execute 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.
--------------------------------------

Click to execute 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'.

Click to execute 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.
--------------------------------------

Click to execute on

❮ Previous Next ❯