Está especificando WAIT ON x,y en su proceso final junto con AFTER en la asignación a z . Estos combinados con su otro proceso provocan este retraso.
No soy una persona con VHDL (nunca lo usé), pero por lo que puedo decir de una breve lectura de this , this y esto que proporciona explicaciones de las declaraciones VHDL wait y after y process respectivamente, sucederá lo siguiente.
En t = 0:
-
z se calcula como x+y , que al principio es 0 + 0 = 0. Pero este valor aún no está asignado (debido a la declaración AFTER ). Se asignará en t = ahora + 30ns.
-
a se establece en 20 usando una asignación de bloqueo , lo que significa que dentro de ese proceso se calcula antes de w , x o y .
- El siguiente
w se establece en 10. Pero al mismo tiempo, se calculan (pero aún no se asignan) el siguiente valor para x y y . Estos se basan en el valor antiguo de w y el nuevo valor de a . Como resultado, los valores calculados son x será 20 + 0 = 20 y y será 20-0 = 20.
- El proceso superior suspende los cálculos ahora hasta que
z cambie.
- El proceso inferior suspende los cálculos ahora hasta que cambien
x y y .
En t = 10ns
- El valor de
x ahora se actualiza a lo que se calculó anteriormente (es decir, 20)
- Esto activa
z para calcularse como x+y = 20 + 0 = 20. Pero aún no asigna el valor. En su lugar, lo programa para t = ahora + 30 = 40ns.
En t = 20ns
- El valor de
y ahora se actualiza a lo que se calculó anteriormente (es decir, 20)
-
y acaba de cambiar, lo que significa que el proceso final se activa nuevamente. Esto significa que el valor de z se calcula como x+y , que es 20 + 20 = 40. Pero esto no se asignará hasta que t = ahora + 30 = 50ns debido a la declaración AFTER .
- Debido a que un nuevo valor para
z se acaba de calcular y programar para t = 50ns, el valor calculado en t = 10ns que se programó para aplicarse en t-40ns se cancela.
En t = 30ns
- El valor de
z calculado al principio ahora se asigna porque el retraso de 30 ns está arriba. Entonces z se establece en 0.
-
A
z solo se le ha asignado un valor, lo que significa que la lista de sensibilidad para el proceso principal ahora está activada.
- Se calculan los nuevos valores para
a , w , x , y .
...
En t = 50ns
-
A
z se le asigna el valor que se calculó en t = 20ns. En otras palabras, solo ahora z se convierte en 40.
Básicamente, AFTER hace que los valores se calculen Inmediatamente , pero no se asignen para el retraso especificado. Además, si aún no se han asignado valores calculados previamente antes de que se calcule el siguiente valor, se cancela y nunca se asigna.
z se calcula para que sea 40 en t = 20ns, pero dado que hay un retraso de 30ns especificado, el valor no se actualiza hasta que t = 20 + 30 = 50ns.
Este tipo de retrasos no se usan en síntesis reales, sino que se usan para simular retrasos de propagación para identificar problemas de tiempo o condiciones de carrera. A menos que tenga una razón específica para usarlos (es decir, hacer un banco de pruebas), no los use. No es así como se utiliza HDL para la síntesis: en su lugar, debería estar usando la sincronización de borde del reloj.