always_comb, always_ff et always_latch
Choisir le bon bloc procédural et éviter les pilotes multiples, latchs involontaires et erreurs de sensibilité.
Dire ce que le bloc doit représenter
Verilog utilise always pour plusieurs types de logique. SystemVerilog propose trois formes spécialisées :
always_combpour la logique combinatoire ;always_ffpour les registres et bascules ;always_latchpour un latch volontaire.
Ces blocs décrivent mieux l'intention et imposent des contrôles supplémentaires. Une variable écrite dans l'un de ces blocs ne doit normalement pas être écrite ailleurs.
Logique combinatoire
always_comb calcule automatiquement la liste de sensibilité à partir des signaux lus, y compris ceux lus dans une fonction appelée. Le bloc est aussi exécuté une fois au début de la simulation.
module alu4 (
input logic [3:0] i_a,
input logic [3:0] i_b,
input logic [1:0] i_op,
output logic [3:0] o_y
);
always_comb begin
o_y = '0;
case (i_op)
2'b00: o_y = i_a + i_b;
2'b01: o_y = i_a - i_b;
2'b10: o_y = i_a & i_b;
2'b11: o_y = i_a | i_b;
endcase
end
endmoduleLa valeur par défaut garantit qu'une affectation existe sur tous les chemins. Sans cela, un if ou un case incomplet peut demander de conserver l'ancienne valeur et donc inférer un latch.
Les affectations bloquantes = conviennent aux calculs combinatoires car les instructions du bloc décrivent un calcul intermédiaire ordonné.
Logique séquentielle
always_ff accepte un événement d'horloge et, selon le style retenu, un événement de reset asynchrone.
always_ff @(posedge i_clk or negedge i_rst_n) begin
if (!i_rst_n)
o_q <= '0;
else if (i_enable)
o_q <= i_d;
endLes affectations non bloquantes <= modélisent la mise à jour simultanée des registres après le front. L'absence de branche else lorsque i_enable vaut 0 est normale : une bascule conserve alors sa valeur.
Un latch seulement s'il est voulu
always_latch sert à annoncer qu'un stockage sensible au niveau est volontaire.
always_latch begin
if (i_gate)
o_q <= i_d;
endLes latchs demandent une attention particulière au timing et sont rarement nécessaires dans un flot FPGA classique. Si un always_comb infère un latch, il faut d'abord rechercher une affectation manquante plutôt que remplacer le mot-clé par always_latch.
À retenir
- Le bloc spécialisé permet à l'outil de mieux contrôler l'intention.
always_combévite une liste de sensibilité écrite à la main.- Toute sortie combinatoire doit recevoir une valeur sur chaque chemin.
always_ffs'emploie avec des affectations non bloquantes.always_latchne doit servir que lorsque le latch fait partie de l'architecture.
📝 Tester mes connaissances - Quiz du chapitre