system verilog - program - Diferencia entre always_ff, always_comb, always_latch y always
system verilog examples (1)
Estoy totalmente confundido entre estos 4 términos: always_ff
, always_comb
, always_latch
y always
. ¿Cómo y con qué propósito se pueden utilizar?
always
es el tipo principal de proceso de Verilog, el otro es una initial
que se ejecuta una vez al inicio de una simulación.
always_ff @(posedge clk)
:
Representa un flip-flop (ff), el proceso se activa (ejecuta) en cada flanco positivo del reloj. Esto reemplaza always @(posedge clk)
. Este es el único tipo donde se deben usar asignaciones sin bloqueo ( <=
), ya que imita la forma en que un flip-flop transfiere datos.
always_ff @(posedge clk) begin
a <= b;
end
always_latch
: es para representar latches.
El uso sería:
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
Esto reemplaza:
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
:
Es para la lógica combinatoria, es un reemplazo para always @*
cuando no desea un pestillo. Ahora podemos diferenciar nuestra intención de diseño cuando queremos y no queremos pestillos.
Los nombres de SystemVerilog always_ff
, always_latch
y always_comb
tienen criterios más estrictos para el momento en que se activan, lo que significa que se reduce la posibilidad de que el desajuste RTL a nivel de puerta (post síntesis) se reduzca. Significa que no son 100% equivalentes a la parte always @
counter y pueden cambiar algunos comportamientos de simulación.