Member 'Downloads' section will be deprecated from Jan 1, 2020.

SystemVerilog prohibits a class declared as virtual to be directly instantiated and is called an abstract class.

Syntax

 
virtual class <class_name>
  // class definition
endclass
 

However, this class can be extended to form other sub-classes which can then be instantiated. This is useful to enforce testcase developers to always extend a base class to form another class for their needs. So base classes are usually declared asvirtual although it is not mandatory.

Normal Class Example

 
class BaseClass;
  int data;
 
  function new();
    data = 32'hc0de_c0de;
  endfunction
endclass
 
module tb;
  BaseClass base;
  initial begin
    base = new();
    $display ("data=0x%0h", base.data);
  end
endmodule
 
Simulation Log
ncsim> run
data=0xc0dec0de
ncsim: *W,RNQUIE: Simulation is complete.

Abstract Class Example

Let us declare the class BaseClass as virtual to make it an abstract class and see what happens.

 
virtual class BaseClass;
  int data;
 
  function new();
    data = 32'hc0de_c0de;
  endfunction
endclass
 
module tb;
  BaseClass base;
  initial begin
    base = new();
    $display ("data=0x%0h", base.data);
  end
endmodule
 

A compilation error is reported by the simulator as shown below since abstract classes are not allowed to be instantiated.

Simulation Log
		base = new();
		   |
ncvlog: *E,CNIABC (testbench.sv,12|5): An abstract (virtual) class cannot be instantiated.

Click to try this example in a simulator!   

Extending Abstract Classes

Abstract classes can be extended just like any other SystemVerilog class using the extends keyword like shown below.

 
virtual class BaseClass;
  int data;
 
  function new();
    data = 32'hc0de_c0de;
  endfunction
endclass
 
class ChildClass extends BaseClass;
  function new();
    data = 32'hfade_fade;
  endfunction
endclass
 
module tb;
  ChildClass child;
  initial begin
    child = new();
    $display ("data=0x%0h", child.data);
  end
endmodule
 

It can be seen from the simulation output below that it is perfectly valid to extend abstract classes to form other classes that can be instantiated using new() method.

Simulation Log
ncsim> run
data=0xfadefade
ncsim: *W,RNQUIE: Simulation is complete.

Click to try this example in a simulator!   

Pure Virtual Methods

A virtual method inside an abstract class can be declared with the keyword pure and is called a pure virtual method. Such methods only require a prototype to be specified within the abstract class and the implementation is left to defined within the sub-classes.

Pure Method Example

 
virtual class BaseClass;
  int data;
 
  pure virtual function int getData();
endclass
 
class ChildClass extends BaseClass;
  virtual function int getData();
    data = 32'hcafe_cafe;
    return data;
  endfunction
endclass
 
module tb;
  ChildClass child;
  initial begin
    child = new();
    $display ("data = 0x%0h", child.getData());
  end
endmodule
 

The pure virtual method prototype and its implementation should have the same arguments and return type.

Simulation Log
ncsim> run
data = 0xcafecafe
ncsim: *W,RNQUIE: Simulation is complete.

Click to try this example in a simulator!   

You consent to our cookies if you continue to use our website. To know more about cookies, see our privacy policy. I accept cookies from this site.

Agree