Regla de lista de sensibilidad en HDL

1

Tengo un poco de confusión sobre la regla de la lista de sensibilidad: todas las señales que se leen en el bloque siempre deben incluirse en la lista. Al incluir posedge CLK y EN en mi lista de sensibilidad, obtengo un valor de x cambiado cuando cualquiera de las señales en la lista de sensibilidad cambia. Por lo tanto, si EN cambia a la mitad del ciclo del reloj, x cambia en consecuencia, lo que se espera. Sin embargo, este no es el resultado que deseo obtener:

always @(posedge CLK, EN)
if(EN)
    x <= 1;
else
    x <= 0;

Necesito que el valor de x cambie solo en el flanco ascendente. Por lo tanto, elimino el EN de la lista para lograr el resultado deseado. Pero entonces, esto viola la regla.

Esta es, probablemente, una pregunta muy trivial, pero ¿podría alguien aclarar cuál es la forma correcta de implementarla?

    
pregunta Nazar

3 respuestas

5

Olvida esa regla. Aquí hay una más simple:

  • Si quieres lógica secuencial, usa always @(posedge clock) (o negedge ). No es necesario que mencione ninguna otra señal en el bloque de sensibilidad.

    (A veces también puede usar listas de sensibilidad como always @(posedge clock or posedge reset) para restablecer las señales, pero no intente ser demasiado sofisticado. Es muy fácil crear algo que no se sintetice).

  • Si quieres lógica combinacional, usa always @(*) .

    Esta es una abreviatura (introducida por Verilog-2001) que hace que el bloque sea sensible a cada señal que se use en él. Ya no hay razón para nombrar cada señal, ya que la sintaxis es obsoleta e innecesaria.

respondido por el duskwuff
0

Esa regla es solo para lógica combinacional, cuando las salidas dependen únicamente del estado actual de las entradas. Verilog 2001 agregó la sintaxis @(*) que determina automáticamente la lista de sensibilidad para usted, y SystemVerilog agregó always_comb para capturar su intención para el bloque (y también manejar bloques que resultan tener entradas constantes)

Para los bloques síncronos y asíncronos, usted agrega solo las señales involucradas con la sincronización a la lista de sensibilidad. Todas las otras entradas se sincronizarán con esas señales. En su caso, EN solo debe muestrearse en el posedge CLK .

    
respondido por el dave_59
0

Puede usar always_ff@(posedge clk) para inferir una lógica secuencial sin tener que preocuparse por la sensibilidad EN. O usar always@(posedge clk) también puede ser bueno.

Solo para la lógica combinacional, la EN también debe incluirse en la lista de sensibilidad mediante always_comb

    
respondido por el Shankhadeep Mukerji

Lea otras preguntas en las etiquetas