Ana içeriğe geç

SystemVerilog Diziler

· loading · loading · · ·
HDL SystemVerilog HDL
Axolot Logic
Yazar
Axolot Logic
Sayısal Tasarım Mühendisi
Table of Contents
SystemVerilog - This article is part of a series.
Part 3: This Article

📦 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.

SystemVerilog - This article is part of a series.
Part 3: This Article

Related

SystemVerilog `fork...join`
· loading · loading
HDL SystemVerilog HDL
SystemVerilog Döngüler & Akış Kontrol İfadeleri
· loading · loading
HDL SystemVerilog HDL
SystemVerilog Tasklar ve Fonksiyonlar
· loading · loading
HDL SystemVerilog HDL
SystemVerilog Typedef & Alias
· loading · loading
HDL SystemVerilog HDL
SystemVerilog `interface`
· loading · loading
HDL SystemVerilog HDL
Blocking ve Non-Blocking Atamalar
· loading · loading
HDL SystemVerilog HDL