Regla de lista de sensibilidad en HDL

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. Cuando incluyo CLK y EN posedge en mi lista de sensibilidad, cambio el valor de x cuando cambia cualquiera de las señales en la lista de sensibilidad. Por lo tanto, si EN cambia en medio del ciclo de 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 borde ascendente. Por lo tanto, elimino la EN de la lista para lograr el resultado deseado. Pero entonces, esto viola la regla.

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

Respuestas (3)

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

  • Si desea una lógica secuencial, use always @(posedge clock)(o negedge). No necesita mencionar 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 señales de reinicio, pero no intente ser demasiado elegante. 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 usa en él. Ya no hay razón para nombrar cada señal, esa sintaxis es obsoleta e innecesaria.

Esa regla es solo para la 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_combpara capturar su intención para el bloque (y también manejar bloques que resultan tener entradas constantes)

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

Puede utilizar 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 lógica combinacional, también se necesita incluir EN en la lista de sensibilidad usandoalways_comb