📦 SystemVerilog Diziler#
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
logic arr [8]; // tek boyutlu eşit -> [7:0]
logic arr [8][2]; // [7:0] [1:0]
📚 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:new(number)
kullanarak boyut oluştur
$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. olabilirSeyrek (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ırYaygı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ı)
🧩 SystemVerilog’ta Dizi Atama Biçimleri#
SystemVerilog, dizinin türüne göre (packed, unpacked, dynamic, associative veya queue) farklı değer atama yöntemleri sunar.
1. İndeks Tabanlı Atama#
Klasik yöntem: Belirli bir indeks için elle atama yapılır.
arr[0] = 8'hAA;
2. Dizi Literali (Toplu) Atama#
Bir dizinin tümüne aynı anda '{'}
sözdizimi ile atama yapılabilir:
logic [7:0] arr [0:3];
initial arr = '{8'h11, 8'h22, 8'h33, 8'h44};
- Ayrıca
default:
ifadesiyle kısmi veya tek tip başlatma da yapılabilir:
arr = '{default: 8'h00}; // Tüm elemanları sıfırla
✅ 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.