Cœur de racine carrée entière 16 bits

  • VHDL
  • GHDL
  • Quartus

Étude de cas

Cœur de racine carrée entière 16 bits. Un petit cœur VHDL synthétisable calculant floor(sqrt(X)) pour une entrée non signée de 16 bits, vérifié exhaustivement sur toutes les entrées possibles et préparé pour un portage Terasic DE1.

Contexte et défi

L’objectif était un petit projet de conception numérique et FPGA autonome : un cœur de racine carrée entière 16 bits non signée synthétisable, avec une véritable histoire de vérification exhaustive plutôt qu’un échantillonnage, et une intégration FPGA propre autour de lui.

Périmètre et responsabilités

Le cœur, ses testbenches et l’intégration DE1 sont le travail de Mehdi Bouama. Le cœur calcule floor(sqrt(X)) en résultat 8 bits à partir d’une entrée non signée 16 bits, selon une architecture itérative bit à bit de type restoring, décalage-et-soustraction : chacune des 8 itérations de calcul forme une valeur d’essai pour le prochain bit de racine et teste une soustraction candidate, en conservant le nouveau reste si elle est acceptée et le reste précédent sinon, du bit de racine le plus significatif au moins significatif.

Architecture / Conception du système

L’interface suit un protocole simple d’acceptation puis d’impulsion : X_in est capturé lorsque start est accepté à l’état idle, les changements ultérieurs de X_in n’affectent pas le calcul en cours, et done s’active une période d’horloge lorsque le résultat est valide. Un start levé pendant le calcul est ignoré ; s’il reste haut, il est accepté à nouveau une fois le cœur revenu à idle. Sur le wrapper DE1, une transition montante sur SW9 est convertie en une impulsion unique pour éviter les lancements répétés au niveau carte.

Mise en œuvre

La commande sur la carte Terasic DE1 (Cyclone II EP2C20F484C7, CLOCK_50 à 50 MHz) utilise SW7:0 pour la valeur d’octet, SW8 pour sélectionner l’octet bas ou haut, SW9 comme commande de lancement, KEY0 comme reset actif bas, un indicateur d’achèvement LEDR0 verrouillé (verrouillé car done ne dure qu’une période d’horloge, sans anti-rebond mécanique complet sur SW9), et HEX2-HEX0 pour le résultat décimal.

Vérification et preuves

La suite de tests GHDL permanente couvre des cas dirigés de frontière et des cas arithmétiques représentatifs, la latence exacte de résultat et d’achèvement, le reset asynchrone (y compris pendant le calcul), la capture d’entrée à l’acceptation d’un start, les starts ignorés pendant le calcul, le comportement d’un start maintenu haut, les transactions successives, la protection contre les méta-valeurs, et, de façon exhaustive, 65536 vecteurs entrées 16 bits possibles face à un modèle de référence indépendant de recherche binaire entière, délibérément structuré différemment de la récurrence restoring propre au cœur. Le résultat : vrai.

La latence est architecturale, pas une mesure physique : à partir d’un start accepté, le résultat et done sont affirmés après 9 périodes d'horloge, ce qui correspond à 180 ns au 50 MHz nominal du DE1 – un décompte de périodes d’horloge confirmé par simulation, pas un résultat physique de timing fermé.

L’intégration DE1 est préparée et revue statiquement : vrai.

La version historique de ce cœur, issue du projet universitaire, est documentée séparément de cet état du wrapper actuel. sqrt16.vhd a fonctionné sur une DE1 physique lors du projet : le projet Quartus historique a abouti à Analysis & Synthesis et au Fitter, TimeQuest a été exécuté, et des fichiers de programmation existent. Le rapport du TP consigne les observations sur carte 9 -> 3, 25 -> 5 et 256 -> 16, ainsi que le comportement de la LED done. Le cœur historique est identique octet pour octet au cœur épinglé par cette étude de cas, mais le wrapper historique n’est pas le wrapper public actuel : la validation sur matériel du wrapper actuel n’est donc pas établie. TimeQuest a été exécuté à l’époque ; aucune fermeture de timing, fermeture à 50 MHz ni Fmax validé n’est revendiqué.

  • Exécution historique du TP de sqrt16 sur DE1: Mesuré, Carte FPGA, Version historique du TP de sqrt16 sur DE1 physique (wrapper d'origine du TP); à l'exclusion de Exécution sur matériel du wrapper public actuel, Vérification matérielle exhaustive des 65 536 entrées, Fermeture de timing et Fmax

    vrai

    • Provenance enregistrée — source non publique
    • Provenance enregistrée — source non publique
  • Flot de compilation Quartus historique du TP: Validé par la source, Revue statique de la source, Flot de compilation Quartus historique du TP (Analysis & Synthesis, Fitter, étape TimeQuest exécutée); à l'exclusion de Exécution sur matériel du wrapper public actuel, Fermeture de timing et Fmax

    • Provenance enregistrée — source non publique
  • Fichiers de programmation Quartus historiques du TP: Préparé, Carte FPGA, Fichiers de programmation Quartus historiques du TP (.sof/.pof); à l'exclusion de Exécution sur matériel du wrapper public actuel, Fermeture de timing et Fmax

    • Provenance enregistrée — source non publique
    • Provenance enregistrée — source non publique

Résultats

Le balayage exhaustif de toutes les entrées 16 bits possibles se termine sans aucun écart, et la latence fixe de 9 périodes d’horloge est confirmée par les vérifications de protocole du testbench. Aucun Fmax, résultat de fermeture de timing ou autre métrique d’implémentation physique n’est revendiqué ; au moment de la revue de la révision du code source référencée par cette étude de cas, son workflow GitHub Actions n’avait pas encore été exécuté, et aucun résultat de CI n’est attribué à cette révision référencée.

Limites

Il s’agit d’une implémentation volontairement compacte : pas de pipeline, pas de racine carrée flottante, pas d’entrées signées, pas de largeur d’opérande paramétrable, pas d’interface AXI ou Wishbone, et pas d’anti-rebond mécanique complet sur le wrapper DE1. Pour le wrapper public actuel, les résultats de Quartus Analysis & Synthesis, du Fitter, de l’Assembler et de TimeQuest ainsi que les tests sur matériel DE1 physique ne sont pas établis ; l’exécution historique sur DE1 décrite ci-dessus ne s’y étend pas, et aucune fermeture de timing n’est revendiquée.

Points clés à retenir

Un balayage exhaustif de 65 536 entrées est assez petit pour être véritablement exhaustif et non simplement volumineux, et construire le modèle de référence comme une recherche binaire indépendante – plutôt qu’un miroir de la propre récurrence restoring du DUT – est ce qui rend ce balayage réellement significatif plutôt qu’auto-validant. La même rigueur s’est prolongée côté DE1 : énoncer clairement ce que les vérifications de synthèse au niveau GHDL établissent, et n’établissent pas, plutôt que laisser une compilation locale réussie suggérer davantage qu’elle ne prouve.

Livrables / Références

Dépôt public : github.com/mahdidou711/vhdl-integer-sqrt.