Comprender los retrasos inter e intra asignación en Verilog
Las declaraciones de retraso en Verilog pueden tener retrasos especificados ya sea en el lado izquierdo o derecho del operador de asignación.
Retrasos inter-asignación
// Retraso especificado en el lado izquierdo
#<retraso> <LHS> = <RHS>
Una declaración de retraso inter-asignación tiene el valor de retraso en el LHS del operador de asignación. Esto indica que la declaración en sí se ejecuta después de que el retraso expira, y es la forma más comúnmente usada 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);
// Inicializar todas las señales a 0 en tiempo 0
a <= 0;
b <= 0;
c <= 0;
q <= 0;
// Retraso inter-asignación: Esperar #5 unidades de tiempo
// y luego asignar a y c a 1. Nota que 'a' y 'c'
// se actualizan al final del paso de tiempo actual
#5 a <= 1;
c <= 1;
// Retraso inter-asignación: Esperar #5 unidades de tiempo
// y luego asignar 'q' con cualquier valor que RHS obtenga
// evaluado a
#5 q <= a & b | c;
#20;
end
endmodule
Tenga en cuenta que q se vuelve 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 a 1.
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.
Retrasos intra-asignación
// Retraso especificado en el lado derecho
<LHS> = #<retraso> <RHS>
Un retraso intra-asignación es aquel donde 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 de que 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);
// Inicializar todas las señales a 0 en tiempo 0
a <= 0;
b <= 0;
c <= 0;
q <= 0;
// Retraso inter-asignación: Esperar #5 unidades de tiempo
// y luego asignar a y c a 1. Nota que 'a' y 'c'
// se actualizan al final del paso de tiempo actual
#5 a <= 1;
c <= 1;
// Retraso intra-asignación: Primero ejecutar la declaración
// luego esperar 5 unidades de tiempo y luego asignar el valor
// evaluado a q
q <= #5 a & b | c;
#20;
end
endmodule
Tenga en cuenta que la asignación a q falta en el log !
xcelium> 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 es porque en 5 unidades de tiempo, a y c se asignan usando declaraciones no bloqueantes. Y el comportamiento de las declaraciones no bloqueantes es tal que RHS se evalúa, pero se asigna a la variable solo al final de ese paso de tiempo.
Así que el valor de a y c se evalúa a 1 pero aún no se ha asignado cuando la siguiente declaración no bloqueante que es la de q se ejecuta. Así que cuando RHS de q se evalúa, a y c aún tienen el valor antiguo de 0 y por tanto $monitor no detecta un cambio para mostrar la declaración.
Para observar el cambio, cambiemos las declaraciones de asignación a a y c de no bloqueante a bloqueante.
...
// No bloqueante cambiado a bloqueante y el resto del
// código permanece igual
#5 a = 1;
c = 1;
q <= #5 a & b | c;
...
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
- Fundamentos de Verilog: Diseñando tu primera compuerta AND
- Dominar Verilog: Tutorial completo para diseño de circuitos digitales
- Dominar la sintaxis de Verilog: Reglas clave y mejores prácticas
- Dominar la concatenación en Verilog: Guía práctica
- Comprender las asignaciones en Verilog: tipos, sintaxis y mejores prácticas
- Bloqueante vs. No bloqueante en Verilog: Diferencias clave explicadas
- Dominar las funciones en Verilog para diseño RTL eficiente
- Comprender las Tasks en Verilog: Funciones vs Tasks, sintaxis y uso
- Comprender el control de retraso en Verilog: Técnicas de temporización y mejores prácticas
- Comprender los retrasos de puertas en Verilog: Temporización precisa para diseños digitales confiables
- Generador de reloj en Verilog: Guía de diseño e implementación