Я полностью запутался среди этих четырех членов: 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 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 @ счетной части и могут изменять какое-либо поведение моделирования.