Ana içeriğe geç

SystemVerilog'da İleri OOP: Aggregation, Kalıtım ve Daha Fazlası

· loading · loading · ·
Eğitim Doğrulama SystemVerilog SystemVerilog OOP Nesne Yönelimli Programlama Doğrulama Sınıflar
Eğitim Doğrulama SystemVerilog
Axolot Logic
Yazar
Axolot Logic
Sayısal Tasarım Mühendisi
Table of Contents
SystemVerilog Tasarım Serisi - This article is part of a series.
Part 27: This Article

🧩 SystemVerilog’ta İleri OOP: Aggregation, Inheritance ve Daha Fazlası
#

Bu bölüm, SystemVerilog’ta aggregation, inheritance, constructor kullanımı, çok katmanlı inheritance, veri gizleme, encapsulation ve parametreli sınıflar gibi ileri OOP konularını detaylandırıyor. Bu kavramlar, güçlü ve yeniden kullanılabilir testbench mimarileri oluşturmanıza yardımcı olur.


1️⃣ Aggregation (Bileşim)
#

Aggregation, bir sınıfın başka sınıflardan nesneleri içerecek şekilde oluşturulmasını sağlar. Bu, “has-a” (sahiptir) ilişkisini ifade eder.

Örnek:

class Address;
  string city;
endclass

class Person;
  Address addr; // Aggregation: Person has an Address
  function new();
    addr = new();
  endfunction
endclass

Bu örnekte Person, bir Address nesnesini property olarak içerir. Aggregation, modüler ve hiyerarşik tasarımlar kurmada yardımcı olur.


2️⃣ Inheritance (Kalıtım)
#

Inheritance (kalıtım), bir sınıfın (alt sınıf) başka bir sınıfın (üst sınıf) özelliklerini ve metotlarını devralmasını sağlar. extends anahtar kelimesi kullanılır.

Örnek:

class Packet;
  bit [7:0] header;
endclass

class DataPacket extends Packet;
  bit [31:0] payload;
endclass

Burada DataPacket, Packet sınıfından header üyesini devralır.


3️⃣ Inheritance ve Constructor’lar
#

Inheritance kullanıldığında, üst sınıfın constructor’ı otomatik olarak çağrılmaz. Üst sınıf constructor’ını çağırmak için super.new() kullanılmalıdır.

Örnek:

class Packet;
  function new();
    $display("Packet constructor");
  endfunction
endclass

class DataPacket extends Packet;
  function new();
    super.new(); // Üst sınıf constructor'ını çağırır
    $display("DataPacket constructor");
  endfunction
endclass

Genelde super.new() ilk satırda çağrılarak üst sınıfın düzgün bir şekilde başlatılması sağlanır.


4️⃣ Çok Katmanlı Kalıtım (Multilayer Inheritance)
#

SystemVerilog, çok katmanlı inheritance (multi-level inheritance) destekler. Bir sınıf, başka bir sınıftan kalıtım alabilir ve bu sınıf da başka bir sınıftan kalıtım alabilir.

Örnek:

class Packet;
  bit [7:0] header;
endclass

class DataPacket extends Packet;
  bit [31:0] payload;
endclass

class EncryptedPacket extends DataPacket;
  bit [127:0] encryptionKey;
endclass

Bu sayede fonksiyonalitenin katmanlı bir şekilde inşa edilmesi sağlanır.


5️⃣ Veri Gizleme ve Encapsulation
#

Veri gizleme, sınıf içindeki verilerin dışarıdan yanlışlıkla erişilmesini engeller. local veya protected anahtar kelimeleri kullanılır.

  • local: Sadece aynı sınıf içinden erişilebilir.
  • protected: Sınıfın kendisi ve alt sınıflar tarafından erişilebilir.

Örnek:

class Packet;
  local bit [7:0] secret;
  protected bit [7:0] protectedData;

  function void setSecret(bit [7:0] s);
    secret = s;
  endfunction
endclass

Bu yapı, encapsulation (kapsülleme) sağlar. Yani veriler ve davranışlar bir arada ve kontrollü bir şekilde sunulur.


6️⃣ Parametreli Sınıflar (Parameterized Classes)
#

SystemVerilog, parametreli sınıflar ile yeniden kullanılabilir ve tip güvenliği sağlayan yapılar sunar. Bu sayede çalışma zamanında tip hatalarından kaçınılır.

Örnek:

class Queue #(type T=int);
  T data[$]; // T tipinde dinamik array

  function void push(T item);
    data.push_back(item);
  endfunction

  function T pop();
    return data.pop_front();
  endfunction
endclass

Queue #(bit [7:0]) byteQueue = new();
Queue #(string) stringQueue = new();

Parametreli sınıflar, generik doğrulama bileşenleri tasarlamayı kolaylaştırır.


📖 Sonuç
#

