diferencia VHDL entre componente y subprograma

1

He leído diferentes artículos (y también el capítulo del libro) sobre "componente" y "subprograma". Lo que no entiendo es cuál es la diferencia entre los dos ...

Quiero decir, sé que el componente hace más fácil el "diseño jerárquico" agrupando "piezas de hardware" de alguna manera, mientras que el subprograma agrupa la pieza de código, pero lo que no entiendo es cómo todo esto se comporta en síntesis. Es fácil para mí entender cómo se comporta el componente en la síntesis (probablemente un compilador expande el componente y solo infiere la lógica incorporada) pero no entiendo cómo se sintetizan un subprograma o una función.

¿Podrías ayudarme a entender?

    
pregunta user8469759

2 respuestas

4

Primero, mira los subprogramas. Los subprogramas son exactamente como están en un lenguaje de programación convencional, C o Ada, por ejemplo. Las funciones resumen sobre expresiones, los procedimientos (= funciones nulas) resumen sobre declaraciones. Y normalmente se llaman dentro del código secuencial, es decir, dentro de un proceso ... y el proceso es clave aquí ...

(para completar, las funciones también se pueden llamar fuera de un proceso, por ejemplo, en una declaración para inicializar una matriz o bloque de memoria)

Ahora, un proceso se asemeja a un programa completo de C (ignorando la bifurcación, unión, pthread library, etc. de C que crea múltiples procesos; lo mismo ocurre con la multitarea de Ada)

Cuando lo inicia, se ejecuta hasta que se completa y se detiene, a menos que contenga una declaración wait (VHDL) o una llamada sleep() (C). Y en VHDL para hardware, la forma normal de proceso se inicia automáticamente cuando cualquier señal en su lista de sensibilidad (por ejemplo, clock ) está activa.

(Piense en clock o cualquier otra señal en VHDL como un canal de comunicación de algún otro proceso; si ha usado tuberías con nombre en C, obtendrá la idea básica, pero usar las señales es mucho más fácil)

Comprenda los procesos correctamente, incluido el hecho de que pueden usar variables exactamente como su programa Ada o C usa variables - y pueden usar señales de manera diferente, como comunicación con otros procesos , y podemos pasar a los componentes.

Ahora puede ver un diseño VHDL compuesto de muchos procesos, todos ellos comunicándose entre sí mediante señales. Cada proceso, internamente, se comporta como un simple programa C o Ada. (Tenga en cuenta que las declaraciones VHDL concurrentes, como las asignaciones de señales, son realmente una forma abreviada de escritura de procesos, por lo que a nivel concurrente, todo es un proceso. Y a nivel secuencial, es decir, dentro de un proceso, todo es una declaración o expresión) p>

Pero, ¿qué abstrae sobre procesos, de la misma manera que las funciones sobre expresiones?

Primero: entidades / arquitecturas.

  • Una entidad define la interfaz para un proceso (o un grupo de procesos), es decir, sus puertos son las señales entrantes y salientes. Tenga en cuenta la similitud con la lista de argumentos de un subprograma.
  • Una arquitectura proporciona una implementación de la entidad.

Y finalmente

  • Un componente describe una entidad que desea utilizar en su diseño. Todavía no es necesario que exista en realidad, pero cuando construyes el diseño (llamado "elaboración", un poco como un enlace) se buscará en las bibliotecas una entidad que coincida con la declaración del componente. Y luego, no encontrar una coincidencia exacta (¿estás usando las bibliotecas adecuadas?) Será un error.

En realidad, puede instanciar entidades directamente en una arquitectura VHDL y evitar tratar con los componentes por completo: esto implica especificar la biblioteca precisa en la que desea encontrarla, y si está haciendo esto, la entidad ya debe existir.

EDITAR: ¿qué hace la síntesis con una función? Lo implementa, o si se vuelve demasiado inteligente con las herramientas de sintetizador con errores más antiguas, informa un error. Tomando una suma de enteros como ejemplo:

  • si ambos argumentos reales son constantes, realiza la optimización de "plegamiento constante" y no genera hardware para la adición
  • si ambos argumentos son señales o variables, probablemente generará un sumador del tamaño correcto (deducido del tipo de los argumentos y el resultado), es decir, si los argumentos y el resultado son todos 'rango natural de 0 a 7 ", generará un sumador sin firmar de 3 bits.
  • TENGA EN CUENTA que, dada esta restricción de rango, agregar 7+7 es un comportamiento erróneo. En la simulación, asignar el resultado reportaría un error (a menos que esté utilizando un simulador roto donde las verificaciones de rango están desactivadas de forma predeterminada, como Xilinx ISIM). Sin embargo, se permite a la síntesis asumir que usted ha verificado la corrección en la simulación, por lo que tiene permiso para hacer cualquier cosa con el código dañado. En la práctica, es probable que se complete alrededor de 7 + 7 = 6 o lo que sea más barato en hardware.
  • En una etapa posterior, se optimizará agresivamente: así que si agrega 1 a una variable, y un incrementador es más barato que un sumador, eso es lo que obtiene.
  • O si no usa el resultado, recortará agresivamente el sumador y cualquier cosa que conduzca a generar ambos argumentos (si no se usan en ningún otro lugar).

Entonces, consiga el diseño correcto en la simulación primero ...

    
respondido por el Brian Drummond
1

Una respuesta muy simplista: Un componente hace referencia a una entidad que es un contenedor de código concurrente (multiproceso). Para la síntesis, piense en la creación de hardware de propósito general.

Un subprograma (procedimiento / función) es un contenedor de código secuencial (un solo hilo). Para la síntesis, piense en pequeñas piezas de hardware (como Mux2, Mux4). Tenga en cuenta que algunos pasan por su práctica de diseño utilizando solo subprogramas disponibles en bibliotecas estándar y sin escribir ninguno de los suyos (para el diseño de RTL).

Donde creo que escribir tus propios subprogramas te beneficiará más es al escribir bancos de pruebas. Piense en capturar el comportamiento de la interfaz, como UartSend o CpuWrite / CpuRead en un procedimiento. Luego, para crear una prueba, todo lo que tiene que hacer es llamar los procedimientos varias veces desde un proceso como se muestra a continuación. Seguro que es mejor escribir el código directamente.

UartTestProc : process
begin
  Wait until DUT_READY ; 
  UartSend(X"4A", SDO, Clk) ; 
  UartSend(X"4B", SDO, Clk) ; 
  . . . 
    
respondido por el Jim Lewis

Lea otras preguntas en las etiquetas