Liste de sensibilité
Fait partie de la section Fondamentaux du Journey Verilog de Coddy — leçon 48 sur 90.
La liste de sensibilité indique au bloc always quand s'exécuter. Elle est écrite entre parenthèses après le symbole @.
La liste de sensibilité est un ensemble de signaux ou d'événements qui déclenchent le bloc always. Lorsqu'un signal de la liste change, le bloc s'exécute.
Syntaxe :
always @(sensitivity_list) begin
// Le code s'exécute lorsque les signaux de la liste changent
endTypes de listes de sensibilité
| Type | Syntaxe | Quand le bloc s'exécute |
|---|---|---|
| Tous les signaux (combinatoire) | always @(*) | Quand n'importe quel signal interne change |
| Signaux spécifiques | always @(a or b) | Quand a ou b change |
| Déclenchement sur front (séquentiel) | always @(posedge clk) | Sur le front montant de l'horloge |
| Fronts multiples | always @(posedge clk or posedge reset) | Sur le front d'horloge ou le front de réinitialisation |
Option 1 : Tous les signaux (*)
Le plus sûr et le plus courant pour la logique combinatoire.
always @(*) begin
out = a & b; // S'exécute quand a ou b change
endLe * inclut automatiquement tous les signaux lus dans le bloc.
Option 2 : Signaux spécifiques
always @(a or b) begin
out = a & b; // S'exécute quand a ou b change
endSi vous oubliez un signal, vous obtenez un latch (mémoire non intentionnelle).
Option 3 : Déclenchement sur front (posedge)
always @(posedge clk) begin
q <= d; // S'exécute sur le front montant de l'horloge
endUtilisez posedge pour le front montant, negedge pour le front descendant.
Option 4 : Fronts multiples
always @(posedge clk or posedge reset) begin
if (reset)
q <= 0;
else
q <= d;
endS'exécute sur le front d'horloge ou le front de réinitialisation.
Erreurs courantes
| Erreur | Pourquoi c'est incorrect |
|---|---|
always @(a or b or c) mais utilise d | d manquant → latch |
always @(posedge clk or reset) | posedge manquant pour reset |
always @(clk) | Devrait utiliser posedge clk pour les bascules |
Défi
Ce qu'il faut faire :
- Ajoutez la liste de sensibilité correcte pour faire fonctionner cette bascule (flip-flop). Le bloc doit s'exécuter sur le front montant de
clk.
Aide-mémoire
La liste de sensibilité suit @ et définit quand un bloc always s'exécute :
always @(sensitivity_list) begin
// s'exécute quand les signaux listés changent
end| Type | Syntaxe | Se déclenche quand |
|---|---|---|
| Tous les signaux | always @(*) | N'importe quel signal lu change |
| Signaux spécifiques | always @(a or b) | a ou b change |
| Front montant | always @(posedge clk) | Front montant de clk |
| Fronts multiples | always @(posedge clk or posedge reset) | L'un ou l'autre front se déclenche |
Utilisez @(*) pour la logique combinatoire ; utilisez posedge/negedge pour la logique séquentielle :
// Combinatoire
always @(*) begin
out = a & b;
end
// Séquentiel (bascule avec réinitialisation asynchrone)
always @(posedge clk or posedge reset) begin
if (reset) q <= 0;
else q <= d;
endErreurs courantes : l'oubli d'un signal dans une liste spécifique provoque un verrou (latch) ; écrire always @(clk) au lieu de always @(posedge clk) pour les bascules ; omettre posedge avant reset dans une liste à fronts multiples.
Essayez vous-même
module flipflop (
input clk,
input d,
output reg q
);
always @(______) begin
q <= d;
end
endmoduleCette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Fondamentaux
1Introduction
Qu'est-ce que VerilogHardware vs SoftwareNiveaux d'abstraction de conceptionVotre premier moduleCommentaires4Opérateurs - Partie 1
Opérateurs arithmétiquesOpérateur moduloOpérateurs de comparaisonRécapitulatif - Mathématiques simplesOpérateurs bit à bit7Assignation et portes logiques
Assignation continueAssignation avec opérateursPrimitives de portes intégréesPortes AND OR NOTPortes XOR XNORRécapitulatif - Circuit à portes logiques10Prise de décision
Instruction IfIf - ElseRécapitulatif - Comparateur simpleInstruction CaseCasex et CasezRécapitulatif - Conception d'ALU2Types de données
Type WireType RegEntiers et RéelsVecteursTableauxParamètresRécapitulatif - Déclarer des signaux5Opérateurs - Partie 2
Opérateurs logiquesOpérateurs de réductionOpérateurs de décalageOpérateur de concaténationOpérateur conditionnelRécapitulatif - Défi sur les opérateurs11Boucles
Boucle ForBoucle WhileBoucle RépéterBoucle InfinieInstruction DisableRécapitulatif - Modèles de boucles3Système de numération
Représentation binaireNombres avec tailleNombres sans tailleNombres négatifsValeurs spéciales X et ZRécapitulatif - Formats de nombres6Modules
Structure d'un modulePorts d'entrée et de sortiePorts InoutInstanciation de moduleMappage de ports par nomMappage de ports par ordreRécapitulatif - Créer un module9Blocs procéduraux
Bloc AlwaysBloc InitialListe de sensibilitéAffectation bloquanteAffectation non bloquanteRécapitulatif - Always vs Initial12Projet Multiplexeur
Conception d'un Mux 2 vers 1Conception d'un Mux 4 vers 115Contrôleur de feux de circulation
Définition des étatsLogique de la machine à états