Aumento no lineal en la utilización lógica para el diseño de FPGA

Estoy creando un diseño usando el FPGA de la serie Altera Stratix V GX. Para la comunicación del dispositivo host, usamos la interfaz PCIe x8.

La interfaz en sí ocupa 3058 ALM (de 234 720 disponibles).

Con 1 copia de una unidad de diseño personalizado, la cantidad de ALM aumenta a 3077, solo 19 más. Por lo tanto, deberíamos esperar que cualquier otra copia ocupe 19 unidades, ¿verdad?

Pero cuando compilamos con 4.096 copias de la misma unidad de diseño, se agotan 6.282 ALM, que es mucho menos de lo previsto. ¿Por qué parece que la utilización de la lógica aumenta de forma no lineal?

Porque las unidades tienen alguna parte común, que es idéntica y es reutilizada por todas ellas.
Las herramientas de síntesis son muy buenas para encontrar y eliminar lógica redundante.
Además, ¿has conectado tu interfaz a pines externos? Si no es así, es posible que muchos de ellos simplemente se sinteticen. Ninguna conexión es igual a no colocada en FPGA. Verifique el Visor RTL y vea si todo todavía está allí.
¿Cómo se interconectan estas 4096 unidades? La lógica de interconexión no escala de forma lineal.
Cada uno está conectado a un registro que está conectado a la interfaz PCIe.

Respuestas (1)

Esto huele a que algo podría estar mal con su lógica de usuario que da como resultado que gran parte se optimice. 4096 de cualquier cosa debería consumir MUCHOS recursos lógicos. ¿Funciona correctamente el diseño del elemento 4096 en el FPGA real?

¡Sí, funciona correctamente!
En ese caso, su diseño debe ser extremadamente simple. Lo suficientemente simple como para que el motor de síntesis pueda empaquetar cada instancia en un ALM. Comparando solo la interfaz y las 4096 instancias, eso es aproximadamente 0,8 ALM por instancia. ¿Cuáles son estas unidades, de todos modos?