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
endclassThe 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
endclassContracts (`serializable_if`, `traceable_if`) describe what `txn` must expose; `trace_helper` provides reusable implementation through composition.