🧩 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