VHDL: uso del operador '*' al implementar multiplicadores en el diseño

9

Los FPGA actuales se han incorporado en bloques DSP, los FPGA más recientes incluso se han construido en unidades de punto flotante compatibles con IEEE-754.

Es posible crear una entidad / módulo DSP usando una GUI después de seleccionar los parámetros requeridos en él, y luego crear una instancia en el diseño.

¿Cuándo debemos realizar este tipo de micromanagmento en un diseño de instalación de bloques DSP reales y cuándo ingresamos un operador '*' en el código y dejamos que la herramienta de síntesis maneje los detalles de bajo nivel? ¿Cuál es mejor?

Hay muchos tipos diferentes de algoritmos de multiplicación cuando se trata de la multiplicación binaria. Dado que ahora hemos incorporado bloques DSP en silicio e incluso hemos incorporado multiplicadores de punto flotante, ¿esto significa que todos esos algoritmos no se han vuelto obsoletos?

    
pregunta quantum231

5 respuestas

5

Yo mismo lo he hecho varias veces.

En general, las herramientas de diseño elegirán entre una implementación de estructura y un segmento DSP según la configuración de síntesis.

Por ejemplo, para Xilinx ISE, en la configuración del proceso de síntesis, Opciones de HDL, hay una configuración "-use_dsp48" con las opciones: Auto, AutoMax, Sí, No. Como puede imaginar, esto controla la fuerza con la que las herramientas intentan colocar los segmentos DSP. Una vez tuve un problema en el que multiplicaba un entero por 3, lo que infería un segmento DSP, excepto que ya estaba inferiendo manualmente cada segmento DSP en el chip, ¡así que el sintetizador falló! Cambié la configuración a No, porque ya estaba usando cada segmento de dsp.

Esta es probablemente una buena regla de oro (acabo de hacer): Si su diseño tiene una velocidad de reloj de menos de 50 MHz y probablemente va a usar menos del 50% de los segmentos DSP en el chip, entonces solo use los operadores *, + y -. esto inferirá cortes de DSP sin registros de canalización. Esto realmente limita la velocidad máxima. (No tengo idea de lo que sucede cuando usas la división)

Sin embargo, si parece que vas a ejecutar los cortes más cerca de la velocidad máxima del corte DSP (333 MHz para el grado de velocidad normal de Spartan 6) De todos los cortes, deberías inferirlos manualmente.

En este caso, tienes dos opciones.

Opción 1: utilizar manualmente la plantilla de creación de instancias de DSP sin formato. Opción 2: usar un bloque de IP de Xilinx Core Generator. (Yo usaría esta opción. Al mismo tiempo, aprenderá todo sobre Core Gen, lo que ayudará en el futuro)

Antes de hacer cualquiera de estas acciones, lea las dos primeras páginas de la guía del usuario de DSP. En el caso del Spartan 6, (DSP48A1), sería Xilinx doc UG389: enlace

Considere primero la opción Core Generator. Por lo general, creo un proyecto de prueba en Core Generator para la parte con la que estoy trabajando, donde creo cualquier número de bloques de IP solo para aprender el sistema. Luego, cuando estoy listo para agregar uno a mi diseño en ISE, hago clic derecho en la Jerarquía de Diseño, hago clic en la nueva fuente y selecciono "IP (Generador de CORE y Asistente de Arquitectura)" para poder editar y regenerar el bloque directamente desde mi proyecto.

En Core gen, eche un vistazo a los diferentes bloques de IP que puede elegir: hay unas pocas docenas, la mayoría de las cuales son muy interesantes.

El núcleo multiplicador es lo que debes ver primero. Echa un vistazo a cada página, y haga clic en el botón de hoja de datos. Las partes importantes son los anchos de bits de enteros, las etapas de la tubería (latencia) y cualquier señal de control. Esto produce el bloqueo más simple posible al quitar todos los puertos que no necesita.

