SystemVerilog OOP Mastery · All levels
Virtual vs Nonvirtual Traps: Code Examples
Code Examples for Virtual vs Nonvirtual Traps.
Code examples
Base handle calls nonvirtual method
systemverilog
class driver_base;\n function string kind();\n return "base";\n endfunction\nendclass\n\nclass axi_driver extends driver_base;\n function string kind();\n return "axi";\n endfunction\nendclass\n\ndriver_base d;\ninitial begin\n d = new axi_driver();\n // BUG: prints base because method is nonvirtual in base class.\n $display("kind=%s", d.kind());\nend\n\nclass driver_base_fix;\n virtual function string kind();\n return "base";\n endfunction\nendclass\n\nclass axi_driver_fix extends driver_base_fix;\n function string kind();\n return "axi";\n endfunction\nendclassCalls through base handles statically bind unless the base declaration is virtual. Derived implementation alone is not enough.
Virtual entrypoint calling nonvirtual hook
systemverilog
class base_seq;\n virtual function string phase_tag();\n // BUG: helper is nonvirtual, so derived helper is ignored.\n return compose_tag();\n endfunction\n\n function string compose_tag();\n return "base-tag";\n endfunction\nendclass\n\nclass burst_seq extends base_seq;\n function string compose_tag();\n return "burst-tag";\n endfunction\nendclass\n\n// FIX: make the hook virtual in the base class too.\nclass base_seq_fix;\n virtual function string phase_tag();\n return compose_tag();\n endfunction\n\n virtual function string compose_tag();\n return "base-tag";\n endfunction\nendclassEven with one virtual entrypoint, downstream helper hooks still need virtual when they are part of the customization contract.