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

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


person user2138826    schedule 16.04.2014    source источник


Ответы (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's 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's 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 @ соответствующей части и могут изменить поведение симуляции.

person Morgan    schedule 16.04.2014
comment
always_comb не эквивалентен always @*, и вам больше не следует использовать always @*. Самая большая причина в том, что always @* не работает, когда в логике задействованы константы или параметры. Они не генерируют события для запуска выполнения блока. always_comb гарантирует выполнение в момент времени 0. - person dave_59; 16.04.2014
comment
Спасибо @ dave_59 Я попытался охватить точное равенство в моем последнем абзаце. Это SystemVerilog, а IP-адреса часто разрабатываются с учетом обратной совместимости с Verilog, поэтому использование always @* будет продолжаться. Учитывая, сколько новичков публикуют вопросы с ручным списком чувствительности, я думаю, что у нас есть путь, прежде чем always_comb станет нормой. - person Morgan; 16.04.2014
comment
Да, только подумайте, сколько времени требуется людям, чтобы переключиться с использования прагм комментариев, таких как //synthesis translate on, на использование `ifdef SYNTHESIS. Прошло более 25 лет с тех пор, как `ifdef был добавлен в Verilog. - person dave_59; 17.04.2014
comment
@Morgan: стандарт IEEE использует always_latch с неблокирующими назначениями. По какой-то конкретной причине вы используете блокирующие назначения в своем ответе? - person Ari; 23.10.2014
comment
@ Ари, я вижу always_latch как расширение always @*. <= Моделирует поведение триггера, и когда защелка открыта, она прозрачна, поэтому я думаю, что = более подходит. и я не заметил, что они используют неблокирующий (<=) в LRM. - person Morgan; 23.10.2014