RV32I İşlemci Tasarımı ve Sanal Test Ortamı

Eğitim odaklı 5 aşamalı boru hatlı RISC-V (RV32I) işlemcisi — Verilog ile yazılmış, gerçek zamanlı görsel çıktı üretebilen ve saf Assembly ile programlanabilen tam bir donanım simülasyon platformu.

VerilogRISC-VAssemblySDL2Donanım Tasarımı
GitHub'da Gör
Audio Bars Demo Bouncing Square Demo

Genel Tanım

RV32I Core, RISC-V’in temel tamsayı komut setini (RV32I) gerçekleştiren bir donanım simülatörüdür. Daha çok eğitim amaçlı geliştirilmiştir. İşlemci mimarisini ve boru hattı kavramlarını teoride değil, çalışan bir sistem üzerinde incelemeye olanak tanır.

İşlemci Verilog ile yazılmış, Verilator ile yazılım ortamına derlenmiştir. SDL2 tabanlı görsel arayüz sayesinde işlemcinin VRAM’ine yazdığı her piksel ekranda anlık olarak görünür. Tüm demo uygulamaları saf RISC-V Assembly ile yazılmıştır.

Özellikler

  • 5 Aşamalı Pipeline — IF → ID → EX → MEM → WB aşamalarından oluşan klasik sıralı boru hattı. Her aşama bağımsız çalışır, birden fazla komut eş zamanlı işlenir.

  • Tehlike Yönetimi — Veri tehlikeleri yönlendirme (forwarding) ile, load-use durumları stall ile çözülür. Dal hatalarında boru hattı flush edilerek temizlenir.

  • Görsel Simülatör — 320×240 çözünürlükte bellek eşlemli VRAM (0x8000). SDL2 penceresi bu belleği gerçek zamanlı görüntüler; assembly programları doğrudan ekrana piksel çizer.

  • Assembly Kütüphanesi — Sözde komutlar (li, mv, push/pop), makrolar ve optimize matematiksel fonksiyonlar (mul, div, pow) içeren yeniden kullanılabilir lib katmanı.

  • Python Araç Zinciri — Özel bir assembler (.s → makine kodu), dalga formu analizörü ve performans izleyiciden oluşan geliştirme ortamı.

  • Test Altyapısı — Fonksiyonel test senaryoları ve rastgele komut üretici ile otomatik regresyon denetimi.

Testler & Performans

İşlemcinin doğruluğunu iki ayrı test paketi denetler. Aşağıdaki komutlar projenin kök dizininde çalıştırılır.

Fonksiyonel Testler

./runner.py test --functional

Tehlike senaryoları (forwarding, stall, flush), RV32I komut seti kapsamı ve matematik kütüphanesi testlerini içerir. Her test beklenen kayıt değerlerini ve bayrak durumlarını doğrular.

Fonksiyonel Testler — 18/18 PASS

Performans Testleri

./runner.py test --performance

Bellek erişim desenleri, aritmetik yoğunluklu algoritmalar ve matematik kütüphanesi kıyaslamalarını ölçer. Beklenen IPC, stall oranı ve toplam döngü sayıları referans değerlerle karşılaştırılır.

Performans Testleri — 12/12 PASS

Regresyon Raporu

./runner.py test --regression

Her iki test paketini birden çalıştırır ve 36 metriklik kapsamlı bir özet üretir. Herhangi bir değişiklikten sonra bu raporu kontrol etmek, beklenmedik performans gerileme veya doğruluk kaybını hızlıca tespit eder.

Regresyon Raporu — 36 metrik OK

İşlemcinin performansı yukarıdaki hazır testlerle gözlenebileceği gibi mevcut başka bir assembly kodu veya uygulama kodları da performans gözleme modunda çalıştırılabilir. Bunun için uygulamayı çalıştırdıktan sonra --perf bayrağı ekleyebiliriz. Örneğin aşağıdaki şekilde dream.s uygulamasını performans sayaçlarıyla beraber çalıştırarak uygulama kapanana kadarki istatistikleri toplayıp terminalde raporlayabiliriz:

./runner.py run apps/dream.s --perf
Dream Uygulama Performans Raporu

Demo Uygulamaları

Beş uygulama, tamamı saf RISC-V Assembly ile yazılmıştır. Her biri işlemcinin farklı bir kapasitesini — bellek bant genişliği, koordinat aritmetiği, kontrol akışı, fonksiyon çağrısı — stres altında sınar. Uygulamalar aşağıdaki şekilde çalıştırılır:

./runner.py run app/<uygulama_adı>.s

Colors

Tüm VRAM’i (320×240 piksel) tek bir renk değeriyle doldurur; her kare kırmızı → yeşil → mavi döngüsünde bir sonraki renk değerine geçer. Amaç basit: VRAM yazma bant genişliğini doğrulamak ve SW komutunun art arda doğru çalıştığını gözlemlemek.

Colors Demo

Audio Bars

Yüksekliği ve rengi çerçeveden çerçeveye sözde-rastgele değişen dikey çubuklar simüle eder. Döngü içi dal tahminleri ve yığın üzerinde parametre geçişi bu uygulamada yoğun biçimde kullanılır.

Not: Bu uygulamayı başlangıçta ARM Cortex-M0 için Mikroişlemci Sistemleri dersi projesi için geliştirmiştim. Sonradan bu işlemciye uyarladım.

Audio Bars Demo

Bouncing Square

25×25 piksellik bir kare, ekran sınırlarına çarptığında rengini değiştirerek sekmeye devam eder. Ekran yenileme kasıtlı olarak atlandığı için kare hareket izi bırakır. Fizik güncellemesi, sınır kontrolü ve çarpışma mantığı her kare hesaplanır.

Not: Bu uygulamayı da yine Mikroişlemci Dersi projesi için arkadaşlarım Fatih Siyah ve Kerem Şen tasarlamıştı. bu proje kapsamında RISC-V mimarisine uyarladım. Burada en başta bir kutunun çarpıp renk değiştirmesini amaçlamışlardı, ancak hata sonucu bir önceki kutuyu silmeyi unutunca hareket eden kutu ekranı boyamaya başlamıştı. En başta istenen davranışı olmamasına rağmen çok beğenmiştim bu özelliği, o yüzden bu haliyle ekledim. Son olarak, merak etmeyin bir süre bekleyince kutu tam köşeye çarpıyor :)

Bouncing Square Demo

XOR Patterns

Her pikselin rengi (X ^ Y) | frame_counter formülüyle hesaplanır. Koordinat bilgisi doğrudan renk verisine dönüşür; frame sayacı arttıkça desen kaymaya başlar. Tek bir mantıksal ifadenin nasıl karmaşık fraktal dokular oluşturabildiğini gösterir.

XOR Patterns Demo

Dream

Her R/G/B kanalının bağımsız aktığı, keskin renk sıçramalarını önlemek için üçgen dalga fonksiyonları kullanan bir plazma efekti. Performansı artırmak amacıyla 2×2 blok rendering uygulanır: her piksel yerine her 2×2 blok tek hesaplamayla doldurulur. Bu sayede çok sayıda aritmetik ve kontrol akışı talimatı aynı anda boru hattında ilerler.

Dream Demo