EDA Playground'da Dene

Veri Tipleri

Gün 1: SystemVerilog'a Giriş ve Veri Tipleri | logic, bit, byte, int ve diğer SystemVerilog veri tipleri

Bu derste SystemVerilog'un yerleşik veri tiplerini; durum sayısı (2-state / 4-state), işaret (signed / unsigned), bit genişliği ve varsayılan başlangıç değerleri açısından inceleyeceğiz.

4-State ve 2-State Tipler

SystemVerilog tipleri taşıyabildikleri değerlere göre iki gruba ayrılır:

  • 4-state tipler (logic): 0, 1, x (bilinmeyen) ve z (yüksek empedans) değerlerini taşır. Donanım davranışını ve başlatılmamış sinyalleri gerçekçi modeller. Varsayılan başlangıç değerleri x'tir.
  • 2-state tipler (bit, byte, shortint, int, longint): yalnızca 0 ve 1 taşır. Daha az bellek kullanır, simülasyonu hızlandırır. Varsayılan değerleri 0'dır. Bir 2-state değişkene x/z atanırsa değer 0'a dönüşür.

İşaretli, İşaretsiz ve Genişlik

Önceden tanımlı tiplerin çoğu signed (işaretli) ve sabit genişliklidir:

  • byte → 8-bit signed, aralık [-128, 127]
  • shortint → 16-bit signed
  • int → 32-bit signed
  • longint → 64-bit signed

İşaretsiz davranış için int unsigned gibi varyantlar ya da bit [7:0] gibi vektörler kullanılır. Gerçek sayılar için real (64-bit, IEEE 754 double) ve shortreal (32-bit, IEEE 754 float) bulunur. Bir tipin bit genişliğini öğrenmek için $bits() sistem fonksiyonu kullanılır.

Kaynak Kod

// =============================================================================
// GUN 1 - Konu 3: Yeni Veri Tipleri: logic, bit, byte, int
// =============================================================================

module veri_tipleri;

  // ---- 4-STATE (Dort Durumlu) Tipler: 0, 1, x, z ----
  logic        l_single;         // 1-bit, x/z destekler
  logic [7:0]  l_byte;           // 8-bit logic
  logic [31:0] l_word;           // 32-bit logic
  
  // ---- 2-STATE (Iki Durumlu) Tipler: sadece 0, 1 ----
  bit          b_single;         // 1-bit, daha hizli simulasyon
  bit [7:0]    b_byte;           // 8-bit bit
  
  // ---- Onceden Tanimli 2-State Tipler ----
  byte         signed_byte;      // 8-bit signed  [-128, 127]
  shortint     signed_short;     // 16-bit signed [-32768, 32767]
  int          signed_int;       // 32-bit signed
  longint      signed_long;      // 64-bit signed
  
  // ---- Unsigned Varyantlar ----
  bit [7:0]    unsigned_byte;    // byte unsigned karsiligi
  int unsigned uint_val;         // 32-bit unsigned

  // ---- Gercek Sayilar ----
  real         real_val;         // 64-bit IEEE 754 double
  shortreal    short_real;       // 32-bit IEEE 754 float

  // ---- Void ----
  // void tipi fonksiyon donus degeri olarak kullanilir

  initial begin
    $display("=== SystemVerilog Veri Tipleri ===\n");

    // --- 4-state vs 2-state farki ---
    l_single = 1'bx;
    b_single = 1'bx;  // x atanir ama 0 olarak saklanir (2-state)
    $display("4-state logic = %b (x destekler)", l_single);
    $display("2-state bit   = %b (x -> 0 donusur)\n", b_single);

    // --- Signed tipler ---
    signed_byte = -100;
    signed_int  = -2_000_000;  // Alt cizgi okunabilirlik icin
    $display("byte    = %0d (8-bit signed)", signed_byte);
    $display("int     = %0d (32-bit signed)", signed_int);

    // --- Unsigned ---
    uint_val = 4_000_000_000;
    $display("int unsigned = %0d\n", uint_val);

    // --- Boyut bilgileri ---
    $display("Tip Boyutlari (bit cinsinden):");
    $display("  byte     = %0d bit", $bits(signed_byte));
    $display("  shortint = %0d bit", $bits(signed_short));
    $display("  int      = %0d bit", $bits(signed_int));
    $display("  longint  = %0d bit", $bits(signed_long));
    $display("  real     = %0d bit", $bits(real_val));

    // --- Otomatik baslatma ---
    $display("\nVarsayilan baslangic degerleri:");
    $display("  logic varsayilan = %b (x)", l_byte);
    $display("  bit   varsayilan = %b (0)", b_byte);
    $display("  int   varsayilan = %0d (0)", signed_int);

    $display("\n=== Veri Tipleri Sonu ===");
    $finish;
  end

endmodule

