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

11

Estoy trabajando en un gran diseño 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 se ajusten, 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 nuestros informes tienen alguna herramienta que pueda ayudarme a identificar qué partes de mi diseño consumen más recursos. Mi diseño no está particionado, y está dividido en una docena o más de módulos VHDL.

Los informes de sincronización 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 se me están acabando 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 el tiempo comienzan a fallar porque su ubicación ya no es la ideal.

Actualmente, uso los informes de temporización estática posterior al lugar y en ruta, y uso SmartXplorer. Estoy usando estrategias de diseño para optimizar el tiempo.

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

utilización de registro de corte: 42% utilización de LUT de corte: 96% número de pares LUT-FF completamente utilizados: 38% ¿Significa esto que tengo poco uso de registros, pero mucho uso de puerta?

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

Actualización: Después de mirar la Utilización a nivel de módulo, descubrí que tenía pequeñas cantidades de pegamento asíncrono en todo el lugar que ocupan aproximadamente el 30% del total de LUT. Los estoy usando como pegamento de dominio 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)

Marcus10110
fuente
Parece que tiene muchas interconexiones entre las señales, estoy seguro de que puede solucionarlo cambiando los niveles de optimización, el intercambio de recursos y demás. ¿Qué herramienta estás usando? ISE o Vivado?
FarhadA
1
Estoy usando ISE (Vivado no admitirá 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 tenga un mejor formato.
Marcus10110

Respuestas:

5

Crucé esta pregunta en el Foro 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 detallado de MAP' en las propiedades del proceso del mapa (-detalle).

Luego, abra el Resumen de diseño y navegue hasta la Utilización a nivel de módulo. Aquí está la jerarquía completa, que muestra la utilización de 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 expandida) 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 funcionen más rápido.

Marcus10110
fuente
3

Parece que está utilizando casi todos los recursos lógicos mientras usa solo la mitad de los registros. Parece que necesitas descubrir qué está consumiendo todos 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 infieren. Asegúrese de inferir los componentes correctamente. Si no es así, es posible que no esté generando una lista de redes particularmente eficiente. Puede decir mucho simplemente mirando los archivos de registro de síntesis. Es posible que algunos cambios menores en su código permitan al sintetizador inferir varios componentes, así que eche un vistazo al manual del sintetizador para 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 inferir desactivada. Una vez intenté sintetizar un componente de diseño que consumía el 40% de un Spartan 3E 500 (9,312 pares LUT / FF de 4 entradas, 5,6 KB de RAM en bloque) para un Virtex 6 HXT 565 (354,240 pares LUT / doble FF de 6 entradas, 32 MB bloque RAM). Xilinx par tardó 7 horas en terminar y ocupó aproximadamente el 40% del chip. ?!?!?!? Resulta que el bloque infer infer RAM estaba apagado, y el sintetizador convirtió varios KB de RAM en LUT. No es la decisión más eficiente jamás. Después de cambiar la configuración, tomó como el 1% del chip. Imagínate. 312 pares LUT / FF de 4 entradas, 5,6 KB de RAM en bloque) para un Virtex 6 HXT 565 (354,240 pares LUT / FF duales de 6 entradas, 32 MB de RAM en bloque). Xilinx par tardó 7 horas en terminar y ocupó aproximadamente el 40% del chip. ?!?!?!? Resulta que el bloque infer infer RAM estaba apagado, y el sintetizador convirtió varios KB de RAM en LUT. No es la decisión más eficiente jamás. Después de cambiar la configuración, tomó como el 1% del chip. Imagínate. 312 pares LUT / FF de 4 entradas, 5,6 KB de RAM en bloque) para un Virtex 6 HXT 565 (354,240 pares LUT / FF duales de 6 entradas, 32 MB de RAM en bloque). Xilinx par tardó 7 horas en terminar y ocupó aproximadamente el 40% del chip. ?!?!?!? Resulta que el bloque infer infer RAM estaba apagado, y el sintetizador convirtió varios KB de RAM en LUT. No es la decisión más eficiente jamás. Después de cambiar la configuración, tomó como el 1% del chip. Imagínate.

alex.forencich
fuente
3

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

¿Utiliza todos los 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á suficientemente restringido, y son de suficiente complejidad para que valga la pena realizar el cálculo previo.

Además de la inferencia de la memoria, lo mismo se aplica a los multiplicadores. A veces, una pequeña desviación de la plantilla de creación de instancias recomendada puede arrojar el multiplicador que se infiere a las unidades DSP48A.

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

Con (Altera) Quartus, puede seleccionar múltiples elementos en la vista de jerarquía de diseño y ver allí 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.

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