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