Recherche séquentielle et multiplicateur

  • VHDL
  • GHDL
  • Quartus

Étude de cas

Recherche séquentielle et multiplicateur. Deux petites conceptions VHDL séquentielles autonomes – searchx, un moteur de recherche séquentielle sur une table fixe, et mult_shift_add, un multiplicateur itératif shift-add 8x8 non signé – chacune vérifiée par un testbench GHDL à latence déterministe et packagée en démo Terasic DE1 minimale.

Contexte et défi

Les deux conceptions sont issues d’un projet universitaire FPGA, puis ont été nettoyées, dotées de testbenches à latence déterministe, et packagées en un petit projet portfolio reproductible partageant un même thème architectural : un traitement séquentiel simple piloté par FSM (IDLE / état de travail / DONE), des entrées de transaction registrées (« capturées ») pour qu’un changement ultérieur sur les ports d’entrée ne puisse pas corrompre une transaction en cours, et aucun raccourci combinatoire.

Périmètre et responsabilités

La provenance diffère entre les deux cœurs. searchx – son RTL, sa vérification, son intégration FPGA, sa CI et sa documentation – est le travail de Mehdi Bouama. Le RTL de mult_shift_add a été écrit à l’origine par un autre étudiant sur le même projet et est inclus dans ce dépôt avec son accord ; la contribution de Mehdi Bouama sur ce bloc porte sur sa vérification exhaustive, son intégration FPGA, sa CI et sa documentation, pas sa conception d’origine.

Architecture / Conception du système

searchx recherche dans une table fixe et codée en dur de 16 constantes 8 bits distinctes : une FSM (IDLE -> SEARCH -> DONE) capture la valeur recherchée sur le cycle d’acceptation, puis compare exactement une entrée de table par cycle d’horloge en état SEARCH, exposant un index trouvé ou un indicateur d’absence. mult_shift_add est un multiplicateur shift-add 8x8 non signé classique : chacun des 8 cycles CALC ajoute conditionnellement le multiplicande capturé au produit partiel en cours lorsque le bit de poids faible du multiplicateur courant vaut 1, puis décale d’un bit vers la droite le registre combiné et le multiplicateur capturé.

Mise en œuvre

Les deux cœurs partagent la même discipline de capture à l’acceptation : la valeur de recherche de searchx et les opérandes de mult_shift_add sont registrés au cycle où une transaction est acceptée, si bien que des changements ultérieurs sur ces ports d’entrée ne peuvent pas affecter une transaction en cours. Deux projets Quartus DE1 indépendants et minimaux packagent chaque cœur via un wrapper de glue de carte léger, sans top-level partagé ni périphérique inutilisé : le wrapper du multiplicateur expose SW(7:0)/SW(8)/SW(9) pour la saisie des opérandes et le lancement, et HEX0..HEX3 pour le produit 16 bits ; le wrapper de recherche expose SW(7:0)/SW9 pour la valeur recherchée et debut, et LEDR(3:0)/LEDG(0)/LEDG(1) pour l’index, l’achèvement et l’absence de résultat.

Vérification et preuves

Le testbench de searchx vérifie les 16 positions de la table avec leur latence exacte attendue, plusieurs cas de valeur absente, un debut maintenu ou impulsionnel, un reset asynchrone en cours de recherche, et un test de capture qui modifie l’entrée de recherche immédiatement après l’acceptation pour confirmer que le cœur se termine bien sur la valeur capturée : vrai. Le testbench de mult_shift_add couvre des produits dirigés, la latence exacte de 8 itérations, le comportement de capture des opérandes et le reset en cours de calcul, ainsi qu’un balayage exhaustif des 65 536 combinaisons d’opérandes 8x8 non signés, qui se termine sans aucun écart par rapport au produit attendu.

L’intégration DE1 des deux cœurs est préparée et revue statiquement : vrai. La CI de ce dépôt a déjà été exécutée : vrai.

