Ana içeriğe geç

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
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 25: This Article

🧩 SystemVerilog’ta Nesne Yönelimli Programlama (OOP)
#

SystemVerilog, Verilog’a nesne yönelimli programlama (Object-Oriented Programming, OOP) özellikleri ekleyerek yeniden kullanılabilir, ölçeklenebilir ve bakımı kolay testbench’ler yazmayı mümkün kılar. OOP, özellikle karmaşık davranışların ve test senaryolarının modellenmesi gereken doğrulama ortamlarında büyük avantaj sağlar.


📌 Neden Nesne Yönelimli Programlama?
#

Geleneksel Verilog tamamen prosedüreldi ve bu da:

  • Kodun tekrar kullanılmasını zorlaştırıyordu.
  • Karmaşık doğrulama bileşenlerini yönetmeyi güçleştiriyordu.
  • UVM gibi gelişmiş testbench mimarilerinin uygulanmasını imkansız kılıyordu.

SystemVerilog’un OOP desteği bu eksiklikleri gidererek doğrulama mühendislerinin:

  • Yeniden kullanılabilir testbench bileşenleri (driver, monitor, scoreboard) oluşturmasına.
  • Kalıtım ve çok biçimlilik ile esnek mimariler geliştirmesine.
  • Veri ve fonksiyonaliteyi kapsülleyerek bakım kolaylığı sağlamasına olanak tanır.

🔍 SystemVerilog’ta Temel OOP Kavramları
#

📦 Sınıflar (Classes)
#

Sınıflar, SystemVerilog’ta OOP’nin temel taşlarıdır:

  • Class bir değişkendir.
  • Veri (değişkenler) ve davranış (metotlar) birlikte tanımlanır.
  • new() ile dinamik olarak örneklenebilir.
  • Kapsülleme ve yeniden kullanım sağlar.

Örnek:

class Packet;
  rand bit [7:0] data;
  function void print();
    $display("Data = %0h", data);
  endfunction
endclass

🧬 Kalıtım (Inheritance)
#

SystemVerilog, sınıfların başka sınıflardan özellik ve metod devralmasına izin verir:

  • extends anahtar kelimesi kullanılır.
  • Alt sınıflar, üst sınıf davranışını genişletebilir veya ezebilir.

Örnek:

class BasePacket;
  bit valid;
endclass

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

🔄 Çok Biçimlilik (Polymorphism)
#

Çok biçimlilik sayesinde, bir temel sınıfın referansı türetilmiş sınıf nesnelerine atanabilir:

  • Kodun esnekliğini artırır.
  • virtual ve override kullanarak dinamik metod çağrısı yapılabilir.

Örnek:

virtual class Transaction;
  virtual function void execute();
endclass

class ReadTransaction extends Transaction;
  function void execute();
    $display("Executing Read Transaction");
  endfunction
endclass

Transaction t;
t = new ReadTransaction();
t.execute(); // Türetilmiş sınıf metodunu çağırır

🔒 Kapsülleme (Encapsulation)
#

Kapsülleme, veri ve davranışı bir araya getirerek kontrollü erişim sağlar:

  • local ve protected anahtar kelimeleri ile verilerin dışarıdan erişimi kısıtlanır.
  • Modülerlik ve bakım kolaylığı sunar.

Örnek:

class SecurePacket;
  local bit [7:0] secretData;
  function void setData(bit [7:0] d);
    secretData = d;
  endfunction
  function bit [7:0] getData();
    return secretData;
  endfunction
endclass

🧩 Class Object Nedir?
#

SystemVerilog’ta bir class object, new() anahtar kelimesi ile dinamik olarak örneklenen bir nesnedir. Yani bir class sadece bir şablon veya kalıp gibidir; gerçek bir nesne oluşturmak için class’tan bir object (örnek) yaratılır.

Örnek:

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

Packet pkt;
initial begin
  pkt = new(); // Packet sınıfından bir nesne oluşturuldu