El año pasado, cuando estaba creando un filtro IIR de orden de 5 por 3, tuve que usar la plantilla de creación de instancias manual ya que estaba creando una implementación muy personalizada, con 2 rebanadas DSP sincronizadas 4 veces más rápido que la frecuencia de muestreo. Fue un dolor total.

    
respondido por el Marcus10110
12

Si solo quiere multiplicar dos números y se ajustan al bloque DSP, el operador * debería inferir un bloque DSP. Si no, envía la herramienta de síntesis de vuelta :)

Sin embargo, para aprovechar las combinaciones más complejas de la funcionalidad DSP a menudo se requiere una instanciación directa del bloque y la configuración de sus parámetros. Ejemplos de cosas que pueden no estar bien asignadas por inferencia (usando Xilinx DSP48E1 como ejemplo):

  • Uso de la pre-adicion
  • Uso del acumulador posterior
  • Uso del detector de patrones
  • Uso de la unidad lógica

Y especialmente las combinaciones de los anteriores.

Las herramientas de síntesis aún no son lo suficientemente buenas para mapear combinaciones completamente arbitrarias de lógica y aritmética de la manera más eficiente que se pueda esperar.

    
respondido por el Martin Thompson
3

Si hay bloques DSP presentes, debería usarlos si puede, ya que será más eficiente que usar LUT para hacer lo mismo. A menos que no necesite una multiplicación de alto rendimiento, en cuyo caso debería implementar, por ejemplo, un sumador y un registro de turnos para ahorrar espacio.

Sin embargo, me gustaría inferir bloques DSP antes de entrar en las herramientas GUI. El manual Xilinx XST tiene "recetas" de HDL sobre cómo instanciar bloques DSP con verilog puro / VHDL. Básicamente, si agrega suficientes registros antes y / o después de los multiplicadores, XST utilizará un bloque DSP para implementar la operación automáticamente. Puede consultar los registros de síntesis para ver si está inferiendo los bloques DSP correctamente. Supongo que Altera tiene algo similar.

Por cierto, solo estaba reflexionando sobre esto hace unos minutos, ya que actualmente estoy trabajando en una implementación de tornado Mersenne que solo usa un multiplicador para la inicialización inicial. La implementación de mi primer paso no cumple con el tiempo, pero la funcionalidad es correcta. XST también pone la operación de multiplicación en bloques DSP, sin embargo, no está optimizada, por lo que se ejecuta casi la mitad de la velocidad que quisiera. Probablemente reimplementaré la multiplicación utilizando una técnica de cambio y adición que tomará 32 veces el número de ciclos de reloj, pero ya no requerirá un multiplicador de hardware.

    
respondido por el alex.forencich
1

Depende de cuánta optimización necesites y de cuánta portátil debería ser tu diseño. Es un poco como un software, optimizando usando un poco de ensamblaje o dejando que el compilador elija las instrucciones. También puede tener algunas concesiones de tamaño / velocidad para que no pueda pagar un multiplicador combinatorio de doble precisión.

No sabía dónde había multiplicadores de FP cableados en los FPGA.

Un operador de multiplicación compatible con IEEE P754 adecuado para una CPU involucra más que un gran multiplicador: debe agregar los exponentes, cambiar los denormales, administrar infinitos y unas pocas banderas casi inútiles (inexactas, subdesbordamiento ...)

    
respondido por el TEMLIB
1

Leí este documento enlace :

  

Si bien las funciones que caben en un solo bloque DSP se pueden sintetizar de manera eficiente a partir de un código RTL segmentado, hemos encontrado que las funciones más complejas que requieren múltiples bloques DSP sufren un menor rendimiento. Una descripción RTL estándar de una función matemática se puede canalizar en gran medida, por ejemplo, después de cada operación, sin embargo, dado que esta canalización puede no tener en cuenta la estructura y las etapas internas del bloque DSP, el diseño sintetizado resultante puede exhibir un rendimiento inferior al estándar ya que los bloques DSP se combinan de una manera que no les permite ejecutarse a toda velocidad.

Desearía poder encontrar la fuente de sus herramientas para verificar sus hallazgos.

    
respondido por el hlide

Lea otras preguntas en las etiquetas