Kodun Açıklaması

  • Modülün başında tipler kategorilere ayrılmıştır: 4-state (l_single, l_byte, l_word), 2-state (b_single, b_byte), önceden tanımlı signed tipler (signed_byte, signed_short, signed_int, signed_long), unsigned varyantlar (unsigned_byte, uint_val) ve gerçek sayılar (real_val, short_real).
  • l_single = 1'bx; ve b_single = 1'bx; satırları kritik farkı gösterir: l_single x olarak basılırken, 2-state olan b_single aynı atamada 0'a dönüşür.
  • signed_byte = -100; ve signed_int = -2_000_000; işaretli tipleri gösterir. Sayıdaki alt çizgiler (_) yalnızca okunabilirlik içindir, değeri etkilemez.
  • uint_val = 4_000_000_000; değeri 32-bit signed bir int'e sığmazdı; int unsigned olduğu için doğru saklanır.
  • $bits(signed_byte), $bits(signed_short) gibi çağrılar her tipin bit genişliğini döndürür (sırasıyla 8, 16, 32, 64 ve real için 64).
  • Sonda varsayılan başlangıç değerleri yazdırılır: l_byte (logic) x, b_byte (bit) 0 ve signed_int (int) 0 olarak başlar.

Önemli Noktalar

  • Performans/doğruluk dengesi: Testbench içi sayaç ve indeksler için 2-state (int, bit) hızlıdır; donanım sinyallerinde başlatılmamışlığı yakalamak için 4-state (logic) gerekir.
  • 2-state tiplere x/z atanırsa sessizce 0'a dönüşür; bu yüzden hata ayıklarken x görmek istiyorsanız logic kullanın.
  • Sabit genişlikli tipleri (byte, shortint, int, longint) tercih edin; bu genişlik bağımlılığını açık hale getirir ve taşma (overflow) davranışını öngörülebilir kılar.
  • İşaret önemliyse tipi bilinçli seçin: int signed'dır, işaretsiz değer için int unsigned ya da uygun genişlikte bit [N-1:0] kullanın.
  • Büyük sabitlerde alt çizgi (_) ayırıcısını kullanmak okunabilirliği artırır ve değeri değiştirmez.
  • Bir tipin genişliğinden emin değilseniz $bits() ile doğrulayın; bu, parametrik kodda özellikle yararlıdır.
  • uint_val = 4_000_000_000; ataması çalışır ama dikkat: boyutsuz bir ondalık sabit (4_000_000_000) SystemVerilog'da işaretli 32-bit olarak yorumlanır ve bu değer 32-bit işaretli aralığı aşar. Çoğu simülatör uyarı verir ve bit deseni korunduğu için int unsigned değişkende doğru sayı görünür. Taşınabilir kod için sabitin genişliğini açıkça yazın: 32'd4_000_000_000.

Tipler Bir Bakışta

Tip Genişlik Durum İşaret Varsayılan Tipik kullanım
bit 1 (vektör olabilir) 2-state unsigned 0 Bayraklar, testbench vektörleri
logic 1 (vektör olabilir) 4-state unsigned x DUT sinyalleri, interface portları
byte 8 2-state signed 0 Küçük sayaçlar, karakter/bayt verisi
shortint 16 2-state signed 0 Orta boy sayaçlar
int 32 2-state signed 0 Genel amaçlı tam sayı
longint 64 2-state signed 0 Zaman damgaları, büyük sayaçlar
integer 32 4-state signed x Eski Verilog kodu ile uyumluluk
time 64 4-state unsigned x $time saklamak
real 64 — — 0.0 Analog/istatistik hesapları
shortreal 32 — — 0.0 Hafıza kritik gerçek sayılar

Benzetme: 2-state tipleri tek yönlü bir anahtar (açık/kapalı), 4-state tipleri ise üzerinde "bilinmiyor" ve "bağlı değil" ışıkları da olan bir gösterge paneli gibi düşünün. Panel daha çok bilgi verir ama daha pahalıdır; her yere panel koymazsınız.

Sık Yapılan Hatalar

  • İşaretli/işaretsiz karşılaştırma tuzağı: int a = -1; bit [7:0] b = 5; if (a < b) ifadesi, karışık işaretli/işaretsiz işlemde her iki taraf işaretsiz yorumlandığı için beklenmedik şekilde yanlış (0) sonuç verebilir. Karşılaştırmalarda tipleri eşleştirin veya $signed()/$unsigned() ile niyeti açık yazın.
  • byte ile 0–255 saklamaya çalışmak: byte işaretlidir; 200 değeri -56 olarak görünür. Bayt verisi için bit [7:0] veya byte unsigned tercih edin.
  • real değişkeni %0d ile yazdırmak: Gerçek sayılar için %f, %g ya da %e kullanılmalıdır; aksi halde çıktı anlamsız olur.

Kendinizi Deneyin

  1. byte signed_byte = 127; yapıp signed_byte++ ile artırın ve yazdırın. Taşma (overflow) sonucunu açıklayın.
  2. logic [3:0] l = 4'b10xz; tanımlayıp hem %b hem %h ile yazdırın. Hex gösterimde x/z nasıl temsil edildi?
  3. int a = -1; bit [7:0] b = 5; tanımlayıp a < b karşılaştırmasının sonucunu yazdırın; ardından $signed(b) ile tekrarlayın. Sonuç neden değişti?
Hızlı Kontrol: logic ve bit arasındaki en kritik fark nedir?

logic 4-state'tir (0, 1, x, z) ve varsayılan değeri x'tir; bit 2-state'tir ve varsayılan değeri 0'dır. DUT'un başlatılmamış bir çıkışını yakalamak için logic, testbench'in kendi sayaçları için bit/int kullanın.