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.
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.
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.
İş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
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.
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.
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 :)
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.
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.