Contact / Report an issue

SystemVerilog Polymorphism

Polymorphism in SystemVerilog


Polymorphism means many forms. Polymorphism in SystemVerilog provides an ability to an object to take on many forms.

Method handle of super-class can be made to refer to the subclass method, this allows polymorphism or different forms of the same method.

How,  many forms of a method can be made by referring to the subclass method?
will see with an example,

Polymorphism example


Polymorphism in SystemVerilog
SystemVerilog Polymorphism
* Click on image for a better view

Let's write the base_class with a method display();

class base_class;
  virtual function void display();
    $display("Inside base class");
  endfunction
endclass



Writing three extended classes of base_class, with display method overridden in it.

class ext_class_1 extends base_class;
  function void display();
    $display("Inside extended class 1");
  endfunction
endclass

class ext_class_2 extends base_class;
  function void display();
    $display("Inside extended class 2");
  endfunction
endclass

class ext_class_3 extends base_class;
  function void display();
    $display("Inside extended class 3");
  endfunction
endclass




Create an object of each extended class,

ext_class_1 ec_1 = new();
ext_class_2 ec_2 = new();
ext_class_3 ec_3 = new();


Declare an array of a base class,

base_class b_c[3];

Assign extend class handles to base class handles.

b_c[0] = ec_1;
b_c[1] = ec_2;
b_c[2] = ec_3;


Call the display method using base_class handle,

b_c[0].display();
b_c[1].display();
b_c[2].display();


In the above method calls,
Though all the methods are called using base_class handle, different methods are getting called. this shows the many forms of the same method, this is called polymorphism.



Complete code,

// base class 
class base_class;
  virtual function void display();
    $display("Inside base class");
  endfunction
endclass

// extended class 1
class ext_class_1 extends base_class;
  function void display();
    $display("Inside extended class 1");
  endfunction
endclass

// extended class 2
class ext_class_2 extends base_class;
  function void display();
    $display("Inside extended class 2");
  endfunction
endclass

// extended class 3
class ext_class_3 extends base_class;
  function void display();
    $display("Inside extended class 3");
  endfunction
endclass

// module
module class_polymorphism;

  initial begin 
    
    //declare and create extended class
    ext_class_1 ec_1 = new();
    ext_class_2 ec_2 = new();
    ext_class_3 ec_3 = new();
    
    //base class handle
    base_class b_c[3];
    
    //assigning extended class to base class
    b_c[0] = ec_1;
    b_c[1] = ec_2;
    b_c[2] = ec_3;
    
    //accessing extended class methods using base class handle
    b_c[0].display();
    b_c[1].display();
    b_c[2].display();
  end

endmodule

 Simulator Output  

Inside extended class 1
Inside extended class 2
Inside extended class 3

Execute the above code on