Menu
Coddy logo textTech

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
end

Types de listes de sensibilité

TypeSyntaxeQuand le bloc s'exécute
Tous les signaux (combinatoire)always @(*)Quand n'importe quel signal interne change
Signaux spécifiquesalways @(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 multiplesalways @(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
end

Le * 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
end

Si 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
end

Utilisez 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;
end

S'exécute sur le front d'horloge ou le front de réinitialisation.

Erreurs courantes

ErreurPourquoi c'est incorrect
always @(a or b or c) mais utilise dd manquant → latch
always @(posedge clk or reset)posedge manquant pour reset
always @(clk)Devrait utiliser posedge clk pour les bascules
challenge icon

Défi

Ce qu'il faut faire :

  1. 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
TypeSyntaxeSe déclenche quand
Tous les signauxalways @(*)N'importe quel signal lu change
Signaux spécifiquesalways @(a or b)a ou b change
Front montantalways @(posedge clk)Front montant de clk
Fronts multiplesalways @(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;
end

Erreurs 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

endmodule
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Fondamentaux