SystemVerilog OOP Mastery · All levels

No Multiple Inheritance: Interface Classes + Composition: Code Examples

Code Examples for No Multiple Inheritance: Interface Classes + Composition.

Code examples

Delegation replaces second base class

systemverilog
class base_a;
  function void fa();
    $display("base_a::fa");
  endfunction
endclass

class base_b;
  function void fb();
    $display("base_b::fb");
  endfunction
endclass

// class child extends base_a, base_b; // Illegal in SystemVerilog

interface class b_role_if;
  pure virtual function void fb();
endclass

class child extends base_a implements b_role_if;
  base_b b_impl;

  function new();
    b_impl = new();
  endfunction

  virtual function void fb();
    b_impl.fb();
  endfunction
endclass

The class inherits from `base_a`, satisfies a role contract for `fb()`, and delegates implementation to a composed `base_b` instance.

Role contracts plus helper composition

systemverilog
interface class serializable_if;
  pure virtual function string to_json();
endclass

interface class traceable_if;
  pure virtual task trace(string tag);
endclass

class trace_helper;
  task emit(string who, string tag);
    $display("[%0s] %0s", who, tag);
  endtask
endclass

class txn implements serializable_if, traceable_if;
  trace_helper th;
  rand bit [7:0] opcode;

  function new();
    th = new();
  endfunction

  virtual function string to_json();
    return $sformatf("{\"opcode\":%0d}", opcode);
  endfunction

  virtual task trace(string tag);
    th.emit("txn", tag);
  endtask
endclass

Contracts (`serializable_if`, `traceable_if`) describe what `txn` must expose; `trace_helper` provides reusable implementation through composition.

Related topics