Bloqueo / No bloqueo con retraso

0

Ahora estoy confundido por una pieza de Verilog Codee, su tipo de prueba de las funciones de asignación de bloqueo o no de bloqueo que se combinan con el modelo Delay.

 module cl_tb;

  reg x,y,z;


initial begin
    x = 2;
    #4;
    y <= #9 x;
    x = 1;
    #50 $stop;
end

initial begin
  $monitor("%0t,%d,%d,%d",$time,x,y,z);
end

always @(x,y)
begin
   z = # 2 x+y;
end

endmodule 

Por cálculo manual, podría obtener el resultado [Tiempo: valor de X, valor de Y, valor de Z] a continuación: [0: 2, x, x] [2: 2,0,2] [4: 1,0,2] [6: 1,0,1] [13: 1,2,1] [15: 1,2,3]

Sin embargo, el resultado de la simulación es [0,0, x, x]; [4,1, x, x]; [13,1,0, x]; [15,1,0,1];

Que puede ver en el enlace enlace

Me pregunto por qué el always @ (x, y) no se activó en el intervalo de tiempo 2 y 4.

Mejor

    
pregunta DreamOn

1 respuesta

1

Las variables de registro en Verilog representan flip-flops en hardware.

La declaración:

reg x;

crea un registro de un solo bit que solo puede contener los valores:
x (desconocido), 0 o 1.

El código cl_tb.v está intentando asignar valores al registro x que son demasiado grandes para que quepan en un solo valor de bit. Verilog convierte los enteros en una representación binaria y llena el registro que comienza en el LSB hasta que se queda sin bits en el registro y se detiene. No emite advertencias para esto (tal vez porque se espera que a veces desee utilizar los LSB de un valor).

Cambie su declaración para los registros x, y, z para que sean lo suficientemente anchos para manejar su mayor valor anticipado.

reg [2:0] x, y, z;

Entonces la salida es:

0,2,x,x
4,1,x,x
13,1,2,x
15,1,2,3

El 'cálculo de la mano' que se muestra es incorrecto. Por ejemplo, el bloque siempre se activa cuando x se actualiza en el tiempo cero, pero y no se asigna hasta #9 más tarde. Por lo tanto, el registro z también se desconoce y el monitor no se activa.

    
respondido por el mixed_signal

Lea otras preguntas en las etiquetas