SystemVerilog OOP Mastery · All levels
Virtual Methods and Override Intent: Code Examples
Code Examples for Virtual Methods and Override Intent.
Code examples
Virtual vs non-virtual call behavior through base handle
systemverilog
class agent_base;
function void report();
$display("agent_base::report");
endfunction
virtual function void build_phase();
$display("agent_base::build_phase");
endfunction
endclass
class spi_agent extends agent_base;
function void report();
$display("spi_agent::report");
endfunction
virtual function void build_phase();
$display("spi_agent::build_phase");
endfunction
endclass
module tb;
initial begin
agent_base a;
a = new spi_agent();
a.report(); // non-virtual: calls agent_base::report
a.build_phase(); // virtual: calls spi_agent::build_phase
end
endmoduleSame-name methods do not imply dynamic dispatch. The base declaration must be virtual for runtime override selection.
UVM extension point relying on virtual override
systemverilog
class pkt_base extends uvm_sequence_item;
`uvm_object_utils(pkt_base)
function new(string name = "pkt_base");
super.new(name);
endfunction
virtual function void do_print(uvm_printer printer);
super.do_print(printer);
printer.print_string("kind", "base");
endfunction
endclass
class axi_pkt extends pkt_base;
`uvm_object_utils(axi_pkt)
rand bit [3:0] burst_len;
function new(string name = "axi_pkt");
super.new(name);
endfunction
virtual function void do_print(uvm_printer printer);
super.do_print(printer);
printer.print_field_int("burst_len", burst_len, 4, UVM_DEC);
endfunction
endclassUVM infrastructure usually manipulates objects through base handles. Declaring and overriding do_print as virtual ensures derived packet details appear during runtime debug.