EDA Playground'da Dene

Neden SystemVerilog?

Gün 1: SystemVerilog'a Giriş ve Veri Tipleri | Donanım doğrulamaya giriş ve SystemVerilog'un avantajları

Bu derste donanım doğrulamanın neden ayrı bir disiplin olduğunu ve SystemVerilog'un klasik Verilog'a kıyasla hangi yetenekleri masaya getirdiğini öğreneceğiz. Amaç, dilin ileride detaylandıracağımız özelliklerine "neden ihtiyaç duyuyoruz?" sorusuyla bir zemin oluşturmaktır.

Donanım Doğrulama ve SystemVerilog

Modern bir çip tasarımında, RTL (Register Transfer Level) kodunu yazmak işin yalnızca yarısıdır. Tasarımın gerçekten beklendiği gibi çalıştığını kanıtlamak, yani doğrulama (verification), çoğu projede mühendislik eforunun büyük bölümünü oluşturur. Klasik Verilog test yazmak için tasarlanmamıştır; bu nedenle büyük ve karmaşık tasarımlarda test üretmek, hataları yakalamak ve kapsamı ölçmek zorlaşır.

SystemVerilog, Verilog'un bir üst kümesidir (superset). Yani geçerli her Verilog kodu aynı zamanda geçerli bir SystemVerilog kodudur, ancak SystemVerilog üzerine doğrulamayı hedefleyen güçlü katmanlar ekler:

  • Zengin veri tipleri: bit, logic, int, enum, struct gibi tiplerle hem performans hem de okunabilirlik kazanılır.
  • Nesne Yönelimli Programlama (OOP): class, kalıtım (inheritance) ve polimorfizm ile yeniden kullanılabilir testbench bileşenleri kurulur.
  • Constrained Random Verification (CRV): Kısıtlı rastgele uyarımlarla, elle düşünülemeyecek köşe durumları (corner case) otomatik üretilir.
  • Fonksiyonel kapsam (Functional Coverage): covergroup ve coverpoint ile "neyi test ettiğimizi" ölçeriz.
  • SystemVerilog Assertions (SVA): Tasarımın zaman içindeki davranış kurallarını doğrudan ifade ederiz.
  • Süreçler arası iletişim (IPC): mailbox, semaphore ve event ile eşzamanlı (concurrent) bileşenler haberleşir.

2-State ve 4-State Tipler

SystemVerilog'un en temel ayrımlarından biri iki ve dört durumlu tiplerdir. 4-durumlu (4-state) tipler 0, 1, x (bilinmeyen) ve z (yüksek empedans) değerlerini taşıyabilir; bu, donanımdaki belirsizlikleri modellemek için gereklidir. 2-durumlu (2-state) tipler ise yalnızca 0 ve 1 taşır; x/z saklamadıkları için simülasyonda daha az bellek kullanır ve daha hızlı çalışırlar. Testbench tarafında çoğunlukla 2-state, tasarımı sürdüğümüz arayüzlerde ise 4-state tercih edilir.

Özellik 2-state (bit, int, byte...) 4-state (logic, reg, wire, integer)
Alabildiği değerler 0, 1 0, 1, x, z
Varsayılan başlangıç değeri 0 x
Bellek / hız Daha az bellek, daha hızlı Daha fazla bellek, daha yavaş
x veya z atanırsa Sessizce 0 olur Olduğu gibi saklanır
Tipik kullanım yeri Testbench sayaçları, indeksler, transaction alanları DUT sinyalleri, interface'ler, reset/başlatma kontrolü

Benzetme: Verilog'u sadece İngilizce bilen bir tercüman gibi düşünün; donanımı anlatabilir ama "bu tasarım doğru mu?" sorusunu sormak için kelime hazinesi yetersizdir. SystemVerilog aynı tercümana yazılım dünyasının kelimelerini (sınıf, rastgelelik, kapsam, assertion) öğretir. Donanımı anlatma yeteneği kaybolmaz, üstüne doğrulama dili eklenir.

Doğrulama Mühendisinin Günlük Hayatında Bu Özellikler Nerede?

Aşağıdaki tablo, bu kursta öğreneceğiniz her özelliğin gerçek bir testbench'te hangi soruna çözüm olduğunu özetler. Bu listeyi kursun yol haritası olarak düşünebilirsiniz:

İhtiyaç SystemVerilog yanıtı Kursta işlendiği yer
"Bir işlemi (adres, veri, komut) tek parça olarak taşımak istiyorum" struct, class Gün 1–2
"Aynı driver'ı farklı protokol varyantlarında kullanmak istiyorum" Kalıtım, virtual metodlar Gün 2
"Aklıma gelmeyen köşe durumları da test edilsin" rand, constraint, randomize() Gün 3
"Driver, monitor ve scoreboard aynı anda çalışsın" fork...join, mailbox, event Gün 4
"Testbench ile DUT arasındaki yarış koşullarını bitirmek istiyorum" interface, clocking block Gün 5
"Protokol kuralı ihlalini oluştuğu saatte yakalamak istiyorum" SystemVerilog Assertions (SVA) Gün 5
"Testi ne zaman bitireceğimi bilmek istiyorum" covergroup, coverpoint, cross Gün 5 ve 7

Kaynak Kod

// =============================================================================
// GUN 1 - Konu 1: Donanim Dogrulamaya Giris (Neden SystemVerilog?)
// =============================================================================
// SystemVerilog, Verilog'un uzerine insa edilmis guclu bir dogrulama ve
// tasarim dilidir. Dogrulama (verification) surecini hizlandirmak icin
// OOP, rastgele uretim, assertion ve coverage gibi ozellikler sunar.
// =============================================================================

module neden_systemverilog;

  // --- Verilog'da olmayan SystemVerilog Ozellikleri ---

  // 1. Iki-durumlu (2-state) veri tipleri - daha hizli simulasyon
  bit       fast_bit;       // 0 veya 1 (x/z yok)
  int       counter;        // 32-bit signed integer
  
  // 2. Dort-durumlu (4-state) yeni tip
  logic     flexible_wire;  // wire ve reg yerine tek tip
  
  reg [8*11-1:0] str = "Hello World"; // Verilog'ta stringler boyle saklaniyor
  
  string str_sv = "Merhaba Dunya";

  // 3. Dogrulama yapilari
  // - Siniflar (Classes) ile OOP
  // - Rastgele kisitlamalar (Constrained Random)
  // - Fonksiyonel kapsam (Functional Coverage)
  // - Assertions (SVA)
  // - Surecler arasi iletisim (IPC)

  initial begin
    $display("=========================================");
    $display(" Neden SystemVerilog?");
    $display("=========================================");
    $display("");
    $display(" Verilog Eksiklikleri:");
    $display("   - Sinirli veri tipleri (reg, wire, integer)");
    $display("   - OOP destegi yok");
    $display("   - Rastgele test uretimi zor");
    $display("   - Kapsam olcumu (coverage) yok");
    $display("");
    $display(" SystemVerilog Cozumleri:");
    $display("   - Zengin veri tipleri (logic, bit, int, enum, struct)");
    $display("   - Tam OOP destegi (class, inheritance, polymorphism)");
    $display("   - Constrained Random Verification (CRV)");
    $display("   - Fonksiyonel kapsam (covergroup, coverpoint)");
    $display("   - SystemVerilog Assertions (SVA)");
    $display("   - Surecler arasi iletisim (mailbox, semaphore, event)");
    $display("");

    // Basit bir ornek: SystemVerilog'un guclu tipleri
    fast_bit = 1;
    counter  = -42;
    flexible_wire = 1'bx;

    $display(" Ornek Degerler:");
    $display("   bit       = %0b", fast_bit);
    $display("   int       = %0d", counter);
    $display("   logic     = %b  (x/z destekler)", flexible_wire);
    $display("   string(verilog) = %s",str);
    $display("   string(SV) = %s",str_sv);
    $display("=========================================");
    $finish;
  end

endmodule

