¿El proceso en VHDL es reentrante?

¿Es posible dos o más ejecuciones secuenciales para un proceso en VHDL ?

¿Qué sucederá si ocurre otro evento (en la lista de señales de sensibilidad) mientras la ejecución secuencial de un proceso no se completa?

¿Es posible o mi modelo VHDL en mente para el proceso es completamente incorrecto?

¡Ningún evento ocurrirá mientras se está ejecutando un proceso!

Cuando un evento despierta un proceso, se ejecuta hasta su finalización (“proceso final”) o una statement explícita de “espera”, y se pone en suspensión. Esto toma, teóricamente, CERO tiempo. Lo que significa que si tiene bucles en su proceso, se desenrollarán de manera efectiva, y cuando realice la síntesis, generará suficiente hardware para ejecutar CADA iteración en paralelo. Además, cualquier procedimiento, función, etc., lleva tiempo cero, a menos que contuvieran una statement explícita de “espera” (en cuyo caso el proceso se suspende en la “espera”, como si el procedimiento hubiera sido subrayado).

A lo largo de este proceso, todas las señales tienen el valor que tenían originalmente cuando el proceso se despertaba, y las asignaciones de señales se almacenaban para que ocurrieran más tarde. (Las variables se actualizan de inmediato, las declaraciones posteriores en el proceso ven el nuevo valor).

Cuando el proceso se suspende (en “espera” o “proceso final”), no ocurre nada hasta que TODOS los demás procesos también se suspendan. (¡Pero recuerde que todos toman cero tiempo!). Si un proceso se suspende en “proceso final”, se reiniciará desde el principio cuando su lista de sensibilidad lo despierte. Si se suspende en una “espera” explícita, esa “espera” especificará un evento o una hora futura, que se reiniciará después de “Esperar”. (NOTAS: 1: ¡no mezcle la lista de sensibilidad y los estilos de Espera en el mismo proceso! 2: Espere hasta que algún evento sea sintetizable (aunque algunas herramientas pueden objetar); Esperar un poco de tiempo es solo simulación)

ENTONCES todas las asignaciones de señal se realizan. Como todos los procesos están dormidos, esto elimina todas las condiciones de carrera y los riesgos de cronometraje. Algunas de estas asignaciones (como ‘1’ a un reloj) harán que los eventos se programen en procesos sensibles a ellos.

Después de todas las asignaciones de señal, el tiempo avanza un tick infinitamente corto (llamado ciclo delta), y luego se despiertan todos los procesos con eventos progtwigdos.

Esto continúa hasta que se produce un ciclo delta en el que NO se progtwign nuevos eventos, y finalmente la simulación puede avanzar en un paso de tiempo real.

Así

 process(clk) begin if rising_edge(clk) then A <= B; B <= A; end if; end process; 

está libre de peligros en VHDL.

Si alguna vez necesita usar Verilog, tenga en cuenta que algo de esto sucede de manera diferente allí, y no puede confiar en el mismo nivel de predictibilidad en los resultados de la simulación.


En síntesis, por supuesto, generamos hardware que tomará algún tiempo real para ejecutar este proceso. Sin embargo, las herramientas de síntesis y de back-end (lugar y ruta) garantizan obedecer este modelo fielmente o fallar e informar por qué fallaron. Por ejemplo, sumrán todas las demoras reales y verificará que la sum sea menor que el período de reloj especificado. (¡A menos que haya configurado la velocidad del reloj demasiado alta!).

Entonces, el resultado es que mientras las herramientas informen el éxito (y establezca las restricciones de tiempo como la velocidad del reloj correctamente) puede pretender que el modelo anterior de "tiempo cero" es verdadero, y el comportamiento real del hardware coincidirá con la simulación. ¡Garantizado, salvo errores de herramienta!

Al comenzar a usar VHDL (o cualquier otra HDL para el caso), es muy importante descartar todas las nociones de código secuencial, y en su lugar centrarse en el flujo de datos a través del hardware. En el hardware, todo es intrínsecamente paralelo (todo sucede simultáneamente), pero utiliza datos que cambian constantemente (señales de entrada) para calcular los resultados constantemente cambiantes (señales de salida).

Sin entrar en temas más avanzados como variables, comandos de espera, etc., todo dentro de un proceso ocurre simultáneamente. Si ocurren cosas conflictivas dentro del mismo proceso (múltiples escrituras en la misma señal), la última statement en el proceso gana, que es a menudo de donde viene la confusión sobre el código “secuencial” en VHDL.

Esto funciona debido a la forma en que los valores se asignan a las señales. ¡Al asignar un valor a una señal, el valor de la señal no cambia inmediatamente! En su lugar, el valor asignado se recuerda y se confirmará como el valor real de la señal más tarde (en preparación para el próximo ciclo delta, que es efectivamente la siguiente cantidad de tiempo).

Dado que el siguiente ciclo delta no comenzará hasta que se hayan completado todos los procesos del ciclo delta anterior, los valores de señal solo cambiarán cuando no se esté ejecutando ningún proceso. Una vez que todas las señales hayan cambiado, se iniciará el siguiente ciclo delta y se ejecutará cualquier proceso sensible a una de las señales modificadas.

Si un proceso es sensible a una señal que también escribe, tiene lo que se conoce como un bucle combinatorio, por ejemplo, una puerta donde la salida alimenta una entrada. Esto es (casi) siempre un error en su circuito, y generalmente hará que los simuladores ingresen a un ciclo de delta-ciclo infinito.

Eso es todo lo que voy a escribir por ahora, ya que la respuesta de Brian Drummond apareció cuando estaba escribiendo esto, pero siéntase libre de dejar un comentario y agregaré algunos detalles más.

Deberías leer esta publicación en el blog: http://www.sigasi.com/content/vhdls-crown-jewel

Una vez que un proceso comienza a ejecutarse (debido a un evento), se ejecuta hasta su finalización antes de que otros eventos puedan desencadenar cualquier otra cosa.

Intereting Posts