SystemVerilog: Lista de sensibilidad de always_comb

2

Me parece que always_comb no es sensible a las variables asignadas en el propio bloque. Por ejemplo, el siguiente bloque:

always_comb begin
    a = b;
    b = c;
end

parece ser solo sensible a c (por lo tanto, cuando c cambia, b obtiene el valor de c , y a obtiene el valor anterior de b ) en simulación. Si sintetizo esto, funciona como se esperaba ( a , b y c siempre tienen el mismo valor).

¿Hay alguna razón always_comb , que se supone que simula la lógica combinacional, se comporta "incorrectamente" en la simulación?

    

1 respuesta

1

Porque la simulación no hace el mismo tipo de análisis de flujo de datos que una herramienta de síntesis para saber que b es solo una variable temporal. El LRM se escribió pensando que siempre se escribe en variables antes de leer la misma variable en el mismo bloque. Un bloque always_comb debe escribirse como si fuera una función llamada cada vez que se modifica una entrada al bloque. Tener el reencendido del bloque puede ser muy malo para el rendimiento.

El mismo estilo se usa para un bloque always_ff secuencial: una lectura antes de escribir dentro del mismo bloque es un flop, una escritura antes de leer es una variable temporal.

    
respondido por el dave_59

Lea otras preguntas en las etiquetas