iff
es un calificador de eventos. No importa cuál sea el evento que queda de iff
(cambio de valor o borde).
IEEE Std 1800-2012 § 9.4.2.3 Controles de eventos condicionales :
El control de eventos @ puede tener un calificador iff.
module latch (output logic [31:0] y, input [31:0] a, input enable);
always @(a iff enable == 1)
y <= a; //latch is in transparent mode
endmodule
La expresión del evento solo se activa si la expresión después de iff
es verdadera (como se define en 12.4), en este caso cuando enable
es igual a 1. Este tipo de expresión se evalúa cuando cambia y no cuando cambia enable
. Además, en expresiones de eventos similares de este tipo, iff
tiene prioridad sobre o. Esto se puede aclarar mediante el uso de paréntesis.
IEEE Std 1800-2012 sugiere que iff
podría ser sintetizable 9.2.2.4 < em> Sequential logic always_ff procedure , sin embargo, actualmente es poco común que un sintetizador admita iff
. Por lo tanto, no se recomienda usar iff
en el código que se pretende sintetizar. Hay una semi-excepción que menciono a continuación usando 'ifdef
/ 'ifndef
.
Si se vuelve sintetizable, iff
podría usarse para el reloj, pero es posible que no sea el enfoque recomendado. La activación del reloj se debe utilizar para activar el reloj de un módulo grande que se debe suspender dinámicamente o apagar / encender; No por un puñado de fracasos. La activación del reloj rara vez es beneficiosa para diseños de gatillo de borde pequeño. Normalmente, el uso de un pin de habilitación o la retroalimentación de Q a D es suficiente para ahorrar energía / área.
Un lugar donde iff
es útil en RTL es con el problema clásico de programación con la superposición de conjuntos / reinicios asíncronos. Cuando rst_n
y set_n
son bajos, el restablecimiento (en el siguiente ejemplo) tiene prioridad. Si rst_n
fuera alto con set_n
cambiando de nombre bajo (sin transición), un flop real se establecería de forma asíncrona, pero RTL no hará nada.
alway_ff @(posedge clk, negedge rst_n, negedge set_n) begin
if (!rst_n) begin
// ...
end
else if (!set_n) begin
// ...
end
else begin
// ...
end
end
La adición de posedge rst_n iff !set_n
a la lista de sensibilidad permite que la condición de caso de esquina funcione correctamente. Dado que iff
no es sintetizable [actualmente], un 'ifndef 'endif
necesita ser distorsionado a su alrededor
alway_ff @(posedge clk, negedge rst_n,
'ifndef SYNTHESIS
posedge rst_n iff !set_n,
'endif
negedge set_n) begin
// ...
end