Ana içeriğe geç

SystemVerilog Diziler

· loading · loading · ·
Donanım Tasarımı Doğrulama SystemVerilog Diziler Packed Dinamik Dizi Kuyruk (Queue) Testbench
Donanım Tasarımı Doğrulama
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 9: This Article

📦 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. 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ürYeniden Boyutlandırılabilir mi?İndeks TürüKullanım Amacı
Packed DiziHayırSabit sayısalRTL mantığı, bit işlemleri
Unpacked DiziHayırSabit sayısalBellek, register dosyası
Dinamik DiziEvetSayısalSimülasyon zamanı tahsis
Associative DiziEvetHerhangi bir skalerAnahtar-değer eşlemeleri
Kuyruk (Queue)EvetOtomatik (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.

SystemVerilog Tasarım Serisi - This article is part of a series.
Part 9: This Article

Related

SystemVerilog Task ve Function Yapıları
· loading · loading
Donanım Tasarımı Doğrulama SystemVerilog Task Function RTL Tasarımı Testbench Yeniden Kullanılabilirlik
Donanım Tasarımı Doğrulama
SystemVerilog Döngüler ve Kontrol Akışı – for, while, foreach, repeat, break
· loading · loading
Donanım Tasarımı Doğrulama SystemVerilog Döngüler Kontrol Akışı Testbench RTL Tasarımı Break/Continue
Donanım Tasarımı Doğrulama
SystemVerilog Enum Veri Tipi
· loading · loading
Donanım Tasarımı Doğrulama SystemVerilog Enum Durum Makinesi RTL Tasarımı Testbench Hata Ayıklama
Donanım Tasarımı Doğrulama
SystemVerilog fork...join Yapısı – Paralel İşlem Mantığı
· loading · loading
Doğrulama SystemVerilog Fork Join Paralel İşlem Testbench Join_any Join_none
Doğrulama
SystemVerilog Interface – modport ve Clocking Block ile Modüler Bağlantı
· loading · loading
Donanım Tasarımı Doğrulama SystemVerilog Interface Modport Testbench RTL Tasarımı Bağlantı
Donanım Tasarımı Doğrulama
SystemVerilog Struct, Union ve Typedef Kullanımı – Kullanıcı Tanımlı Veri Tipleri
· loading · loading
Donanım Tasarımı Doğrulama SystemVerilog Struct Union Typedef Veri Modelleme RTL Tasarımı
Donanım Tasarımı Doğrulama