Plus facile à lire avec un fond crème, une teinte, plus de contraste ou un texte plus grand ? Choisissez vos couleurs et votre texte, une fois pour toutes les pages.

Leçon gratuite

Compter les portes avec yosys

Après cette leçon: Je peux dire pourquoi une description demande moins de portes qu’une autre, et pourquoi un verrou est une erreur.

Leçon de 60 min12 commandesLab Conception numérique : Verilog, VHDL et yosys dans une VM Ubuntu privée

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

MotCe que ça veut direExemple
Synthèsetransformer une description en portes et en bascules
Celluleune porte ou une bascule de la liste produite par la synthèse$_AND_
Liste de cellulestout ce que la synthèse a produit, avec leur nombre
Verrouune mémoire sans horloge, souvent créée par erreur
Basculeune mémoire d’un bit qui change à un front d’horloge
yosysl’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

Commande
cd ~/hdl

Affiché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

Commande
printf 'module alarme(input porte, input fenetre, input armee, output sirene);\n  assign sirene = armee & (porte | fenetre);\nendmodule\n' > alarme.v

Affiché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

Commande
hdl gates alarme.v alarme

Affiché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

ModuleDescriptionCellules
sommeassign s = a + b20
produitassign s = a * b69
alarmearmee & (porte | fenetre)2

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Écrire somme.v

Commande
printf 'module somme(input [3:0] a, input [3:0] b, output [7:0] s);\n  assign s = a + b;\nendmodule\n' > somme.v

Affiché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

Commande
hdl gates somme.v somme

Affiché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

Commande
printf 'module produit(input [3:0] a, input [3:0] b, output [7:0] s);\n  assign s = a * b;\nendmodule\n' > produit.v

Affiché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

Commande
hdl gates produit.v produit

Affiché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

Code: c
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é

Code: c
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

Commande
printf 'module verrou(input en, input d, output reg q);\n  always @* if (en) q = d;\nendmodule\n' > verrou.v

Affiché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

Commande
hdl gates verrou.v verrou

Affiché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

Commande
printf 'module sans_verrou(input en, input d, output reg q);\n  always @* if (en) q = d; else q = 0;\nendmodule\n' > sans_verrou.v

Affiché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é

Commande
hdl gates sans_verrou.v sans_verrou

Affiché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é

Commande
hdl gates counter.v counter

Affiché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 ?

À propos de ce labo et de sa source: Lab Conception numérique : Verilog, VHDL et yosys dans une VM Ubuntu privée

Vous enseignez à une classe ? Proposez ce module à vos étudiants avec un guide de l'enseignant, des devoirs corrigés et un laboratoire pour chaque étudiant.