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