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.

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.