¿Cómo identificar las áreas de un diseño de FPGA que utilizan la mayor cantidad de recursos y área?

Estoy trabajando en un gran diseño de FPGA y estoy muy cerca de los límites de recursos del FPGA que estoy usando actualmente, el Xilinx LX16 en el paquete CSG225.

El diseño también está casi completo, sin embargo, por el momento ya no cabe en el FPGA. Puedo apagar las piezas para que encaje, sin embargo, necesito reducir el uso de recursos para completar el diseño y cumplir con los requisitos de tiempo y tamaño.

Me gustaría saber si hay alguna herramienta en nuestros informes que pueda ayudarme a identificar qué partes de mi diseño consumen la mayor cantidad de recursos. Mi diseño no está particionado y está dividido en una docena o más de módulos VHDL.

Los informes de tiempo de Xilinx son fantásticos, pero ahora necesito saber dónde puedo obtener mi mejor inversión en términos de ahorro de espacio.

También me cuesta decir qué tipo de recursos me estoy quedando sin, o qué efectos tienen esos recursos.

Otra molestia es que a medida que el diseño se hace más grande, los componentes que solían cumplir con los tiempos comienzan a fallar porque su ubicación ya no es la ideal.

Actualmente, utilizo los informes de tiempo Post-Place y Route Static, y utilizo SmartXplorer. Estoy usando estrategias de diseño para optimizar el tiempo.

Después de desactivar parte de mi diseño para que encaje, estos son algunos de los resultados:

utilización de registro de segmento: 42 % utilización de LUT de segmento: 96 % número de pares LUT-FF completamente usados: 38 % ¿Significa esto que soy ligero en registros, pero uso mucho la puerta?

¿Existen herramientas para ayudar a los desarrolladores a optimizar por área, o al menos darles más información sobre su código?

Actualización: después de mirar la utilización del nivel del módulo, descubrí que tenía pequeños fifos asíncronos de pegamento por todas partes que ocupan aproximadamente el 30% del total de LUT. Los estoy usando como pegamento de dominio de reloj cruzado para autobuses de alta velocidad. Debería poder eliminarlos, ya que los relojes están estrechamente relacionados. (entrada de 120 MHz, produce 100 MHz y 200 MHz a través de DCM)

Parece que tienes muchas interconexiones entre las señales, estoy seguro de que puedes arreglar eso cambiando los niveles de optimización, recursos compartidos y demás. ¿Qué herramienta estás usando? ¿ISE o Vivado?
Estoy usando ISE (Vivado no es compatible con Spartan-6). Publiqué esto en los foros de Xilinx y me dijeron que activara el Informe detallado del mapa. Hice esto, y el archivo *.mrp ahora contiene la Sección 13 - Utilización por jerarquía. Publicaré los datos una vez que los tenga mejor formateados.

Respuestas (3)

Publiqué esta pregunta en el foro de Xilinx aquí: http://forums.xilinx.com/t5/Implementation/How-to-determine-what-part-of-the-design-consumes-the-most/td-p /393247

Esta respuesta se basa en gran medida en los comentarios allí. Gracias a Deepika, Sikta y Gabor.

Primero, habilite 'Generar informe MAP detallado' en las propiedades del proceso de mapa (-detalle).

Luego, abra el Resumen de diseño y navegue hasta Utilización de nivel de módulo. Aquí está la jerarquía completa, que muestra la utilización del diseño exclusivo e inclusivo.

Cada línea mostrará un par de números como 0/5392. Esto significa que ese módulo contiene cero de ese elemento específico, pero ese módulo y todos sus submódulos contienen un total de 5392 elementos.

Aquí está mi salida (parcialmente ampliada)Informe de utilización

Cuando trabaje para reducir el tamaño, Gabor recomienda cambiar a un FPGA más grande en las herramientas de sintetizador para que pueda mapear completamente incluso cuando sea demasiado grande para caber en su FPGA actual, y hará que las herramientas se ejecuten más rápido.

