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.