Kodun Açıklaması

  • module neden_systemverilog; ile tüm örneği saran bir modül tanımlanır. Burada herhangi bir port yoktur; modül yalnızca bir initial bloğu içinde mesaj basan bir demo görevi görür.
  • bit fast_bit; ve int counter; satırları 2-state tipleri gösterir. fast_bit yalnızca 0/1 alır, counter ise 32-bit işaretli (signed) bir tam sayıdır.
  • logic flexible_wire; 4-state bir tiptir ve x/z değerlerini taşıyabilir. Yorumda belirtildiği gibi tek başına hem wire hem reg yerine geçerek Verilog'daki ayrımı ortadan kaldırır.
  • reg [8*11-1:0] str = "Hello World"; satırı, Verilog'da bir karakter dizisinin nasıl ham bit vektörü olarak saklandığını gösterir: her karakter 8 bit olduğundan 11 karakter için 8*11 bit ayrılır.
  • string str_sv = "Merhaba Dunya"; ise SystemVerilog'un yerleşik string tipini kullanır; uzunluk yönetimi otomatik yapıldığı için çok daha kullanışlıdır.
  • initial begin ... end bloğu içinde $display çağrılarıyla önce Verilog'un eksiklikleri, ardından SystemVerilog'un çözümleri ekrana yazdırılır.
  • Bloğun sonunda fast_bit, counter ve flexible_wire değişkenlerine değer atanır. Dikkat: flexible_wire = 1'bx; ataması logic tipinde geçerlidir; aynı değeri bit tipine atasak 0'a dönüşürdü.
  • $finish; simülasyonu sonlandırır.

Önemli Noktalar

  • 2-state mi 4-state mi? Performans önemliyse ve x/z gerekmiyorsa (örneğin testbench sayaçları) bit/int kullanın; donanım belirsizliğini modellemeniz gerektiğinde logic kullanın.
  • logic tipi, Verilog'daki reg/wire ikilemini büyük ölçüde ortadan kaldırır; tek sürücülü sinyaller için modern ve önerilen seçimdir.
  • 2-state bir tipe x veya z atanırsa değer sessizce 0'a dönüşür. Bu, gerçek bir başlatılmamışlık hatasını gizleyebileceği için bilinçli kullanılmalıdır.
  • SystemVerilog, Verilog'un üst kümesi olduğundan mevcut Verilog kodunuzu kademeli olarak modernleştirebilirsiniz; her şeyi bir anda değiştirmek zorunda değilsiniz.
  • $display içindeki %b, %0d, %s gibi biçim belirteçleri tipe uygun seçilmelidir; örneğin string için %s, işaretli sayı için %0d kullanılır.
  • reg [8*11-1:0] str örneğinde "Hello World" tam 11 karakterdir. Vektör daha genişse boş kalan üst bitler 0 ile dolar; daha darsa karakterler soldan kesilir. string tipi bu tür hesapları tamamen ortadan kaldırır.

Sık Yapılan Hatalar

  • Reset'i görmek için bit kullanmak: Bir DUT çıkışını bit tipli bir değişkende örneklerseniz, çıkış aslında x olsa bile siz 0 görürsünüz ve "reset çalışıyor" sanırsınız. DUT'tan okunan sinyaller için logic kullanın.
  • integer ile int'i karıştırmak: İkisi de 32-bit işaretlidir ama integer 4-state, int 2-state'tir. Testbench sayaçlarında int tercih edin.
  • Her şeyi logic yapmak: Milyonlarca transaction üreten bir testbench'te 4-state tipler gereksiz bellek ve zaman harcar. Donanım belirsizliği taşımayan değişkenleri 2-state tutun.

Kendinizi Deneyin

  1. Koddaki bit fast_bit değişkenine 1'bz atayıp sonucu yazdırın. Ne gözlemlediniz, neden?
  2. str vektörünün genişliğini 8*5 yapıp "Hello World" atamayı deneyin. Hangi karakterler kayboldu? Bu davranış string tipinde neden yaşanmaz?
  3. $bits(str) ve str_sv.len() ifadelerini yazdırın. Birincisi bit, ikincisi karakter sayısı verir; aralarındaki oranı yorumlayın.
Hızlı Kontrol: 2-state bir değişkene x atandığında ne olur?

Değer sessizce 0'a dönüşür; herhangi bir uyarı üretilmez. Bu yüzden başlatılmamış bir sinyali yakalamak istediğiniz yerlerde (DUT çıkışları, reset sırasında okunan değerler) daima 4-state logic kullanmalısınız.