Comprendre les blocs always Verilog : Syntaxe et listes de sensibilité
Un bloc always est l'un des blocs procéduraux en Verilog. Les instructions à l'intérieur s'exécutent séquentiellement.
Syntaxe
always @ (event) [instruction]
always @ (event) begin [instructions multiples] end
Le bloc always s'exécute lors d'un événement particulier défini par une liste de sensibilité.
Qu'est-ce qu'une liste de sensibilité ?
Une liste de sensibilité définit quand le bloc always doit s'exécuter, spécifiée après @ entre parenthèses ( ). Peut contenir un ou groupe de signaux dont le changement de valeur déclenche le bloc.
// Exécuter bloc always quand valeur de "a" ou "b" change
always @ (a or b) begin [instructions] end
À quoi sert le bloc always ?
Un bloc always peut réaliser éléments combinatoires ou séquentiels. Élément séquentiel comme bascule actif avec horloge et reset. Bloc combinatoire actif quand une entrée change. Ces blocs matériels travaillent en concurrence. Pour modéliser ce comportement, bloc always est un processus continu déclenché quand signal dans liste de sensibilité devient actif.
Exemple : bloc exécuté à chaque front montant de clk.
// Exécuter à front montant de "clk"
always @ (posedge clk) begin [instructions] end
Que se passe-t-il sans liste de sensibilité ?
Bloc always se répète continuellement pendant toute la simulation. Liste de sensibilité apporte notion de timing : quand signal dans liste change, bloc déclenché. Sans instruction de contrôle temporel, simulation bloquée par boucle infinie à délai zéro !
Exemple
Bloc always tente d'inverser clk. Instruction exécutée après 0 unités de temps -> s'exécute éternellement, simulation plante !
always clk = ~clk;
Même si liste vide, il faut délai. Temps simulation avancé par instruction délai dans always : inversion horloge toutes les 10 unités.
always #10 clk = ~clk;
Note : Délais explicites non synthétisables en portes logiques ! Donc vrai code Verilog design nécessite toujours liste de sensibilité.
Exemple conception élément séquentiel
Module tff : entrée données, horloge, reset actif-bas. Sortie s'inverse quand d=1 au front montant clk. Bloc always déclenché front montant clk OU front descendant rstn.
Au front montant d'horloge ?
- Premier
ifvérifie reset actif-bas rstn - Si rstn=0, sortie q reset à 0
- Si rstn=1, reset non appliqué, comportement par défaut
- Si étape précédente fausse : vérifie d, si 1 inverse q, si 0 maintient q
module tff (input d, clk, rstn, output reg q);
always @ (posedge clk or negedge rstn) begin
if (!rstn) q <= 0;
else if (d) q <= ~q;
else q <= q;
end
endmodule
Au front descendant de reset ?
- Premier
ifvérifie rstn. Au front descendant, valeur = 0. - Si rstn=0, reset appliqué, sortie reset à 0
- Cas rstn=1 non considéré car événement = front descendant rstn
Exemple conception élément combinatoire
Bloc always utilisable pour blocs combinatoires. Circuit numérique combinant 3 portes logiques donnant sortie sur signal o.

Module avec 4 entrées et 1 sortie o. Bloc always déclenché quand signaux liste changent. Sortie déclarée reg dans liste ports car utilisée dans bloc procédural. Tous signaux dans bloc procédural doivent être reg.
module combo (input a, b, c, d, output reg o);
always @ (a or b or c or d) begin
o <= ~((a & b) | (c^d));
end
endmodule
Signal o = 1 quand expression RHS vraie, 0 quand fausse.
Simulation Output :

Cliquez ici pour diaporama avec exemple simulation !
Verilog
- Maîtriser Verilog : Tutoriel complet pour la conception de circuits numériques
- Maîtriser la concaténation Verilog : Guide pratique
- Verilog Essentiel : Aperçu concis
- Comprendre les affectations Verilog : Types, Syntaxe et Bonnes Pratiques
- Verilog Blocking vs Non-Blocking : Différences Clés Expliquées
- Maîtriser les Fonctions Verilog pour une Conception RTL Efficace
- Comprendre les Tasks Verilog : Fonctions vs Tasks, Syntaxe et Utilisation
- Générateur d'Horloge Verilog : Guide de Conception et d'Implémentation
- Maîtriser les Fonctions Mathématiques Verilog pour une Conception Matérielle Efficace