end

Bu örnekte Packet bir class, pkt ise bir class object’tir.


🏷️ Class Variable mı, Type mı?
#

  • Packet aslında bir class type’dır, tıpkı int veya bit gibi bir veri türü gibi düşünülebilir.
  • pkt ise bir class variable (değişkeni) olup, bir nesne referansıdır.

Kısacası:

  • Type: Class’ın kendisi (Packet).
  • Variable: Class object’i tutan değişken (pkt).

📦 Class Değişkenleri ve Metodları
#

Bir class içinde iki temel bileşen bulunur: 1️⃣ Değişkenler (Properties): Class object’ine özel verileri tutar. 2️⃣ Metodlar: Class object’inin davranışlarını tanımlar.

Örnek:

class Packet;
  // Class variable (property)
  bit [7:0] data;

  // Class method
  function void print();
    $display("Data = %0h", data);
  endfunction
endclass
  • data: Her Packet nesnesine özgü bir veridir.
  • print(): Bu nesne üzerinde çağrılabilecek bir davranıştır.

Her nesne kendi data değerini saklar ve metodlar o nesneye erişim sağlar.


🔄 Class ve Object Farkı
#

ÖzellikAçıklama
ClassBir şablon, veri yapısı ve davranış tanımıdır.
ObjectClass’ın bir örneğidir (run-time’da bellekte oluşur).

Örnek:

  • Packet ➔ Class (şablon).
  • pkt = new(); ➔ Object (bellekte var olan nesne).

🔑 Class Üyelerine Erişim
#

Bir class object’in üyelerine nokta operatörü (.) ile erişilir.

Örnek:

pkt.data = 8'hAA; // pkt object’inin data üyesine erişim
pkt.print();      // pkt object’inin print metodunu çağırma

Bu sayede nesneye özel verilere ve metodlara kolayca ulaşılır.


🚀 En İyi Uygulamalar
#

✅ Sınıfları kullanarak yeniden kullanılabilir ve modüler testbench bileşenleri oluştur. ✅ Kalıtım ve çok biçimlilikten yararlanarak esnek yapılar (örneğin, UVM) inşa et. ✅ Verileri kapsülle, dış erişimi kısıtla ve bakım kolaylığı sağla. ✅ Sınıf hiyerarşilerini ve ilişkilerini mutlaka dokümante et.


📖 Sonuç
#

SystemVerilog’ta nesne yönelimli programlama, testbench tasarımını modülerlik, esneklik ve bakım kolaylığı açısından dönüştürür. Bu kavramları ustalıkla kullanmak, yeniden kullanılabilir ve ölçeklenebilir doğrulama ortamları oluşturmak için kritik öneme sahiptir.

// This simple testbench demonstrates OOP concepts in SystemVerilog
module tb_oop_demo;

  // Base class: Packet
  class Packet;
    rand bit [7:0] data;
    function void print();
      $display("[Packet] Data = %0h", data);
    endfunction
  endclass

  // Derived class: ExtendedPacket with additional field
  class ExtendedPacket extends Packet;
    rand bit [7:0] id;
    function void print();
      $display("[ExtendedPacket] ID = %0h, Data = %0h", id, data);
    endfunction
  endclass

  // Testbench body
  initial begin
    Packet p;
    ExtendedPacket ep;

    // Base class instance
    p = new();
    p.data = $urandom_range(0, 255);
    p.print();

    // Derived class instance
    ep = new();
    ep.data = $urandom_range(0, 255);
    ep.id = $urandom_range(0, 255);
    ep.print();

    // Polymorphism demonstration
    p = ep;  // base handle points to derived object
    p.print();  // calls derived print() method

    #10 $finish;
  end

endmodule

SystemVerilog Tasarım Serisi - This article is part of a series.
Part 25: 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 İ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
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: Covergroups ve Coverage
· loading · loading
Eğitim Doğrulama SystemVerilog SystemVerilog Covergroup Coverage Verification
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