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) vez(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ğerlerix'tir. - 2-state tipler (
bit,byte,shortint,int,longint): yalnızca0ve1taşır. Daha az bellek kullanır, simülasyonu hızlandırır. Varsayılan değerleri0'dır. Bir 2-state değişkenex/zatanırsa değer0'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 signedint→ 32-bit signedlongint→ 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;veb_single = 1'bx;satırları kritik farkı gösterir:l_singlexolarak basılırken, 2-state olanb_singleaynı atamada0'a dönüşür.signed_byte = -100;vesigned_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 birint'e sığmazdı;int unsignedolduğ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 verealiçin 64).- Sonda varsayılan başlangıç değerleri yazdırılır:
l_byte(logic)x,b_byte(bit)0vesigned_int(int)0olarak 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/zatanırsa sessizce0'a dönüşür; bu yüzden hata ayıklarkenxgörmek istiyorsanızlogickullanı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:
intsigned'dır, işaretsiz değer içinint unsignedya da uygun genişliktebit [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çinint unsigneddeğ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. byteile 0–255 saklamaya çalışmak:byteişaretlidir;200değeri-56olarak görünür. Bayt verisi içinbit [7:0]veyabyte unsignedtercih edin.realdeğişkeni%0dile yazdırmak: Gerçek sayılar için%f,%gya da%ekullanılmalıdır; aksi halde çıktı anlamsız olur.
Kendinizi Deneyin
byte signed_byte = 127;yapıpsigned_byte++ile artırın ve yazdırın. Taşma (overflow) sonucunu açıklayın.logic [3:0] l = 4'b10xz;tanımlayıp hem%bhem%hile yazdırın. Hex gösterimdex/znasıl temsil edildi?int a = -1; bit [7:0] b = 5;tanımlayıpa < bkarşı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.