Architecture du cœur out-of-order

Fursoy Slice-1 (fursoy_s1_core) est un processeur superscalaire 2‑wide qui effectue le fetch, le décodage, le renommage de registres et la retraite de façon in‑order. Le Reorder Buffer compte 128 entrées, chaque entrée étant marquée par un tag d’époque de 4 bits garantissant une récupération sans ambiguïté en cas d’interruption. Le registre physique entier (PRF) possède 160 entrées, dont 128 sont disponibles dans la free‑list spéculative, ce qui limite le risque de stalling lors de la renumérotation. Quatre files d’émission dédiées (32 entrées pour les entiers, 32 pour la mémoire, 64 pour les registres flottants et 8 pour le vecteur) permettent une distribution parallèle des micro‑opérations, tandis que l’unité arithmétique utilise un réseau Kogge‑Stone à 64 bits pour une exécution en un cycle et un multiplicateur à trois étages pour les opérations lourdes. Le diviseur matériel complète la chaîne d’exécution, évitant les micro‑code loops.

Mémoire virtuelle Sv39 et caches non‑bloquants

Le système de traduction d’adresses repose sur une architecture Sv39 à deux ports. Le DTLB comporte 64 entrées, 4‑way set‑associative, complétées par un CAM de superpages (8 entrées couvrant 2 MiB et 1 GiB) et une table de requêtes de traduction de 32 entrées. L’ITLB possède la même structure, assurant une cohérence entre instruction et donnée. Le PTW partagé parcourt les tables de pages Sv39 tout en maintenant la cohérence avec le cache L1D grâce à un snoop de dirty non destructif, ce qui élimine les évictions inutiles lors de mises à jour de tables. Le cache L1I de 16 KiB (4‑way, 64 sets) est VIPT‑safe et intègre un préfetcher de ligne suivante, tandis que le L1D de même capacité est organisé en 8 banques (PA[5:3]), non‑bloquant, avec 16 entrées de Load Queue, 16 de Store Queue, 4 MSHR et un buffer d’écriture de 2 entrées. Cette configuration minimise les latences de miss tout en supportant les accès simultanés de plusieurs flux.

Synthèse physique et performances cibles

La synthèse a été réalisée avec Yosys 0.33, sv2v 0.0.13 et OpenSTA 3.1.0 sur la NangateOpenCellLibrary (45 nm, 1.10 V, 25 °C). Les huit blocs fonctionnels du cœur occupent un total de 175 106.74 µm², ce qui correspond à environ 220 k NAND2_X1. Le flux de synthèse cible une fréquence de 500 MHz (période de 2.000 ns) sans recourir encore à la place‑and‑route complète du SoC ni aux macros SRAM. Le choix d’une technologie standard‑cell permet d’évaluer rapidement la densité et le timing, tout en laissant la marge d’optimisation pour les interconnexions du cross‑bar.

Validation logicielle et métriques de simulation

Le processeur a été exécuté sous Verilator pendant 89 861 075 cycles, durant lesquels 76 236 390 instructions ont été retirées, dont 2 227 761 commits en mode U. Le taux d’instructions par cycle (IPC) mesuré est de 0.84838, avec zéro erreur de conservation du CPI, aucune panique du noyau Linux 6.6.50 et aucun oops. Les tests incluent la création répétée de processus, le stress mémoire multi‑largeur et la validation du support des interruptions (WFI, MRET/SRET). Le script d’installation suivant illustre la chaîne d’outils :

sudo apt-get update
sudo apt-get install -y \
  verilator g++ python3 device-tree-compiler \
  gcc-riscv64-unknown-elf gcc-riscv64-linux-gnu

Ces résultats démontrent que le cœur atteint les objectifs de performance et de compatibilité logicielle tout en conservant une architecture modulaire adaptée à une future intégration SoC.