Je suis totalement confus parmi ces 4 termes: always_ff
, always_comb
, always_latch
et always
. Comment et dans quel but peuvent-ils être utilisés?
always
est le principal type de processus de Verilog, l'autre est un initial
qui est exécuté une fois au début d'une simulation.
always_ff @(posedge clk)
:
Représente une bascule (ff), le processus est déclenché (exécuté) sur chaque front positif de l'horloge. Cela remplace always @(posedge clk)
. Il s'agit du seul type où le non-blocage (<=
) les affectations doivent être utilisées, car cela imite la façon dont une bascule transfère des données.
always_ff @(posedge clk) begin
a <= b;
end
always_latch
: sert à représenter les verrous.
L'utilisation serait:
always_latch begin
if (enable) begin
a_latch = something;
end
//No else clause so a_latch's value
//is not always defined, so it holds its value
end
Cela remplace:
always @* begin
if (enable) begin
a_latch = something;
end
//No else clause so a_latch's value
//is not always defined, so it holds its value
end
always_comb
:
Est pour la logique combinatoire, il remplace always @*
lorsque vous ne voulez pas de verrou. Maintenant, nous pouvons maintenant différencier notre intention de conception entre quand nous voulons et ne voulons pas de verrous.
Les noms SystemVerilog always_ff
, always_latch
et always_comb
ont des critères plus stricts pour le moment où ils sont déclenchés, cela signifie que les risques de non-concordance entre le niveau RTL et la porte (post-synthèse) sont réduits. Cela signifie qu'ils ne sont pas équivalents à 100% par rapport à là always @
contrepartie et peut modifier certains comportements de simulation.