Разница между always_ff, always_comb, always_latch и всегда

Я полностью запутался среди этих четырех членов: always_ff, always_comb, always_latch и always. Как и с какой целью они могут быть использованы?

Ответы

Ответ 1

always - это основной тип процесса от Verilog, другой - initial, который запускается один раз в начале моделирования.

always_ff @(posedge clk):
Представляет триггер (ff), процесс запускается (выполняется) на каждом положительном фронте часов. Это заменяет always @(posedge clk). Это единственный тип, в котором должны использоваться неблокирующие (<=) назначения, так как это имитирует способ передачи данных триггером.

always_ff @(posedge clk) begin
  a <= b;
end

always_latch: для представления защелок.

Использование:

always_latch begin
  if (enable) begin
     a_latch = something;
  end
  //No else clause so a_latch value
  //is not always defined, so it holds its value
end

Это заменяет:

always @* begin
  if (enable) begin
     a_latch = something;
  end
  //No else clause so a_latch value
  //is not always defined, so it holds its value
end

always_comb:
Для комбинаторной логики это замена always @*, когда вы не хотите защелки. Теперь мы можем отличить наше намерение дизайна, когда хотим, и не хотим защелок.

Имена SystemVerilog always_ff, always_latch и always_comb имеют более строгие критерии для того, когда они запускаются, это означает, что вероятность несоответствия RTL для уровня Gate (постсинтеза) снижается. Это означает, что они не эквивалентны на 100% там always @ счетной части и могут изменять какое-либо поведение моделирования.