SystemVerilog’un bu ileri OOP kavramları, mühendislerin modüler, yeniden kullanılabilir ve ölçeklenebilir doğrulama ortamları kurmasına olanak tanır. Bu teknikleri öğrenmek, güçlü testbench’ler geliştirmek için büyük önem taşır.

// Aggregation: Address class
class Address;
  string city;
  string street;
  function new(string cityName = "Unknown", string streetName = "Main St.");
    city = cityName;
    street = streetName;
  endfunction
  function void display();
    $display("[Address] City: %s, Street: %s", city, street);
  endfunction
endclass

// Base class: Packet
class Packet;
  local bit [7:0] secret;        // Data hiding: local
  protected bit [7:0] protectedData; // Data hiding: protected

  function new();
    $display("[Packet] Constructor called.");
  endfunction

  function void setSecret(bit [7:0] s);
    secret = s;
  endfunction

  function void showSecret();
    $display("[Packet] Secret = %0h", secret);
  endfunction
endclass

// Inheritance: DataPacket extends Packet
class DataPacket extends Packet;
  bit [31:0] payload;

  function new();
    super.new();  // Calls Packet constructor
    $display("[DataPacket] Constructor called.");
  endfunction
endclass

// Multilayer Inheritance: EncryptedPacket extends DataPacket
class EncryptedPacket extends DataPacket;
  bit [127:0] encryptionKey;

  function new();
    super.new();  // Calls DataPacket constructor
    $display("[EncryptedPacket] Constructor called.");
  endfunction
endclass

// Parameterized Class: Generic Queue
class Queue #(type T=int);
  T data[$]; // dynamic array of type T

  function void push(T item);
    data.push_back(item);
  endfunction

  function T pop();
    return data.pop_front();
  endfunction

  function void display();
    foreach (data[i])
      $display("[Queue] data[%0d] = %0s", i, data[i]);
  endfunction
endclass

// Aggregation: Person class
class Person;
  Address addr;  // Person has an Address (aggregation)

  function new(string cityName, string streetName);
    addr = new(cityName, streetName);
    $display("[Person] Constructor called.");
  endfunction

  function void display();
    addr.display();
  endfunction
endclass

// Testbench module
module tb_advanced_oop_demo;
  Person p;
  EncryptedPacket epkt;
  Queue #(bit [7:0]) byteQueue;
  Queue #(string) stringQueue;
  initial begin
    // Demonstrate Aggregation
    p = new("Istanbul", "Nispetiye St.");
    p.display();

    // Demonstrate Inheritance & Constructor Chaining
    epkt = new();
    epkt.setSecret(8'hAB);
    epkt.showSecret();
    epkt.encryptionKey = 128'hDEADBEEFDEADBEEFDEADBEEFDEADBEEF;
    $display("[EncryptedPacket] Key = %h", epkt.encryptionKey);

    // Demonstrate Parameterized Class
    byteQueue = new();
    byteQueue.push(8'hAA);
    byteQueue.push(8'hBB);
    byteQueue.display();

    stringQueue = new();
    stringQueue.push("Hello");
    stringQueue.push("World");
    stringQueue.display();

    #10 $finish;
  end

endmodule

SystemVerilog Tasarım Serisi - This article is part of a series.
Part 27: This Article

Related

SystemVerilog'da İleri Nesne Yönelimli Programlama: Yapıcılar, Handle'lar ve Statik Üyeler
· loading · loading
Eğitim Doğrulama SystemVerilog SystemVerilog OOP Nesne Yönelimli Programlama Doğrulama Sınıflar
Eğitim Doğrulama SystemVerilog
SystemVerilog'da Nesne Yönelimli Programlama
· loading · loading
Eğitim Doğrulama SystemVerilog SystemVerilog OOP Nesne Yönelimli Programlama Verification Sınıflar
Eğitim Doğrulama SystemVerilog
SystemVerilog'da Polymorphism ve Sanallık (Virtuality)
· loading · loading
Eğitim Doğrulama SystemVerilog SystemVerilog OOP Nesne Yönelimli Programlama Doğrulama Virtuality
Eğitim Doğrulama SystemVerilog
SystemVerilog'da Mailbox Kullanımı
· loading · loading
Eğitim Doğrulama SystemVerilog SystemVerilog IPC Mailboxes Doğrulama Senkronizasyon
Eğitim Doğrulama SystemVerilog
SystemVerilog'da Named Events Kullanımı
· loading · loading
Eğitim Doğrulama SystemVerilog SystemVerilog IPC Named Events Doğrulama Senkronizasyon
Eğitim Doğrulama SystemVerilog
SystemVerilog'da Semaphores Kullanımı
· loading · loading
Eğitim Doğrulama SystemVerilog SystemVerilog IPC Semaphores Doğrulama Senkronizasyon
Eğitim Doğrulama SystemVerilog