Lo que sé es que Variable no tiene representación de hardware. Entonces, ¿se incluye en la categoría de códigos no sintetizables en VHDL?
Lo que sé es que Variable no tiene representación de hardware. Entonces, ¿se incluye en la categoría de códigos no sintetizables en VHDL?
Cómo es una variable VHDL sintetizado por las herramientas de síntesis tiene información útil, aunque no es exactamente un duplicado de su pregunta IMO.
El hecho de que algo no tenga una representación directa de hardware no significa que no sea sintetizable.
Al escribir VHDL (y Verilog) para la síntesis, normalmente se escribe un código de programa que define lo que sucede en cada ciclo de reloj. También puede escribir código que tome señales de entrada y produzca salidas a partir de ellas tan pronto como la entrada cambie sin involucrar un reloj.
La herramienta de síntesis convierte ese bloque de código en una combinación de operaciones lógicas (puertas, multiplexores, sumadores, multiplicadores, etc., que luego se asignarán a recursos específicos de destino) y registros. Lógicamente, ese bloque de código puede considerarse como completado "al instante".
¿Cómo hace eso? En primer lugar, todos los bucles están totalmente desenrollados (obtendrá errores si tiene bucles con una serie de iteraciones que no se pueden determinar de forma estática). Es probable que algunas variables (es decir, contadores de bucles) desaparezcan en este punto.
Luego el código se convierte en un formulario de flujo de datos. Las variables en este punto son esencialmente etiquetas que le dicen al compilador qué salida alimenta en qué entrada. Cada variable se convertirá en una o más señales que representan su valor en diferentes puntos del código.
Las declaraciones "if" y similares se convierten en multiplexores que seleccionan qué versión de una señal debe alimentar la lógica y / o los registros posteriores.
Si hay una ruta a través del código donde se lee una variable dada antes de ser configurada y / o una ruta donde la variable no está establecida, entonces el valor final de una variable desde una pasada a través del código se debe ingresar a la entrada de la siguiente.
Cómo exactamente eso sucede depende de cuándo se ejecuta el código. Si el código se ejecuta en un borde del reloj, se creará un registro cronometrado para enviar el valor final de una iteración al valor inicial para la siguiente. Esto está bien, las herramientas pueden manejarlo como cualquier otro registro.
Si el código no se desencadena con el reloj, el valor de salida se enviará directamente a la entrada, creando lo que es esencialmente un "cierre transparente". ¡Esto suele ser algo malo! Los pestillos transparentes son muy sensibles a los fallos de entrada y son difíciles de manejar para los analizadores de temporización. Si bien la mayoría de las herramientas de síntesis sintetizarán esto, es posible que los resultados no coincidan con los resultados de la simulación y que no sean redimibles.