In reply to verified:
Are you sure you’re running the same code in your post?
class A ;
virtual function void disp ();
$display(" Non-Virtual from A ");
endfunction
virtual function void vdisp ();
$display(" Virtual from A ");
endfunction
endclass
class EA extends A ;
virtual function void disp ();
$display(" Non-Virtual from EA ");
endfunction
virtual function void vdisp ();
$display(" Virtual from EA ");
endfunction
endclass
module main ;
function void disp( A a);
a.disp();
a.vdisp();
endfunction
A my_a;
EA my_ea;
initial
begin
my_a = new();
my_ea = new();
disp(my_a);
disp(my_ea);
end
endmodule
With the code above, result should be:
Non-Virtual from A
Virtual from A
Non-Virtual from EA
Virtual from EA
It’s how polymorphism work in SystemVerilog. You declare parent’s functions with virtual, then when you pass child object to parent argument of disp, these virtual functions in parent will be completely overridden by child’s functions.
If you don’t want parent’s functions to be overridden, remove virtual keyword.