¿Es el control de eventos iff en systemverilog lo mismo que la sincronización del reloj?

1

He encontrado como este código.

Always @(posedge clk iff rst==0 or posedge rst)

Creo que el código anterior es como el código de activación del reloj Como sé, cuando rst es 1, este bloque nunca se activa. Así que en otras palabras, si hago el primer 0, entonces el bloque está funcionando.

¿Pero no estoy seguro de por qué se introduce este esquema aquí?

    
pregunta smith Lee

1 respuesta

1

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 &lt= 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
    
respondido por el Greg

Lea otras preguntas en las etiquetas