SystemVerilog OOP Mastery · All levels

Pure Virtual Methods as Compile-Time Contracts: Code Examples

Code Examples for Pure Virtual Methods as Compile-Time Contracts.

Code examples

Protocol driver contract with mandatory methods

systemverilog
virtual class protocol_driver;
  pure virtual task drive_transfer(bit [31:0] addr, bit [31:0] data);
  pure virtual function string protocol_name();
endclass

class apb_driver extends protocol_driver;
  virtual task drive_transfer(bit [31:0] addr, bit [31:0] data);
    // APB setup/access sequence would be here
  endtask

  virtual function string protocol_name();
    return "APB";
  endfunction
endclass

Any class extending `protocol_driver` must implement both required methods or remain abstract.

Polymorphic use through abstract handle

systemverilog
virtual class protocol_driver;
  pure virtual task drive_transfer(bit [31:0] addr, bit [31:0] data);
endclass

class spi_driver extends protocol_driver;
  virtual task drive_transfer(bit [31:0] addr, bit [31:0] data);
    // SPI framing and shift logic
  endtask
endclass

task run_one(protocol_driver drv);
  drv.drive_transfer('h20, 'hAB);
endtask

module demo;
  initial begin
    spi_driver d = new();
    run_one(d);
  end
endmodule

Code that consumes `protocol_driver` can stay generic while concrete subclasses provide protocol-specific behavior.

Related topics