Module 2 — Verilog : décrire des circuits en code

Le langage des concepteurs de puces — celui d'Apple, NVIDIA, AMD… et bientôt le tien.

2.1 — Pourquoi un langage ?

Au Module 1, tu as câblé un additionneur 4 bits à la main : ~20 portes. Or un processeur moderne en contient des centaines de millions. Impossible à dessiner. La solution : décrire le circuit en texte, et laisser un outil (le synthétiseur) le traduire en portes. C'est le rôle d'un HDL (Hardware Description Language). Les deux grands : Verilog et VHDL. On utilisera Verilog, le plus répandu.

⚠️ Piège n°1 du débutant : le Verilog n'est pas un programme qui s'exécute ligne par ligne. C'est la description d'un circuit où tout existe et fonctionne en même temps, en parallèle — comme les portes sur une vraie puce.

2.2 — Anatomie d'un module

Voici ton demi-additionneur du Module 1, en Verilog :

// Demi-additionneur : 2 entrées, 2 sorties
module demi_add (
  input  a,        // 1er bit
  input  b,        // 2e bit
  output s,        // somme
  output c         // retenue
);
  assign s = a ^ b;   // XOR → la somme
  assign c = a & b;   // ET  → la retenue
endmodule

Les opérateurs logiques de Verilog (à connaître par cœur) :

OpérateurPorteExemple
&ETa & b
|OUa | b
^XORa ^ b
~NON~a

Et le miracle : ton additionneur 4 bits du Module 1 (20 portes câblées à la main), en Verilog c'est…

module add4 (input [3:0] a, input [3:0] b, output [4:0] s);
  assign s = a + b;   // le synthétiseur génère les portes pour toi
endmodule

[3:0] signifie « un paquet de 4 fils » (bits 3 à 0). Le + est traduit automatiquement en additionneur à retenue — celui que tu connais maintenant de l'intérieur.

2.3 — À toi : écris du Verilog

Écris l'expression à droite du assign. La table de vérité de TON expression est calculée en direct et comparée au circuit attendu. Vert = circuit correct.

Exercice 1 — la somme du demi-additionneur

Sortie à 1 quand a et b sont différents.

assign s = ;

Exercice 2 — la retenue de l'additionneur complet

3 entrées : a, b, et la retenue entrante cin. La retenue sortante vaut 1 si au moins deux des trois entrées sont à 1. Indice : trois cas de « paire » possibles, reliés par des OU.

assign cout = ;

Exercice 3 — le défi NAND 🏆

Construis un XOR en utilisant uniquement ~, & et des parenthèses (pas de ^ ni | !). C'est le défi historique de NandGame. Indice : XOR = « a OU b » ET « NON(a ET b) » … et OU se fabrique avec des NON et des ET (lois de De Morgan : a|b = ~(~a & ~b)).

assign s = ;

2.4 — Et la simulation ?

Dans la vraie vie, on vérifie un module avec un testbench : un second module qui envoie des valeurs d'entrée et vérifie les sorties — exactement ce que cette page vient de faire pour toi. L'outil de référence open source est Icarus Verilog (iverilog), et on visualise les signaux dans le temps avec GTKWave.

# Sur un vrai poste de travail :
iverilog -o test demi_add.v testbench.v   # compiler
vvp test                                  # simuler
🔧 Prochaine étape d'infrastructure : installer Icarus Verilog sur ce serveur pour compiler et simuler du vrai Verilog directement depuis le portail, avec chronogrammes. Demande-le quand tu te sens prêt !

2.5 — Vérifie tes connaissances

Quiz du module

1. Un fichier Verilog décrit :

2. En Verilog, le XOR s'écrit :

3. Que signifie input [3:0] a ?

4. Qui transforme le Verilog en portes logiques réelles ?

Réussis les 3 exercices ET le quiz pour débloquer.

← Module 1 Module 3 : la mémoire →