Я полностью запутался среди этих 4 терминов: always_ff
, always_comb
, always_latch
и always
. Как и для каких целей их можно использовать?
Разница между always_ff, always_comb, always_latch и всегда
Ответы (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 @
соответствующей части и могут изменить поведение симуляции.
always_comb
не эквивалентен always @*
, и вам больше не следует использовать always @*
. Самая большая причина в том, что always @*
не работает, когда в логике задействованы константы или параметры. Они не генерируют события для запуска выполнения блока. always_comb
гарантирует выполнение в момент времени 0.
- person dave_59; 16.04.2014
always @*
будет продолжаться. Учитывая, сколько новичков публикуют вопросы с ручным списком чувствительности, я думаю, что у нас есть путь, прежде чем always_comb
станет нормой.
- person Morgan; 16.04.2014
//synthesis translate on
, на использование `ifdef SYNTHESIS
. Прошло более 25 лет с тех пор, как `ifdef был добавлен в Verilog.
- person dave_59; 17.04.2014
always_latch
с неблокирующими назначениями. По какой-то конкретной причине вы используете блокирующие назначения в своем ответе?
- person Ari; 23.10.2014
always_latch
как расширение always @*
. <=
Моделирует поведение триггера, и когда защелка открыта, она прозрачна, поэтому я думаю, что =
более подходит. и я не заметил, что они используют неблокирующий (<=
) в LRM.
- person Morgan; 23.10.2014