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.