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\nendclass

Calls 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\nendclass

Even with one virtual entrypoint, downstream helper hooks still need virtual when they are part of the customization contract.

Related topics