抽象クラスとバーチャルメソッド
抽象クラスは、このクラスの実体(インスタンス)を直接生成することができません。
抽象クラスの定義は、通常のクラスと同様に定義しますが、class の前に virtual を付ける必要があります。
virtual class VClass;
抽象クラスは、メソッドを持つことができますが、classと同じように virtual を付ける必要があります。
これをバーチャルメソッド(関数/タスク)と呼びます。
virtual class VClass;
virtual function integer func_a( integer x, integer y );
endfunction : func_a
virtual task task_b( bit [31:0] x );
endtask : task_b
endclass : VClass
バーチャルメソッドの中は空です。抽象クラスを継承する子クラスでメソッドを再定義します。
class RClass extends VClass;
function integer func_a( integer x, integer y );
// ここでなにかを行う
endfunction : func_a
task task_b( bit [31:0] x );
// ここでなにかを行う
endtask : task_b
endclass : RClass
抽象クラスで定義したバーチャルメソッドは、継承したクラスでかならず再定義しなければいけません。
もし、継承したクラスでもメソッドを定義していないのなら、その継承したクラスも抽象クラスにしなければいいけません。
また、バーチャルメソッドは、メソッドのプロトタイプだけ(つまり、何もしない本体無しに)にすることもできます。
virtual class VClass;
virtual function integer func_a( integer x, integer y );
virtual task task_b( bit [31:0] x );
endclass : VClass