Retraso de asignación inter e intra de Verilog
Las declaraciones de retraso de Verilog pueden tener retrasos especificados en el lado izquierdo o en el lado derecho del operador de asignación.
Retrasos entre tareas
// Delay is specified on the left side
#<delay> <LHS> = <RHS>
Una inter-tarea declaración de retraso tiene valor de retraso en el LHS del operador de asignación. Esto indica que la instrucción en sí se ejecuta después el retraso caduca y es la forma más común de control de retraso.
module tb;
reg a, b, c, q;
initial begin
$monitor("[%0t] a=%0b b=%0b c=%0b q=%0b", $time, a, b, c, q);
// Initialize all signals to 0 at time 0
a <= 0;
b <= 0;
c <= 0;
q <= 0;
// Inter-assignment delay: Wait for #5 time units
// and then assign a and c to 1. Note that 'a' and 'c'
// gets updated at the end of current timestep
#5 a <= 1;
c <= 1;
// Inter-assignment delay: Wait for #5 time units
// and then assign 'q' with whatever value RHS gets
// evaluated to
#5 q <= a & b | c;
#20;
end
endmodule
Tenga en cuenta que q se convierte en 1 en 10 unidades de tiempo porque la declaración se evalúa en 10 unidades de tiempo y RHS, que es una combinación de a, b y c, se evalúa en 1.
Registro de simulaciónxcelium> run [0] a=0 b=0 c=0 q=0 [5] a=1 b=0 c=1 q=0 [10] a=1 b=0 c=1 q=1 xmsim: *W,RNQUIE: Simulation is complete.
Retrasos dentro de la tarea
// Delay is specified on the right side
<LHS> = #<delay> <RHS>
Una intra-tarea retraso es aquel en el que hay un retraso en el RHS del operador de asignación. Esto indica que la declaración se evalúa y los valores de todas las señales en el RHS se capturan primero. Luego se asigna a la señal resultante solo después el retraso expira.
module tb;
reg a, b, c, q;
initial begin
$monitor("[%0t] a=%0b b=%0b c=%0b q=%0b", $time, a, b, c, q);
// Initialize all signals to 0 at time 0
a <= 0;
b <= 0;
c <= 0;
q <= 0;
// Inter-assignment delay: Wait for #5 time units
// and then assign a and c to 1. Note that 'a' and 'c'
// gets updated at the end of current timestep
#5 a <= 1;
c <= 1;
// Intra-assignment delay: First execute the statement
// then wait for 5 time units and then assign the evaluated
// value to q
q <= #5 a & b | c;
#20;
end
endmodule
¡Tenga en cuenta que la asignación a q falta en el registro!
Registro de simulaciónxcelium> run [0] a=0 b=0 c=0 q=0 [5] a=1 b=0 c=1 q=0 xmsim: *W,RNQUIE: Simulation is complete.
Esto se debe a que en 5 unidades de tiempo, a y c se asignan mediante sentencias de no bloqueo. Y el comportamiento de no bloqueo declaraciones es tal que RHS se evalúa, pero se asigna a la variable solo al final de ese paso de tiempo.
Por lo tanto, el valor de a y c se evalúa como 1, pero aún no se asigna cuando se ejecuta la siguiente declaración de no bloqueo, que es la de q. Entonces, cuando se evalúa RHS de q, a y c todavía tienen el valor anterior de 0 y, por lo tanto, $monitor
no detecta un cambio para mostrar la declaración.
Para observar el cambio, cambiemos las instrucciones de asignación a a y c de no bloqueantes a bloqueantes.
...
// Non-blocking changed to blocking and rest of the
// code remains the same
#5 a = 1;
c = 1;
q <= #5 a & b | c;
...
Registro de simulación xcelium> run [0] a=0 b=0 c=0 q=0 [5] a=1 b=0 c=1 q=0 [10] a=1 b=0 c=1 q=1 xmsim: *W,RNQUIE: Simulation is complete.
Verilog