web-dev-qa-db-fra.com

Différence entre always_ff, always_comb, always_latch et always

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?

19
user2138826

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.

22
Morgan