Le nombre de portes mesure la taille
La synthèse logique transforme une description en vraies portes. Le nombre de portes donne la taille du circuit, son prix et sa consommation.
Deux descriptions de la même fonction peuvent demander des nombres de portes très différents. Vous allez les compter avec l’outil yosys et repérer l’erreur de description la plus courante, le verrou.
À la fin de cette leçon
Remarque
Je peux dire pourquoi une description demande moins de portes qu’une autre, et pourquoi un verrou est une erreur.
Mots-clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Synthèse | transformer une description en portes et en bascules | |
| Cellule | une porte ou une bascule de la liste produite par la synthèse | $_AND_ |
| Liste de cellules | tout ce que la synthèse a produit, avec leur nombre | |
| Verrou | une mémoire sans horloge, souvent créée par erreur | |
| Bascule | une mémoire d’un bit qui change à un front d’horloge | |
| yosys | l’outil du labo qui fait la synthèse |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
yosys transforme la description en cellules
Une simulation vérifie qu’un circuit calcule juste. La synthèse répond à une autre question : combien de portes faut-il pour le construire ?
L’outil yosys lit le fichier et rend une liste de cellules, des portes et des bascules. Dans le labo, la commande hdl gates fichier module la compte pour vous.
Aller dans le dossier de travail
cd ~/hdlAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire le module alarme.v
printf 'module alarme(input porte, input fenetre, input armee, output sirene);\n assign sirene = armee & (porte | fenetre);\nendmodule\n' > alarme.vAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Compter les cellules de l’alarme
hdl gates alarme.v alarmeAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Une même fonction peut coûter peu ou beaucoup
Le coût dépend de ce que le circuit calcule. Additionner deux nombres de 4 bits est peu cher. Les multiplier demande bien plus de portes, car chaque bit d’un nombre touche chaque bit de l’autre.
Le tableau compare les deux comptes que les Runs suivants affichent.
Exemple travaillé : additionner ou multiplier
| Module | Description | Cellules |
|---|---|---|
| somme | assign s = a + b | 20 |
| produit | assign s = a * b | 69 |
| alarme | armee & (porte | fenetre) | 2 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Écrire somme.v
printf 'module somme(input [3:0] a, input [3:0] b, output [7:0] s);\n assign s = a + b;\nendmodule\n' > somme.vAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Compter les cellules de la somme
hdl gates somme.v sommeAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire produit.v
printf 'module produit(input [3:0] a, input [3:0] b, output [7:0] s);\n assign s = a * b;\nendmodule\n' > produit.vAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Compter les cellules du produit
hdl gates produit.v produitAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Un if sans else crée un verrou
Un circuit sans horloge doit donner sa sortie pour chaque entrée. Si la description oublie un cas, la sortie doit garder son ancienne valeur.
Garder une valeur demande une mémoire : le synthétiseur ajoute un verrou. C’est presque toujours une erreur. Un verrou n’a pas d’horloge, donc il change à des instants que le reste du circuit ne contrôle pas.
Un module qui oublie un cas
module verrou(input en, input d, output reg q);
// Aucun else : que vaut q quand en vaut 0 ?
always @* if (en) q = d;
endmodule
Le même module, corrigé
module sans_verrou(input en, input d, output reg q);
// q est décrit dans les deux cas : plus rien à retenir.
always @* if (en) q = d; else q = 0;
endmodule
Écrire verrou.v
printf 'module verrou(input en, input d, output reg q);\n always @* if (en) q = d;\nendmodule\n' > verrou.vAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Compter ses cellules
hdl gates verrou.v verrouAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire sans_verrou.v
printf 'module sans_verrou(input en, input d, output reg q);\n always @* if (en) q = d; else q = 0;\nendmodule\n' > sans_verrou.vAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Compter les cellules du module corrigé
hdl gates sans_verrou.v sans_verrouAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Erreur fréquente
Attention
Beaucoup de gens pensent qu’un if sans else veut dire « ne rien faire ». En matériel, une sortie ne peut pas ne rien faire : elle garde sa valeur, et cela demande une mémoire. Décrivez toujours la sortie dans tous les cas, avec un else ou une valeur de départ.
Une bascule, elle, suit une horloge
Une mémoire voulue est une bascule, qui change seulement à un front d’horloge. Dans la liste de cellules, son nom contient DFF. Un verrou, lui, contient LATCH.
Le compteur donné par le labo, counter.v, a 4 bits : on attend donc 4 bascules. Le Run suivant le vérifie.
Compter les cellules du compteur donné
hdl gates counter.v counterAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Pour aller plus loin
Lancez hdl gates sur votre propre counter4.v quand il fonctionne. Comptez ses bascules et vérifiez qu’aucun verrou n’apparaît.
Puis comparez avec le compteur donné : l’ajout de la validation en change-t-il le nombre de cellules, et de combien ?