Thursday, 29 December 2016

Polymorphism in SystemVerilog


Here Class C is extended from class B, class B is extended from class A. To achieve polymorphism for class B, method must be declared virtual in class A. Again to achieve polymorphism in class C, the method is not required to be declared virtual in class B, as class A method prototype has virtual qualifier.

Code on GitHub


class A;

    // For polymorphism to work, method prototype 
    // (method name, return type, arguments) must  
    // be the same. 
    virtual function void display(); 
      $display("Display: Class A"); 
    endfunction 

    function void message();
      $display("Message: Class A"); 
    endfunction

endclass
Class A implements display() as virtual method and message() as non-virtual. Now, extended class from class A does not need to declare display() method as virtual once again. Virtual is implicit in all extended classes.


 class B extends A; 

    // As display() function is virtual in  
    // class A, no need to explicitly diclare 
    // it virtual here 
    function void display(); 
      $display("Display: Class B"); 
    endfunction 

    function void message(); 
      $display("Message: Class B");
    endfunction 

  endclass


  class C extends B; 

    // As display() function is virtual in  
    // class A, hece class B as well, no  
    // need to explicitly diclare it virtual here 
    function void display(); 
      $display("Display: Class C"); 
    endfunction 

    function void message(); 
      $display("Message: Class C"); 
    endfunction 

  endclass

  A a_h;
B b_h;
  C c_h; 

  initial 
  begin 
    a_h = new(); 
    b_h = new(); 
    c_h = new(); 

    a_h = b_h; 

    $display("\n\n----------------"); 
    $display("Accessing object B using class A handle.\n"); 

    a_h.display(); 
    a_h.message(); 

    $display("----------------"); 

    b_h = c_h; 

    $display("\n\n----------------"); 
    $display("Accessing object C using class B handle.\n"); 

    b_h.display(); 
    b_h.message(); 

    $display("----------------\n\n"); 
  end


Output of above setup looks like this,

# ----------------
# Accessing object B using class A handle.
#
# Display: Class B
# Message: Class A
# ----------------
#
# ----------------
# Accessing object C using class B handle.
#
# Display: Class C
# Message: Class B
# ----------------

Next arguments could be, what if class A does not declare methods as virtual but class B does. Can we achieve polymorphism from class A to class C? Try this out.