Chapitre 2 — Introduction aux langages de description matérielle
Présentation du chapitre
Un langage de description matérielle permet de représenter un circuit numérique sous une forme textuelle exploitable par des outils de simulation et de synthèse. Cette représentation ne décrit pas seulement une suite d’actions : elle exprime des ressources matérielles, leurs connexions, leur synchronisation et les opérations qu’elles réalisent en parallèle. Ce chapitre introduit la notion de HDL, présente les langages VHDL, Verilog et SystemVerilog, explique les différences fondamentales entre un programme logiciel et une description matérielle, puis détaille le cycle complet de développement d’un système numérique sur FPGA.
Objectif général Comprendre comment une spécification fonctionnelle devient une architecture matérielle simulée, synthétisée, implantée puis validée sur une carte FPGA. |
Objectifs pédagogiques
- Définir un langage de description matérielle et expliquer son rôle dans la conception numérique.
- Distinguer une description structurelle d’une description comportementale.
- Expliquer les fonctions de la simulation et de la synthèse.
- Présenter les caractéristiques essentielles de VHDL, Verilog et SystemVerilog.
- Comparer l’exécution séquentielle d’un programme et le fonctionnement concurrent d’un circuit.
- Décrire toutes les étapes du cycle de développement d’un système numérique sur FPGA.
- Créer, compiler et simuler une première description VHDL.
Compétences visées
- Lire l’interface d’un composant décrit en VHDL.
- Associer une instruction HDL à une fonction matérielle probable.
- Identifier les parties simulables, synthétisables et non synthétisables d’un projet.
- Interpréter les messages d’analyse syntaxique et les chronogrammes de simulation.
- Choisir une chaîne d’outils adaptée à une activité d’apprentissage ou à un projet FPGA.
Sommaire du chapitre
1. 2.1 Définition d’un HDL
2. 2.2 Principaux langages HDL
3. 2.3 Programme logiciel et description matérielle
4. 2.4 Cycle de développement d’un système numérique
5. Travaux pratiques : premier projet et simulation d’une porte logique
6. Synthèse, autoévaluation et glossaire
Idée directrice Une description HDL est un modèle de matériel. Les lignes écrites dans le fichier source sont interprétées comme des circuits pouvant fonctionner simultanément, et non comme une liste d’instructions exécutées une à une par défaut. |
2.1 Définition d’un HDL
2.1.1 Qu’est-ce qu’un langage de description matérielle ?
L’acronyme HDL signifie Hardware Description Language, c’est-à-dire langage de description matérielle. Un HDL est un langage formel destiné à décrire l’organisation, le comportement et le fonctionnement temporel d’un circuit électronique numérique. Il permet de représenter aussi bien une porte logique élémentaire qu’un processeur, un contrôleur de communication, un filtre numérique ou un système complet intégré dans un FPGA.
Un fichier HDL constitue un modèle du circuit. Ce modèle peut être analysé par un simulateur afin d’en vérifier le comportement, puis par un outil de synthèse afin d’en déduire une architecture composée de portes, de bascules, de multiplexeurs, de mémoires et d’autres ressources disponibles dans la technologie cible.
Description matérielle : représentation textuelle d’un circuit, de ses interfaces, de ses ressources internes et de leurs relations.
Modèle : abstraction suffisamment précise pour prévoir le comportement du circuit sans le construire immédiatement.
Technologie cible : famille de composants dans laquelle la description doit être implantée, par exemple un FPGA particulier ou une bibliothèque de cellules ASIC.
Pourquoi ne pas dessiner uniquement des schémas ?
Les schémas logiques restent utiles pour comprendre une architecture ou documenter un bloc. Toutefois, ils deviennent difficiles à produire, à modifier et à vérifier lorsque le nombre de signaux augmente. Une description textuelle apporte une meilleure modularité, facilite la réutilisation et permet d’automatiser les tests. Elle peut également être versionnée, comparée et intégrée dans une chaîne de développement collaborative.
Critère | Schéma logique | Description HDL |
|---|---|---|
| Lisibilité | Très bonne pour un petit circuit | Bonne si le code est structuré et documenté |
| Évolution | Modifications manuelles parfois longues | Paramétrage et réutilisation facilités |
| Vérification | Inspection visuelle et simulation éventuelle | Simulation automatisable et assertions possibles |
| Taille du projet | Peu adapté aux architectures très complexes | Adapté aux projets hiérarchiques de grande taille |
| Gestion des versions | Comparaison graphique délicate | Comparaison ligne par ligne et historique des modifications |
| Portabilité | Dépend souvent de l’outil de dessin | Possible entre outils si les normes sont respectées |
2.1.2 Rôle d’un langage de description matérielle
Le HDL sert de langage commun entre la spécification fonctionnelle et la réalisation physique. Il formalise ce que le circuit doit faire, précise ses interfaces et fournit aux outils les informations nécessaires à la vérification et à l’implémentation.
- Décrire les entrées, les sorties et les paramètres d’un composant.
- Exprimer les relations logiques et arithmétiques entre les signaux.
- Décrire les éléments mémorisants et leur synchronisation par une horloge.
- Construire une architecture hiérarchique à partir de sous-composants.
- Créer des modèles destinés à la simulation fonctionnelle ou temporelle.
- Fournir une description synthétisable pouvant devenir un circuit réel.
- Documenter de manière non ambiguë les choix d’architecture.
Point de vigilance Un code HDL syntaxiquement correct n’est pas nécessairement synthétisable. Certaines constructions servent uniquement à la simulation, par exemple la génération de stimuli avec des retards explicites. |
2.1.3 Représentation d’un circuit numérique
La représentation d’un circuit repose sur plusieurs niveaux d’abstraction. Plus le niveau est élevé, plus le concepteur décrit la fonction globale sans détailler chaque porte. Plus le niveau est bas, plus la description se rapproche des ressources matérielles élémentaires. Le choix du niveau dépend de l’objectif : compréhension, simulation rapide, synthèse, optimisation ou description d’un composant technologique précis.
Niveau | Éléments décrits | Exemple | Utilité principale |
|---|---|---|---|
| Système | Fonctions et échanges entre grands sous-systèmes | Chaîne acquisition–traitement–communication | Architecture générale et partitionnement |
| Comportemental | Résultat attendu en fonction des entrées et de l’état | Algorithme de contrôle ou machine à états | Modélisation fonctionnelle |
| RTL | Transferts entre registres et logique combinatoire | Registre, compteur, UAL, multiplexeur | Synthèse numérique courante |
| Portes | Portes logiques et bascules interconnectées | Netlist de cellules | Analyse après synthèse |
| Physique | Placement, routage et délais réels | Ressources FPGA placées | Implémentation et analyse temporelle |
L’interface : la frontière du composant
Avant de décrire le fonctionnement interne, il faut définir l’interface du composant. En VHDL, cette interface est déclarée dans une entité. Les ports indiquent les noms des signaux, leur direction et leur type. Cette séparation permet de modifier l’architecture interne sans nécessairement changer les blocs qui utilisent le composant.
|
2.1.4 Description de la structure et du comportement
Description structurelle
Une description structurelle indique de quels sous-composants le circuit est constitué et comment ils sont connectés. Elle correspond à une vue d’assemblage. Chaque instance représente un bloc matériel distinct. Cette approche est adaptée à la conception hiérarchique, à la réutilisation de composants et à la représentation explicite d’une architecture.
- Déclaration ou référence des sous-composants.
- Création d’instances distinctes.
- Connexion des ports par des signaux internes.
- Organisation hiérarchique du système.
|
Description comportementale
Une description comportementale exprime la fonction réalisée sans imposer directement l’assemblage détaillé des portes. Le concepteur décrit la relation entre les entrées, l’état interne et les sorties. L’outil de synthèse choisit ensuite une structure équivalente compatible avec les contraintes et la technologie cible.
|
Description par flot de données
Le style par flot de données met l’accent sur les transformations appliquées aux signaux. Il utilise souvent des affectations concurrentes et convient particulièrement aux circuits combinatoires. Dans la pratique, les styles structurel, comportemental et par flot de données peuvent coexister dans un même projet.
Style | Question principale | Avantage | Limite |
|---|---|---|---|
| Structurel | Quels blocs et quelles connexions ? | Architecture explicite et réutilisable | Verbeux pour une fonction simple |
| Comportemental | Quel comportement doit être obtenu ? | Description compacte et proche de la spécification | Structure finale moins visible dans le code |
| Flot de données | Comment les signaux sont-ils transformés ? | Très lisible pour les équations combinatoires | Moins adapté aux contrôleurs complexes |
2.1.5 Simulation
La simulation exécute le modèle HDL dans un environnement logiciel afin d’observer son comportement au cours du temps. Elle ne crée pas encore le circuit physique. Le simulateur calcule les changements de signaux, respecte les événements et affiche généralement les résultats sous forme de chronogrammes.
Démarche de simulation fonctionnelle
1 | Préparer le composant et son banc de test |
↓ | |
2 | Analyser puis élaborer les unités VHDL |
↓ | |
3 | Lancer la simulation et appliquer les stimuli |
↓ | |
4 | Observer les chronogrammes et les messages |
↓ | |
5 | Corriger le modèle ou le test jusqu’à validation |
Éléments d’une simulation
- Le composant à tester, souvent appelé DUT, pour Design Under Test.
- Un banc de test qui génère les entrées et définit les scénarios.
- Un modèle du temps permettant de représenter l’horloge, les événements et certains retards.
- Des observations ou assertions permettant de comparer les sorties aux résultats attendus.
- Un chronogramme pour visualiser les valeurs des signaux dans le temps.
Simulation fonctionnelle et simulation temporelle
Aspect | Simulation fonctionnelle | Simulation temporelle |
|---|---|---|
| Objectif | Vérifier la logique et les séquences | Vérifier le comportement avec les délais physiques |
| Moment | Avant ou après synthèse | Après synthèse ou après placement-routage |
| Délais | Souvent idéalisés | Délais issus de la technologie et du routage |
| Vitesse | Généralement rapide | Plus lente et plus détaillée |
| Défauts détectés | Erreur fonctionnelle, mauvaise transition, cas oublié | Violation de temps, propagation excessive, problème d’horloge |
2.1.6 Synthèse
La synthèse transforme une description HDL synthétisable en une représentation matérielle appelée netlist. Cette netlist contient des éléments logiques et leurs connexions. Pour un FPGA, l’outil cherche à utiliser les LUT, les bascules, les mémoires, les blocs DSP et les autres ressources disponibles dans la famille sélectionnée.
Transformation réalisée par l’outil de synthèse
1 | Lire la description HDL et les paramètres |
↓ | |
2 | Construire une représentation interne du circuit |
↓ | |
3 | Déduire les opérateurs, registres, mémoires et multiplexeurs |
↓ | |
4 | Optimiser la logique tout en conservant le comportement |
↓ | |
5 | Mapper les fonctions sur les ressources de la technologie cible |
↓ | |
6 | Produire une netlist et un rapport de synthèse |
Notion de code synthétisable
Une construction est synthétisable lorsqu’un outil peut lui associer une réalisation matérielle finie et déterminée. Par exemple, une affectation logique peut devenir une LUT, une condition dans un processus cadencé peut devenir une logique de commande autour de bascules, et un tableau correctement décrit peut être implanté dans une mémoire interne.
Construction | Simulation | Synthèse habituelle | Interprétation |
|---|---|---|---|
| Affectation logique | Oui | Oui | Logique combinatoire |
| Processus avec front d’horloge | Oui | Oui | Bascules ou registres |
| Boucle à bornes statiques | Oui | Souvent oui | Réplication ou organisation de matériel |
| Retard explicite after | Oui | Généralement non | Modélisation temporelle, pas une ressource logique portable |
| Lecture d’un fichier de stimuli | Oui | Généralement non | Fonction du banc de test |
| Attente non liée à une horloge | Oui | Limitée ou non | À réserver principalement à la simulation |
Simulation correcte ≠ matériel correct La simulation valide le modèle testé. La synthèse et l’implémentation peuvent révéler d’autres problèmes : ressources insuffisantes, chemins trop lents, signaux non contraints ou différences entre une construction simulable et son équivalent matériel. |
2.2 Principaux langages HDL
Plusieurs langages sont utilisés pour décrire et vérifier les circuits numériques. VHDL et Verilog sont les deux langages HDL historiques les plus répandus. SystemVerilog étend Verilog avec des mécanismes de conception et surtout de vérification plus riches. Le choix dépend de la culture de l’équipe, des outils, des bibliothèques existantes et des exigences du projet.
2.2.1 VHDL
VHDL signifie VHSIC Hardware Description Language. C’est un langage fortement typé, structuré autour d’unités de conception clairement séparées. Une entité définit l’interface d’un composant et une ou plusieurs architectures peuvent en décrire le fonctionnement. Les paquetages regroupent des types, constantes, fonctions et procédures réutilisables.
Caractéristiques de VHDL
- Typage fort permettant de détecter de nombreuses incohérences dès l’analyse.
- Syntaxe explicite et adaptée aux projets fortement documentés.
- Séparation claire entre interface et architecture.
- Gestion naturelle de la concurrence et des processus.
- Possibilité de définir des types complexes et des paquetages.
- Normalisation permettant une bonne portabilité lorsque les bibliothèques standards sont utilisées.
|
Le typage de VHDL oblige le concepteur à préciser la nature des signaux et à effectuer des conversions explicites lorsque les représentations diffèrent. Cette rigueur peut produire davantage de lignes, mais elle améliore la lisibilité des interfaces et réduit certaines erreurs silencieuses.
2.2.2 Verilog
Verilog utilise une syntaxe plus concise, historiquement proche de celle du langage C. Un module regroupe l’interface et le comportement. Les affectations continues décrivent la logique combinatoire, tandis que les blocs procéduraux permettent d’exprimer des comportements combinatoires ou séquentiels.
Caractéristiques de Verilog
- Syntaxe compacte et généralement rapide à apprendre pour une personne connaissant le langage C.
- Description des interfaces et du comportement dans un module.
- Large utilisation dans la conception de circuits intégrés et dans de nombreuses bibliothèques industrielles.
- Typage historiquement moins strict que VHDL, ce qui exige une attention particulière aux largeurs et aux signes.
- Support des descriptions structurelles, comportementales et RTL.
|
2.2.3 SystemVerilog
SystemVerilog est une extension majeure de Verilog. Il améliore la description RTL avec des types plus riches et des constructions explicites, telles que les blocs combinatoires et séquentiels dédiés. Il ajoute aussi des fonctions avancées de vérification : assertions, interfaces, classes, contraintes aléatoires et mécanismes de couverture.
- Types logiques et structures de données plus expressifs.
- Blocs always_comb, always_ff et always_latch clarifiant l’intention du concepteur.
- Interfaces facilitant le regroupement de signaux associés.
- Assertions pour exprimer et vérifier des propriétés temporelles.
- Fonctionnalités orientées objet utilisées dans les environnements de vérification.
- Base de méthodologies industrielles de vérification, notamment les environnements à composants réutilisables.
|
2.2.4 Comparaison générale entre VHDL et Verilog
Critère | VHDL | Verilog |
|---|---|---|
| Style syntaxique | Verbeux, explicite et proche d’un langage de spécification | Compact et proche du style C |
| Typage | Fort et strict | Plus permissif dans sa forme historique |
| Interface | Entité séparée de l’architecture | Interface intégrée au module |
| Réutilisation | Paquetages, génériques, types définis | Paramètres, fonctions, includes et modules |
| Concurrence | Instructions concurrentes et processus | Affectations continues et blocs procéduraux |
| Lisibilité | Très explicite pour les interfaces complexes | Très compacte pour les blocs RTL courants |
| Erreurs de largeur | Souvent signalées grâce au typage | Peuvent nécessiter une discipline accrue |
| Domaines d’usage | Formation, FPGA, aéronautique, défense et nombreux projets industriels | ASIC, FPGA et écosystèmes industriels variés |
| Normes modernes | VHDL-2008 apporte plusieurs simplifications | SystemVerilog prolonge et enrichit Verilog |
Même fonction, deux écritures
Les deux exemples suivants décrivent un multiplexeur à deux entrées. Malgré des syntaxes différentes, la synthèse doit produire une fonction matérielle équivalente.
|
|
Comment choisir un langage ?
Il n’existe pas de langage universellement supérieur. Pour un nouveau projet, le choix doit être cohérent avec les compétences de l’équipe, la chaîne d’outils, les composants réutilisables, les exigences de certification et la stratégie de vérification. Dans un cours consacré à VHDL, l’objectif est d’acquérir des principes de conception qui restent largement transférables aux autres HDL.
Situation | Choix raisonnable |
|---|---|
| Formation nécessitant une forte rigueur de typage | VHDL |
| Projet réutilisant une importante bibliothèque VHDL | VHDL |
| Équipe maîtrisant Verilog et chaîne de vérification associée | Verilog ou SystemVerilog |
| Vérification avancée avec assertions et environnement orienté objet | SystemVerilog |
| Projet mixte avec composants tiers | Langage principal de l’équipe et simulation multilangage si l’outil le permet |
2.3 Programme logiciel et description matérielle
La principale difficulté pour un débutant consiste à ne pas interpréter le VHDL comme un langage de programmation classique. Un programme logiciel fournit des instructions à un processeur existant. Une description matérielle définit au contraire les ressources et les connexions qui réaliseront les opérations. Cette différence modifie la manière de raisonner sur l’ordre d’exécution, le temps, les données et les performances.
2.3.1 Exécution séquentielle d’un programme
Dans un modèle logiciel simple, un processeur lit une instruction, la décode puis l’exécute avant de passer à la suivante. Les opérations semblent donc se dérouler selon l’ordre écrit. Les systèmes modernes utilisent des mécanismes internes de parallélisme, mais le programmeur conserve généralement un modèle d’exécution séquentiel pour chaque fil d’exécution.
|
Le temps d’exécution dépend du nombre d’instructions, de l’architecture du processeur, de sa fréquence, des accès mémoire et du système d’exploitation éventuel. Une même unité arithmétique peut être utilisée successivement pour plusieurs opérations.
2.3.2 Fonctionnement parallèle d’un circuit
Dans un circuit, plusieurs ressources physiques peuvent travailler au même instant. Une porte ET ne doit pas attendre qu’une autre porte OU ait terminé une instruction indépendante : chaque bloc réagit aux variations de ses entrées. De même, plusieurs registres peuvent mémoriser leurs valeurs sur le même front d’horloge.
|
Conséquence essentielle Échanger l’ordre de deux affectations concurrentes indépendantes ne change normalement pas le circuit obtenu. En revanche, l’ordre des instructions à l’intérieur d’un processus peut avoir une signification séquentielle pour la simulation de ce processus. |
2.3.3 Instructions logicielles et composants matériels
Écriture ou notion | Interprétation logicielle | Interprétation matérielle probable |
|---|---|---|
| Addition | Instruction exécutée par une unité arithmétique du processeur | Additionneur combinatoire ou bloc DSP |
| Condition | Choix du prochain chemin d’instructions | Multiplexeur, comparateur et logique de commande |
| Variable persistante | Emplacement en mémoire | Registre, mémoire distribuée ou bloc RAM |
| Boucle | Répétition dans le temps | Réplication de matériel ou contrôleur séquentiel selon la description |
| Fonction | Code appelé pendant l’exécution | Logique combinatoire réutilisée ou dupliquée selon le contexte |
| Délai | Attente gérée par le logiciel ou le système | Compteur d’horloge, protocole ou contrainte temporelle |
Exemple : une condition devient un multiplexeur
|
Exemple : un front d’horloge devient un registre
|
2.3.4 Notion de concurrence
La concurrence signifie que plusieurs instructions ou processus représentent des blocs actifs simultanément. Chaque instruction concurrente peut dépendre de signaux produits par d’autres blocs. Le simulateur organise les événements afin de calculer une évolution cohérente de tous les signaux.
Concurrence entre processus
|
Concurrence ne signifie pas absence d’ordre temporel
Un circuit parallèle reste soumis à la causalité et aux délais de propagation. Une sortie ne peut prendre une nouvelle valeur qu’après la modification des entrées et la propagation à travers la logique. Dans une conception synchrone, l’horloge impose des instants communs de mémorisation, tandis que la logique combinatoire calcule les valeurs entre deux fronts.
Fonctionnement simplifié d’un système synchrone
1 | Un front d’horloge met à jour les registres |
↓ | |
2 | Les nouvelles valeurs se propagent dans la logique combinatoire |
↓ | |
3 | Les résultats se stabilisent avant le front suivant |
↓ | |
4 | Le front suivant mémorise les nouveaux résultats |
2.3.5 Impact du matériel sur la conception
Le code HDL n’est pas indépendant des ressources. Chaque opération possède un coût en surface, en délai et en consommation. Une multiplication peut utiliser un bloc DSP ou une importante quantité de logique. Un grand tableau peut nécessiter une mémoire interne. Une division entière générale peut devenir un circuit coûteux. Le concepteur doit donc connaître les conséquences matérielles des choix d’écriture.
Principales contraintes
- Surface : nombre de LUT, bascules, mémoires, DSP et entrées-sorties utilisés.
- Fréquence maximale : vitesse à laquelle le circuit peut fonctionner sans violation temporelle.
- Latence : nombre de cycles ou temps écoulé entre l’entrée et la sortie correspondante.
- Débit : quantité de données pouvant être traitée par unité de temps.
- Consommation : énergie dynamique due aux commutations et consommation statique du composant.
- Précision : largeur des données, représentation signée ou non signée, virgule fixe ou flottante.
- Testabilité : possibilité d’observer, de stimuler et de vérifier les blocs.
Compromis entre parallélisme et partage de ressources
Approche | Ressources | Débit | Latence | Complexité de commande |
|---|---|---|---|---|
| Deux opérateurs en parallèle | Plus élevées | Élevé | Faible à modérée | Faible |
| Un opérateur partagé dans le temps | Réduites | Plus faible | Plus élevée | Plus importante |
| Architecture pipeline | Registres supplémentaires | Très élevé après remplissage | Plusieurs cycles | Modérée |
Exemple conceptuel : duplication ou partage
|
|
Règles de raisonnement recommandées
1. Identifier les données qui doivent être mémorisées et celles qui peuvent rester combinatoires.
2. Déterminer quelles opérations doivent réellement être simultanées.
3. Estimer la largeur de chaque signal avant d’écrire les expressions arithmétiques.
4. Associer chaque construction à une ressource matérielle probable.
5. Prévoir l’horloge, le reset, les validations et les interfaces dès l’architecture initiale.
6. Vérifier après synthèse que le matériel inféré correspond à l’intention.
2.4 Cycle de développement d’un système numérique
Le développement FPGA est un processus itératif. Chaque étape produit des résultats qui peuvent conduire à revenir sur la spécification, l’architecture ou le code. La réussite ne consiste pas seulement à obtenir une compilation sans erreur : le système doit respecter sa fonction, ses contraintes temporelles, ses ressources et son comportement réel sur la carte.
Cycle principal de conception
1 | Spécification |
↓ | |
2 | Description VHDL |
↓ | |
3 | Analyse syntaxique |
↓ | |
4 | Élaboration |
↓ | |
5 | Simulation fonctionnelle |
↓ | |
6 | Synthèse |
↓ | |
7 | Placement et routage |
↓ | |
8 | Analyse temporelle |
↓ | |
9 | Génération du fichier de configuration |
↓ | |
10 | Programmation du FPGA |
↓ | |
11 | Validation sur la carte |
2.4.1 Spécification
La spécification décrit ce que le système doit réaliser, dans quelles conditions et avec quelles performances. Elle doit être vérifiable. Une formulation vague telle que « le système doit être rapide » doit être remplacée par une exigence mesurable : fréquence d’échantillonnage, latence maximale, débit minimal ou fréquence d’horloge visée.
Contenu d’une spécification utile
- Fonctions attendues et cas de fonctionnement.
- Liste des entrées, sorties et protocoles.
- Format, largeur et cadence des données.
- Horloges, resets et conditions d’initialisation.
- Contraintes de débit, de latence et de précision.
- Comportement en cas d’erreur ou d’entrée invalide.
- Ressources ou composants imposés.
- Critères d’acceptation et scénarios de test.
Bonne pratique Associer à chaque exigence un test prévu. Cette traçabilité évite de terminer la conception sans pouvoir démontrer que le cahier des charges est respecté. |
2.4.2 Description VHDL
La description VHDL traduit l’architecture retenue en unités de conception. Le projet est généralement décomposé en composants simples : interface, chemin de données, contrôleur, mémoires et blocs de communication. Chaque bloc doit avoir un rôle précis et une interface stable.
- Créer les entités et définir les ports.
- Choisir les types de signaux et leurs largeurs.
- Décrire la logique combinatoire et séquentielle.
- Instancier les sous-composants dans une architecture hiérarchique.
- Ajouter des génériques pour les paramètres réutilisables.
- Documenter les hypothèses d’horloge, de reset et de protocole.
|
2.4.3 Analyse syntaxique
L’analyse syntaxique vérifie que le texte respecte la grammaire du langage et que les identificateurs, types, bibliothèques et unités référencées sont cohérents. Cette étape détecte les parenthèses manquantes, les mots-clés incorrects, les incompatibilités de types et les références inconnues.
Type d’erreur | Exemple de cause | Méthode de correction |
|---|---|---|
| Syntaxe | Point-virgule ou end manquant | Lire la première erreur signalée et vérifier le bloc concerné |
| Nom inconnu | Signal mal orthographié ou unité absente | Comparer la déclaration et l’utilisation |
| Type incompatible | Mélange entre vecteur logique et valeur numérique | Employer les bons types et conversions |
| Bibliothèque absente | Paquetage non importé | Ajouter les clauses library et use nécessaires |
| Largeur incompatible | Affectation de vecteurs de tailles différentes | Redimensionner explicitement ou corriger l’interface |
2.4.4 Élaboration
L’élaboration construit l’instance complète du modèle à partir de l’entité de plus haut niveau. L’outil résout les génériques, relie les architectures, instancie les sous-composants et crée la hiérarchie qui sera simulée ou synthétisée. Une unité peut être syntaxiquement correcte mais échouer à l’élaboration si un composant manque ou si les ports ne correspondent pas.
- Choix de l’entité de niveau supérieur.
- Association des architectures aux entités.
- Évaluation des génériques et constantes statiques.
- Création des instances et vérification des associations de ports.
- Construction de la hiérarchie finale du modèle.
2.4.5 Simulation fonctionnelle
La simulation fonctionnelle vérifie le comportement logique sans dépendre du placement physique final. Le banc de test applique des combinaisons d’entrées, des séquences temporelles et des cas limites. Les sorties sont observées ou comparées automatiquement aux valeurs attendues.
Stratégie de test
1. Tester les valeurs nominales les plus simples.
2. Tester les valeurs limites et les changements proches des fronts d’horloge.
3. Tester chaque branche conditionnelle et chaque transition d’état.
4. Tester les resets, activations et situations d’erreur.
5. Automatiser les comparaisons par des assertions lorsque cela est possible.
6. Conserver les tests afin d’éviter les régressions lors des modifications.
2.4.6 Synthèse
Après validation fonctionnelle, l’outil de synthèse infère les ressources et optimise la logique. Le rapport de synthèse fournit des informations essentielles : nombres de LUT, bascules, mémoires et DSP, avertissements, horloges détectées et schémas RTL. Il faut vérifier ce rapport plutôt que de considérer la fin de la synthèse comme une validation automatique.
Élément du rapport | Question à se poser |
|---|---|
| Ressources utilisées | L’utilisation est-elle cohérente avec la fonction ? |
| Latches inférés | Sont-ils intentionnels ou dus à une affectation combinatoire incomplète ? |
| Horloges détectées | Toutes les horloges sont-elles prévues et contraintes ? |
| Signaux supprimés | Le circuit a-t-il été optimisé parce qu’une sortie n’est pas connectée ? |
| Multiplicateurs et mémoires | Les blocs spécialisés attendus ont-ils été utilisés ? |
| Avertissements | Indiquent-ils une ambiguïté fonctionnelle ou seulement une information maîtrisée ? |
2.4.7 Placement et routage
Le placement associe chaque ressource logique de la netlist à une ressource physique du FPGA. Le routage choisit les interconnexions permettant de relier ces ressources. Ces décisions influencent les délais, la consommation et parfois la possibilité même d’implanter le projet.
- Placement des LUT, bascules, mémoires et DSP.
- Affectation des entrées-sorties aux broches physiques.
- Utilisation des réseaux dédiés à l’horloge.
- Routage des signaux et estimation des délais.
- Résolution des congestions et optimisation des chemins critiques.
2.4.8 Analyse temporelle
L’analyse temporelle vérifie que les données ont suffisamment de temps pour se propager entre deux éléments séquentiels et qu’elles respectent les contraintes de setup et de hold. Elle s’appuie sur les contraintes d’horloge et sur les délais calculés après placement-routage.
Chemin critique : chemin dont le délai limite la fréquence maximale du circuit.
Slack : marge entre le temps disponible et le temps nécessaire ; une marge négative indique généralement une contrainte non respectée.
Setup : durée pendant laquelle la donnée doit être stable avant le front actif de l’horloge.
Hold : durée pendant laquelle la donnée doit rester stable après le front actif.
Erreur fréquente Une simulation fonctionnelle parfaite ne garantit pas le respect des contraintes temporelles. Sans contrainte d’horloge correcte, l’outil ne peut pas vérifier sérieusement la fréquence souhaitée. |
2.4.9 Génération du fichier de configuration
Lorsque l’implémentation est valide, l’outil génère un fichier de configuration contenant les informations nécessaires pour configurer les ressources du FPGA. Le nom et le format du fichier dépendent du constructeur et du mode de programmation. Ce fichier n’est pas un programme exécutable par un processeur : il définit l’état des éléments configurables du composant.
2.4.10 Programmation du FPGA
La programmation transfère le fichier de configuration vers le FPGA ou vers une mémoire de configuration associée. Une configuration directement chargée dans le FPGA est souvent volatile : elle disparaît à la coupure de l’alimentation. Une mémoire externe non volatile peut être utilisée pour recharger automatiquement la configuration au démarrage.
- Connecter la carte et vérifier son alimentation.
- Sélectionner l’interface de programmation appropriée.
- Détecter le composant dans l’outil.
- Choisir le fichier de configuration généré.
- Lancer le transfert et vérifier l’état de fin.
2.4.11 Validation sur la carte
La validation matérielle confronte la conception au fonctionnement réel des boutons, LED, horloges, capteurs et interfaces. Elle peut révéler des défauts absents du banc de test : rebond des boutons, polarité inversée, broche mal affectée, niveau électrique incorrect, entrée asynchrone ou hypothèse erronée sur la fréquence de l’oscillateur.
Plan de validation
1. Vérifier les alimentations, l’horloge et les contraintes de broches.
2. Tester un comportement simple permettant de confirmer la programmation.
3. Valider chaque interface indépendamment avant le système complet.
4. Comparer les observations avec les scénarios du banc de test.
5. Ajouter des signaux de diagnostic ou un analyseur logique embarqué si nécessaire.
6. Documenter les écarts, les corrections et la configuration utilisée.
Boucles d’itération
Le cycle n’est pas strictement linéaire. Une erreur de simulation impose de modifier le code ou le test. Une utilisation excessive des ressources peut nécessiter une nouvelle architecture. Une violation temporelle peut conduire à ajouter des registres de pipeline, réduire la profondeur logique ou modifier les contraintes. Un problème sur la carte peut révéler une spécification incomplète.
Problème observé | Étape de retour probable | Action typique |
|---|---|---|
| Sortie logique incorrecte | Description ou spécification | Corriger l’équation, le processus ou le cas de test |
| Unité introuvable | Analyse/élaboration | Corriger la hiérarchie, la bibliothèque ou l’ordre de compilation |
| Trop de ressources | Architecture | Partager certaines ressources ou réduire la largeur des données |
| Fréquence non atteinte | RTL ou contraintes | Ajouter du pipeline, réduire le chemin critique, corriger les contraintes |
| Carte sans réaction | Programmation ou contraintes de broches | Vérifier le fichier, le composant, l’horloge et les E/S |
| Comportement instable | Interface matérielle | Synchroniser les entrées et traiter le rebond |
Travaux pratiques — Premier environnement VHDL
Ce travail pratique conduit l’étudiant depuis l’installation ou l’ouverture d’un environnement de développement jusqu’à la simulation complète d’une porte logique. Deux types de chaînes peuvent être utilisés : un environnement fourni par un constructeur de FPGA, ou une chaîne libre composée d’un analyseur-simulateur et d’un visualiseur de chronogrammes.
Objectifs du TP
- Identifier les principales zones de l’environnement de développement.
- Créer un projet et choisir l’unité de niveau supérieur.
- Écrire une entité et une architecture VHDL simples.
- Analyser et élaborer le projet.
- Créer un banc de test et générer des stimuli.
- Lancer une simulation et interpréter un chronogramme.
- Diagnostiquer des erreurs courantes de compilation.
Matériel et logiciels possibles
Option | Éléments | Usage |
|---|---|---|
| Environnement constructeur | Vivado, Quartus Prime ou environnement équivalent | Projet FPGA complet, synthèse et programmation |
| Chaîne libre | GHDL et GTKWave | Analyse VHDL, simulation et chronogrammes |
| Environnement en ligne | Éditeur et simulateur HDL dans un navigateur | Découverte rapide sans installation locale |
| Éditeur de texte | Visual Studio Code ou éditeur équivalent | Écriture du code avec coloration syntaxique |
Organisation des fichiers Créer un dossier dédié au TP. Utiliser des noms simples, sans espaces ni caractères accentués pour les fichiers et unités VHDL. Conserver le composant et le banc de test dans des fichiers distincts. |
TP 2.1 — Installation et découverte de l’environnement
Étape 1 — Vérifier l’installation
- Ouvrir l’environnement choisi et identifier sa version.
- Vérifier que le simulateur VHDL est disponible.
- Dans un environnement constructeur, vérifier que la famille de FPGA visée est installée.
- Dans une chaîne en ligne de commande, vérifier que les exécutables sont accessibles.
|
Étape 2 — Repérer les fonctions principales
Zone ou commande | Rôle |
|---|---|
| Explorateur du projet | Afficher les fichiers sources et la hiérarchie |
| Éditeur | Écrire et corriger le code VHDL |
| Console ou messages | Afficher les erreurs, avertissements et informations |
| Lancement de simulation | Analyser, élaborer et exécuter le modèle |
| Fenêtre de chronogrammes | Observer les signaux dans le temps |
| Outils de synthèse | Produire une représentation matérielle et des rapports |
Questions de découverte
1. Où apparaît la liste des fichiers VHDL du projet ?
2. Comment sélectionner l’entité de niveau supérieur ?
3. Où sont affichées les erreurs de compilation ?
4. Comment ajouter un signal à la fenêtre de chronogrammes ?
5. Quelle commande permet de relancer la simulation après une modification ?
TP 2.2 — Création d’un premier projet
Étape 1 — Créer la structure
1. Créer un nouveau projet nommé tp_porte_et.
2. Choisir VHDL comme langage principal lorsque l’outil demande une préférence.
3. Créer un fichier nommé porte_et.vhd.
4. Définir porte_et comme entité de niveau supérieur pour la conception.
5. Créer ensuite un fichier séparé nommé tb_porte_et.vhd pour la simulation.
Étape 2 — Saisir le composant
|
Lecture guidée du code
Élément | Signification |
|---|---|
| library IEEE | Rend visible la bibliothèque normalisée IEEE |
| use IEEE.STD_LOGIC_1164.ALL | Importe les déclarations du type std_logic et des opérateurs logiques associés |
| entity porte_et | Définit l’interface du composant |
| a, b : in | Déclare deux entrées logiques |
| y : out | Déclare une sortie logique |
| architecture rtl | Commence la description interne |
| y <= a and b | Décrit l’équation logique de la porte ET |
TP 2.3 — Analyse et compilation
Procédure dans un environnement graphique
1. Enregistrer le fichier.
2. Lancer l’analyse ou la compilation du fichier VHDL.
3. Lire tous les messages et corriger d’abord la première erreur réelle.
4. Vérifier que l’entité porte_et apparaît dans la hiérarchie.
5. Lancer l’élaboration si l’outil sépare cette étape de l’analyse.
Procédure possible avec GHDL
|
Exercice de diagnostic
Introduire volontairement une erreur à la fois, lancer l’analyse, noter le message puis corriger le fichier. Les erreurs proposées permettent d’apprendre à lire la console sans modifier plusieurs éléments simultanément.
1. Supprimer le point-virgule après la déclaration du port y.
2. Écrire std_logc au lieu de std_logic.
3. Remplacer le nom b dans l’équation par un nom non déclaré.
4. Supprimer la clause use IEEE.STD_LOGIC_1164.ALL.
TP 2.4 — Création du banc de test
Le banc de test ne possède pas de ports externes. Il déclare des signaux internes, instancie le composant à tester et applique successivement toutes les combinaisons des deux entrées.
|
|
Analyse du banc de test
- L’entité du banc de test est vide car le modèle n’échange pas de signaux avec l’extérieur.
- Les signaux a, b et y relient le générateur de stimuli au composant testé.
- DUT est une instance de l’entité porte_et.
- Le processus STIMULI applique les quatre combinaisons binaires possibles.
- L’instruction wait finale bloque le processus afin d’éviter de recommencer les stimuli.
Version avec vérification automatique
|
TP 2.5 — Lancement de la simulation
Dans un environnement graphique
1. Ajouter le banc de test au groupe de sources de simulation.
2. Définir tb_porte_et comme unité de niveau supérieur pour la simulation.
3. Lancer l’analyse, l’élaboration puis la simulation comportementale.
4. Ajouter a, b et y dans la fenêtre de chronogrammes.
5. Afficher une durée d’au moins 40 ns.
6. Vérifier les quatre intervalles et comparer y à la table de vérité de la porte ET.
Avec GHDL et GTKWave
|
Résultat attendu
Intervalle de simulation | a | b | y attendu |
|---|---|---|---|
| 0 ns à 10 ns | 0 | 0 | 0 |
| 10 ns à 20 ns | 0 | 1 | 0 |
| 20 ns à 30 ns | 1 | 0 | 0 |
| 30 ns à 40 ns | 1 | 1 | 1 |
Le signal y doit être à 1 uniquement pendant le dernier intervalle. Les changements peuvent apparaître au même instant que les entrées dans une simulation fonctionnelle idéale. L’affichage exact des événements dépend du zoom et de la manière dont le simulateur représente les cycles delta.
TP 2.6 — Exploitation et extensions
Extension A — Porte OU
1. Dupliquer le composant sous le nom porte_ou.
2. Remplacer l’opérateur and par or.
3. Adapter le banc de test et les valeurs attendues.
4. Vérifier que la sortie vaut 1 dès qu’au moins une entrée vaut 1.
Extension B — Porte XOR
1. Créer une entité porte_xor possédant la même interface.
2. Utiliser l’opérateur xor.
3. Écrire des assertions pour les quatre combinaisons.
4. Expliquer dans le compte rendu la différence entre OR et XOR.
Extension C — Regrouper plusieurs fonctions
|
Dépannage du TP
Symptôme | Cause probable | Correction |
|---|---|---|
| porte_et introuvable | Fichier non analysé ou mauvaise bibliothèque | Analyser porte_et.vhd avant le banc de test |
| std_logic inconnu | Paquetage non importé | Vérifier les clauses library et use |
| Aucun signal visible | Signaux non ajoutés ou mauvaise unité simulée | Choisir tb_porte_et et ajouter les signaux |
| Simulation s’arrête immédiatement | Absence de stimuli ou durée trop courte | Vérifier le processus et la durée de simulation |
| y reste indéfini | Composant non connecté ou architecture incorrecte | Vérifier le port map et l’affectation de y |
| Assertions en erreur | Valeur attendue incorrecte ou défaut du composant | Comparer avec la table de vérité |
| Commande inconnue | Outil non installé ou chemin non configuré | Vérifier l’installation et la variable PATH |
Compte rendu demandé
1. Indiquer l’environnement et la méthode de simulation utilisés.
2. Présenter l’arborescence du projet et le rôle de chaque fichier.
3. Fournir le code du composant et du banc de test.
4. Insérer une capture lisible du chronogramme avec les quatre combinaisons.
5. Expliquer la différence entre l’entité, l’architecture et le banc de test.
6. Préciser pourquoi les affectations concurrentes ne sont pas exécutées comme des instructions logicielles successives.
7. Présenter les éventuelles erreurs rencontrées et les corrections appliquées.
Grille d’évaluation indicative
Critère | Points |
|---|---|
| Projet correctement organisé | 2 |
| Composant VHDL valide | 3 |
| Banc de test complet | 4 |
| Simulation et chronogramme corrects | 4 |
| Assertions ou vérification argumentée | 3 |
| Analyse et qualité du compte rendu | 4 |
Synthèse du chapitre
- Un HDL décrit un circuit, ses connexions, son comportement et son évolution temporelle.
- Une description peut être structurelle, comportementale ou orientée flot de données.
- La simulation vérifie le modèle ; la synthèse transforme les constructions compatibles en matériel.
- VHDL est fortement typé et sépare l’entité de l’architecture.
- Verilog utilise une syntaxe plus compacte ; SystemVerilog enrichit la conception et la vérification.
- Un programme logiciel exécute des instructions sur un processeur, tandis qu’un HDL peut créer plusieurs ressources actives simultanément.
- Chaque opération HDL possède un coût possible en ressources, en délai, en latence et en consommation.
- Le cycle FPGA va de la spécification à la validation matérielle en passant par la simulation, la synthèse, le placement-routage et l’analyse temporelle.
À retenir Pour lire du VHDL correctement, il faut toujours se demander : quel matériel cette description représente-t-elle, quand ce matériel agit-il, quelles données mémorise-t-il et comment pourra-t-on vérifier son comportement ? |
Autoévaluation
1. Définir un HDL en une phrase et donner deux usages principaux.
2. Expliquer la différence entre une description structurelle et une description comportementale.
3. Pourquoi une construction simulable peut-elle être non synthétisable ?
4. Citer deux caractéristiques de VHDL et deux caractéristiques de SystemVerilog.
5. Expliquer pourquoi l’ordre de deux affectations concurrentes indépendantes n’impose pas leur ordre d’exécution.
6. À quel composant matériel une condition combinatoire est-elle souvent associée ?
7. Quel est le rôle de l’élaboration ?
8. Quelle différence existe entre la simulation fonctionnelle et l’analyse temporelle ?
9. Pourquoi faut-il lire les avertissements du rapport de synthèse ?
10. Citer trois défauts susceptibles d’apparaître uniquement lors de la validation sur la carte.
Éléments de réponse
- Un HDL est un langage formel qui modélise la structure et le comportement d’un circuit pour la simulation et la synthèse.
- Le structurel assemble explicitement des blocs ; le comportemental exprime principalement la fonction attendue.
- Le simulateur peut représenter des actions sans équivalent matériel portable, comme certains retards explicites ou accès à des fichiers.
- VHDL est fortement typé et sépare interface et architecture ; SystemVerilog ajoute des blocs RTL explicites, assertions et mécanismes avancés de vérification.
- Les affectations concurrentes représentent des ressources physiques coexistantes.
- Une condition combinatoire produit généralement des comparateurs et multiplexeurs.
- L’élaboration construit la hiérarchie complète du modèle et résout les instances et paramètres.
- La simulation fonctionnelle valide la logique ; l’analyse temporelle vérifie les délais et contraintes de l’implémentation.
- Les avertissements peuvent révéler des latches, des signaux supprimés, des largeurs incohérentes ou des horloges non prévues.
- La carte peut révéler des erreurs de broches, de polarité, d’horloge, de synchronisation ou de rebond des boutons.
Glossaire
Architecture : partie d’une unité VHDL qui décrit le fonctionnement interne d’une entité.
ASIC : circuit intégré conçu pour une application spécifique et fabriqué avec une structure fixe.
Banc de test : modèle VHDL destiné à stimuler un composant et à vérifier ses sorties.
Concurrence : fonctionnement simultané de plusieurs blocs matériels ou instructions concurrentes.
DUT : composant ou système soumis au test dans une simulation.
Élaboration : construction de la hiérarchie complète d’instances avant simulation ou synthèse.
Entité : unité VHDL qui définit le nom, les paramètres et l’interface d’un composant.
FPGA : circuit logique reconfigurable dont les ressources sont organisées après fabrication.
HDL : langage de description matérielle.
Netlist : liste de composants matériels et de leurs connexions.
RTL : niveau de description centré sur les registres et les transferts de données entre eux.
Simulation : évaluation logicielle du comportement d’un modèle HDL.
Synthèse : transformation d’une description HDL en architecture matérielle.
Testbench : terme anglais couramment utilisé pour désigner un banc de test.
VHDL : langage HDL fortement typé utilisé pour la modélisation, la simulation et la synthèse de circuits numériques.
Conclusion
Les langages de description matérielle rendent possible la conception de systèmes numériques complexes à partir de modèles textuels structurés. Leur maîtrise nécessite un changement de perspective : le concepteur ne rédige pas seulement une succession d’actions, il définit une architecture composée de ressources capables d’agir simultanément. La suite du cours approfondira la structure d’une description VHDL, les types de données, les opérateurs et les styles de description nécessaires à la réalisation de circuits combinatoires et séquentiels complets.