Kalıtım (Inheritance)

Gün 2: Nesne Yönelimli Programlama (OOP) | Sınıf hiyerarşisi, super anahtar kelimesi, metod genişletme

Kaynak Kod

// =============================================================================
// GUN 2 - Konu 5: Kalitim (Inheritance) ve super Anahtar Kelimesi
// =============================================================================

// Temel (Base) Sinif
class Transaction;
  int    id;
  int    data;
  string txn_type;
  
  static int count = 0;

  function new(int id = 0, int data = 0);
    this.id   = id;
    this.data = data;
    this.txn_type = "BASE";
    count++;
  endfunction

  function void display();
    $display("  [%s] ID=%0d, Data=0x%08h", txn_type, id, data);
  endfunction

  function bit is_valid();
    return (data != 0);
  endfunction
endclass

// Alt Sinif 1: Okuma Islemi
class ReadTransaction extends Transaction;
  logic [31:0] address;
  int          burst_length;

  function new(int id, logic [31:0] addr, int burst = 1);
    super.new(id, 0);             // Ust sinif constructor'i cagir
    this.address      = addr;
    this.burst_length = burst;
    this.txn_type     = "READ";
  endfunction

  // Override: display metodunu genislet
  function void display();
    super.display();              // Ust sinif metodunu cagir
    $display("        Addr=0x%08h, Burst=%0d", address, burst_length);
  endfunction
endclass

// Alt Sinif 2: Yazma Islemi
class WriteTransaction extends Transaction;
  logic [31:0] address;
  logic [31:0] write_data;
  logic [3:0]  byte_enable;

  function new(int id, logic [31:0] addr, logic [31:0] wdata, logic [3:0] be = 4'hF);
    super.new(id, wdata);
    this.address     = addr;
    this.write_data  = wdata;
    this.byte_enable = be;
    this.txn_type    = "WRITE";
  endfunction

  function void display();
    super.display();
    $display("        Addr=0x%08h, WData=0x%08h, BE=0x%01h",
             address, write_data, byte_enable);
  endfunction
endclass

// Alt-Alt Sinif: Hatali Yazma (Hata Enjeksiyonu)
class ErrorWriteTransaction extends WriteTransaction;
  bit inject_addr_error;
  bit inject_data_error;

  function new(int id, logic [31:0] addr, logic [31:0] wdata);
    super.new(id, addr, wdata);
    this.txn_type = "ERR_WRITE";
    this.inject_addr_error = 0;
    this.inject_data_error = 0;
  endfunction

  function void corrupt();
    if (inject_addr_error) begin
      address ^= 32'hDEAD_0000;
      $display("  [!] Adres bozuldu: 0x%08h", address);
    end
    if (inject_data_error) begin
      write_data ^= 32'h0000_BEEF;
      $display("  [!] Veri bozuldu: 0x%08h", write_data);
    end
  endfunction

  function void display();
    super.display();
    $display("        Hata Enj.: addr=%0b, data=%0b",
             inject_addr_error, inject_data_error);
  endfunction
endclass

module kalitim;
  initial begin
    Transaction          base_txn;
    ReadTransaction      rd_txn;
    WriteTransaction     wr_txn;
    ErrorWriteTransaction err_txn;

    $display("=== Kalitim (Inheritance) ===\n");

    // --- Nesne olusturma ---
    $display("--- Hiyerarsik Nesneler ---");
    base_txn = new(0, 32'h1234);
    rd_txn   = new(1, 32'hA000_0000, 4);
    wr_txn   = new(2, 32'hB000_0000, 32'hCAFE_BABE);
    err_txn  = new(3, 32'hC000_0000, 32'h1234_5678);

    base_txn.display();
    rd_txn.display();
    wr_txn.display();

    // --- super kullanimi (zaten constructor'da) ---
    $display("\n--- Hata Enjeksiyonu ---");
    err_txn.inject_addr_error = 1;
    err_txn.inject_data_error = 1;
    $display("  Bozulmadan once:");
    err_txn.display();
    err_txn.corrupt();
    $display("  Bozulduktan sonra:");
    err_txn.display();

    // --- Statik sayac (tum nesneler arasinda paylasilir) ---
    $display("\n--- Statik Sayac ---");
    $display("  Toplam Transaction sayisi = %0d", Transaction::count);

    // --- Ust sinif referansi ile alt sinif nesnesi ---
    $display("\n--- Ust Sinif Referansi ---");
    base_txn = wr_txn;  // WriteTransaction -> Transaction (gecerli)
    $display("  base_txn.is_valid() = %0b", base_txn.is_valid());

    $display("\n=== Kalitim Sonu ===");
    $finish;
  end
endmodule