📦 SystemVerilog Diziler – Kapsamlı Rehber #
SystemVerilog, Verilog’daki temel vektör yapısını büyük ölçüde genişleterek çok daha güçlü dizi türleri sunar. Bu yapılar, veri organizasyonu, rastgele erişim ve dinamik davranış için özellikle simülasyon ve testbench geliştirmelerinde büyük avantaj sağlar.
🧱 1. Packed Diziler (Bit Vektörleri) #
Packed diziler, bitlerin bitişik şekilde saklandığı yapılardır — geleneksel Verilog vektörleri gibi kullanılırlar.
logic [7:0] byte_data; // 8 bitlik packed vektör
- Her zaman soldan sağa (
[MSB:LSB]
) tanımlanır - Aritmetik ve bit işlemlerinde tek bir değer gibi davranır
- Çok boyutlu olabilir:
logic [3:0][7:0] memory_word; // 4 eleman, her biri 8 bit
📚 2. Unpacked Diziler #
Unpacked diziler, her bir elemanın ayrı ayrı saklandığı gerçek dizilerdir.
logic [7:0] memory_array [0:15]; // 16 eleman, her biri 8 bit
- Tanımda dizinin boyutu değişken adının sağında yer alır
- RAM, register dosyası, LUT gibi yapılar için idealdir
- Çok boyutlu tanımlar da yapılabilir:
logic [7:0] matrix [0:3][0:3]; // 4x4 baytlık matris
🔁 3. Dinamik Diziler #
Dinamik diziler, boyutu simülasyon sırasında değiştirilebilen dizilerdir.
int dyn_array[];
dyn_array = new[10]; // 10 eleman tahsis et
dyn_array[0] = 5;
- Sadece testbench/simülasyon ortamında kullanılır
- Derleme zamanında boyutu bilinmeyen yapılar için uygundur
.size()
,.delete()
gibi yöntemleri destekler:
$display("Boyut = %0d", dyn_array.size());
dyn_array.delete(); // Belleği boşalt
🧠 4. Associative Diziler #
Associative diziler, indeks olarak string
, int
gibi herhangi bir skaler türü kullanabilir.
int aa[string]; // string ile indekslenen associative dizi
aa["apple"] = 3;
aa["banana"] = 5;
-
İndeks türleri:
int
,string
,enum
, vb. olabilir -
Seyrek (sparse) veri veya anahtar-değer eşlemesi için idealdir
-
Gelişmiş yöntemleri vardır:
.exists(key)
.first(index)
.next(index)
.num()
if (aa.exists("apple")) $display("Elma bulundu");
🪜 5. Kuyruklar (Queues) #
Queue yapıları, dinamik dizilerin FIFO (First-In-First-Out) davranışına sahip halidir.
int q[$]; // int türünden kuyruk
q.push_back(1);
q.push_back(2);
q.push_front(0);
-
$
sembolü ile sınırsız kuyruk tanımlanır -
Yaygın yöntemler:
.push_front()
,.push_back()
.pop_front()
,.pop_back()
.insert(index, value)
,.delete(index)
.size()
,.empty()
int x = q.pop_front();
📏 Özet Tablosu #
Tür | Yeniden Boyutlandırılabilir mi? | İndeks Türü | Kullanım Amacı |
---|---|---|---|
Packed Dizi | Hayır | Sabit sayısal | RTL mantığı, bit işlemleri |
Unpacked Dizi | Hayır | Sabit sayısal | Bellek, register dosyası |
Dinamik Dizi | Evet | Sayısal | Simülasyon zamanı tahsis |
Associative Dizi | Evet | Herhangi bir skaler | Anahtar-değer eşlemeleri |
Kuyruk (Queue) | Evet | Otomatik (int) | FIFO yapılar, bufferlar |
🛠️ İpucu: Packed ve Unpacked Dizi Birlikte Kullanımı #
Packed ve unpacked diziler bir arada kullanılabilir:
logic [31:0] mem_array [0:1023]; // 1024 adet 32 bitlik kelime
Burada:
[31:0]
packed (bit vektörü)[0:1023]
unpacked (dizi elemanları)
✅ En İyi Kullanım Önerileri #
- RTL tasarımı için packed diziler tercih edilir
- Testbench için dinamik, associative ve queue diziler kullanılmalıdır
- Queue yapıları scoreboard ve işlem listeleri için çok uygundur
.size()
,.exists()
gibi yöntemlerle güvenli ve ölçeklenebilir kod yazılabilir
SystemVerilog’un bu modüler dizi sistemi, hem donanım modelleme hem de üst düzey testbench yapıları için büyük esneklik ve güç sunar.