Parece que está utilizando casi todos los recursos lógicos y solo utiliza la mitad de los registros. Parece que necesitas descubrir qué está consumiendo todas tus LUT. Hay formas de optimizar componentes particulares y hacerlos un poco más eficientes en cuanto al espacio, como RAM, registros de desplazamiento y máquinas de estado. Mire el archivo .log resultante del sintetizador. Le dirá qué tipo de componentes se están infiriendo. Asegúrese de que esté infiriendo los componentes correctamente. Si no es así, es posible que no esté generando una netlist particularmente eficiente. Puede saber mucho con solo mirar los archivos de registro de síntesis. Es posible que algunos cambios menores en su código permitan que el sintetizador infiera varios componentes, así que eche un vistazo al manual del sintetizador para ver alguna plantilla. Es posible que deba cambiar el sintetizador para optimizar el área en lugar de la velocidad. Además, verifique que no tenga ninguna configuración de inferencia desactivada. Una vez traté de sintetizar un componente de diseño que consumía el 40 % de un Spartan 3E 500 (9312 pares LUT/FF de 4 entradas, bloque de RAM de 5,6 KB) para un Virtex 6 HXT 565 (354 240 pares LUT/FF doble de 6 entradas, 32 Bloque de MB de RAM). Xilinx par tardó 7 horas en terminar y ocupó alrededor del 40% del chip. ?!?!?!? Resulta que el bloque de inferencia de RAM se apagó y el sintetizador convirtió varios KB de RAM en LUT. No es la decisión más eficiente de la historia. Después de cambiar la configuración, ocupaba como el 1% del chip. Imagínate. 312 pares LUT/FF de 4 entradas, bloque de RAM de 5,6 KB) para un Virtex 6 HXT 565 (354 240 pares LUT/FF dual de 6 entradas, bloque de RAM de 32 MB). Xilinx par tardó 7 horas en terminar y ocupó alrededor del 40% del chip. ?!?!?!? Resulta que el bloque de inferencia de RAM se apagó y el sintetizador convirtió varios KB de RAM en LUT. No es la decisión más eficiente de la historia. Después de cambiar la configuración, ocupaba como el 1% del chip. Imagínate. 312 pares LUT/FF de 4 entradas, bloque de RAM de 5,6 KB) para un Virtex 6 HXT 565 (354 240 pares LUT/FF dual de 6 entradas, bloque de RAM de 32 MB). Xilinx par tardó 7 horas en terminar y ocupó alrededor del 40% del chip. ?!?!?!? Resulta que el bloque de inferencia de RAM se apagó y el sintetizador convirtió varios KB de RAM en LUT. No es la decisión más eficiente de la historia. Después de cambiar la configuración, ocupaba como el 1% del chip. Imagínate.

Valdría la pena publicar la sección completa de 'uso de recursos' de la salida de la herramienta.

¿Usas todas las RAM de bloque? Es común poder reemplazar las funciones lógicas/matemáticas con tablas de búsqueda de RAM equivalentes si el dominio está lo suficientemente restringido y tienen la complejidad suficiente para que valga la pena realizar un cálculo previo.

Así como la inferencia de la memoria, lo mismo aplica para los Multiplicadores. A veces, una pequeña desviación de la plantilla de creación de instancias recomendada puede descartar el multiplicador que se infiere a las unidades DSP48A.

Si está utilizando el controlador PCIe, ¿puede reducir el espacio de búfer total reservado para las cargas útiles de TLP o el tamaño máximo de paquete de TLP? Esto puede reducir el uso de RAM/lógica del núcleo de IP a costa del ancho de banda total/puesto.

Con (Altera) Quartus, puede seleccionar múltiples elementos en la vista de jerarquía de diseño y ver el uso del área post-p&r codificado por color/agrupado. Esto puede dar una idea visual del uso relativo de sus módulos de diseño.

Gracias. Estoy usando las macros IP duras para los multiplicadores y usé CoreGen para hacer los FIFO, aunque seleccioné algunos de los FIFO pequeños para usar RAM distribuida (en lugar de RAM en bloque). Voy a mirar en su uso.