L’expérience matérielle historique du projet universitaire est documentée séparément des wrappers publics actuels. Pour le multiplicateur, le cœur mult_shift_add a fonctionné sur une carte Terasic DE1 physique : le projet Quartus historique a abouti à Analysis & Synthesis et au Fitter, TimeQuest a été exécuté, des fichiers de programmation existent, et une photo conservée est compatible avec 13 x 11 = 143 = 0x008F. Ce cœur historique est identique octet pour octet au cœur épinglé, mais le top-level historique n’est pas le wrapper public actuel, qui n’est pas validé sur matériel. Pour le cœur de recherche, une version historique a été testée sur DE1 physique d’après le rapport du TP et une implémentation Quartus historique existe ; cette version précède la correction actuelle de capture de transaction X_reg, de sorte que la version actuelle de la recherche n’est pas validée de façon indépendante sur carte.

  • Exécution historique du TP de mult_shift_add sur DE1: Mesuré, Carte FPGA, Cœur mult_shift_add historique du TP sur DE1 physique (wrapper d'origine du TP ; photo conservée compatible avec 13 x 11 = 143 = 0x008F); à l'exclusion de Exécution sur matériel des wrappers publics actuels, Vérification matérielle exhaustive, Fermeture de timing et Fmax

    vrai

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

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

    • Provenance enregistrée — source non publique
    • Provenance enregistrée — source non publique
    • Provenance enregistrée — source non publique
  • Test historique du TP de searchx sur DE1 (avant la correction X_reg): Mesuré, Carte FPGA, Version historique du TP de searchx sur DE1 physique (avant la correction actuelle de capture de transaction X_reg); à l'exclusion de Exécution sur matériel de la version actuelle de la recherche (avec la correction de capture X_reg), Exécution sur matériel des wrappers publics actuels, Fermeture de timing et Fmax

    vrai

    • Provenance enregistrée — source non publique
  • Flot de compilation Quartus historique du cœur de recherche: Validé par la source, Revue statique de la source, Flot de compilation Quartus historique du cœur de recherche (avant la correction actuelle de capture de transaction X_reg ; Analysis & Synthesis, Fitter, étape TimeQuest exécutée); à l'exclusion de Exécution sur matériel de la version actuelle de la recherche (avec la correction de capture X_reg), Fermeture de timing et Fmax

    • Provenance enregistrée — source non publique
  • Fichiers de programmation Quartus historiques du cœur de recherche: Préparé, Carte FPGA, Fichiers de programmation Quartus historiques du cœur de recherche (avant la correction actuelle de capture de transaction X_reg ; .sof/.pof); à l'exclusion de Exécution sur matériel de la version actuelle de la recherche (avec la correction de capture X_reg), Fermeture de timing et Fmax

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

Résultats

searchx se termine avec sa latence cycle-exacte vérifiée sur chaque position de table et chaque cas de valeur absente, et mult_shift_add termine son balayage exhaustif des 65 536 combinaisons d’opérandes 8x8 non signés sans aucun écart par rapport au produit attendu.

Aucun Fmax, résultat de fermeture de timing ou autre métrique d’implémentation physique n’est revendiqué, et aucune validation sur matériel n’est revendiquée pour les wrappers publics actuels ni pour la version actuelle de la recherche.

Limites

Les deux cœurs sont volontairement petits : un multiplicateur 8x8 non signé à largeur fixe sans support signé ni largeur paramétrable, une table de recherche fixe à 16 entrées plutôt qu’une mémoire paramétrable, aucun protocole de bus autour de l’un ou l’autre cœur, aucun pipeline, et aucune logique d’anti-rebond ou de synchronisation sur les wrappers DE1 au-delà de ce qui est mentionné ci-dessus. Pour les wrappers publics actuels, les résultats de Quartus Analysis & Synthesis, du Fitter, de l’Assembler et de TimeQuest ne sont pas établis et aucune fermeture de timing n’est revendiquée ; l’expérience matérielle historique décrite ci-dessus ne s’y étend pas. Aucune licence n’est actuellement fournie pour la couche d’intégration FPGA du dépôt, en attendant la résolution de la provenance de son matériel fournisseur.

Points clés à retenir

Packager de façon responsable le RTL d’un tiers a demandé d’être explicite sur les parties du dépôt attribuables à chaque auteur, et d’appliquer la même rigueur de vérification exhaustive à du RTL hérité qu’à du RTL nouvellement écrit, plutôt que de lui faire confiance par défaut. Construire les deux cœurs autour du même motif de FSM à capture sur acceptation a aussi rendu les testbenches à latence déterministe réutilisables dans leur forme, bien que les deux cœurs résolvent des problèmes sans rapport.

Livrables / Références

Dépôt public : github.com/mahdidou711/vhdl-search-multiplier.