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,structgibi 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):
covergroupvecoverpointile "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,semaphoreveeventile 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 birinitialbloğu içinde mesaj basan bir demo görevi görür.bit fast_bit;veint counter;satırları 2-state tipleri gösterir.fast_bityalnızca0/1alır,counterise 32-bit işaretli (signed) bir tam sayıdır.logic flexible_wire;4-state bir tiptir vex/zdeğerlerini taşıyabilir. Yorumda belirtildiği gibi tek başına hemwirehemregyerine 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çin8*11bit ayrılır.string str_sv = "Merhaba Dunya";ise SystemVerilog'un yerleşikstringtipini kullanır; uzunluk yönetimi otomatik yapıldığı için çok daha kullanışlıdır.initial begin ... endbloğ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,counterveflexible_wiredeğişkenlerine değer atanır. Dikkat:flexible_wire = 1'bx;atamasılogictipinde geçerlidir; aynı değeribittipine atasak0'a dönüşürdü. $finish;simülasyonu sonlandırır.
Önemli Noktalar
- 2-state mi 4-state mi? Performans önemliyse ve
x/zgerekmiyorsa (örneğin testbench sayaçları)bit/intkullanın; donanım belirsizliğini modellemeniz gerektiğindelogickullanın. logictipi, Verilog'dakireg/wireikilemini 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
xveyazatanırsa değer sessizce0'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.
$displayiçindeki%b,%0d,%sgibi biçim belirteçleri tipe uygun seçilmelidir; örneğinstringiçin%s, işaretli sayı için%0dkullanılır.