Estoy sintetizando algunas unidades de multiplicación en Verilog y me preguntaba si generalmente se obtienen mejores resultados en términos de ahorro de área/energía si se implementa un CSA propio utilizando Booth Encoding al multiplicar o si simplemente se utiliza el símbolo * y se deja que la herramienta de síntesis se encargue del problema por ti.
Respuestas
¿Demasiados anuncios?Si tus herramientas de síntesis son buenas, deberías usar el operador *, establecer restricciones razonables y dejar que las herramientas hagan el trabajo pesado. Esto es especialmente cierto en el caso de las FPGAs, que pueden tener celdas multiplicadoras muy rápidas y densas. La serie Spartan-3 de Xilinx, por ejemplo, tiene unas celdas multiplicadoras de 9x9 muy buenas. Si insistes en escribir ecuaciones lógicas para tu propio multiplicador CSA, el sintetizador puede no ser capaz de inferir que realmente quieres un multiplicador, y el resultado utilizaría un montón de LUTs mientras las celdas del multiplicador permanecen ociosas.
Deje que la herramienta de síntesis decida.
A menos que esté interesado en los resultados intermedios de la multiplicación, no habrá grandes ganancias en el enfoque manual. De hecho, dadas las amplísimas estrategias de optimización presentes en las herramientas de síntesis actuales, lo mejor que puedes conseguir manualmente en términos de rendimiento/área/potencia es lo mismo (y hay muchas posibilidades de que tu implementación manual sea peor).
El único escenario (en mi opinión) en el que no se deja que la herramienta de síntesis se encargue de la multiplicación es cuando hay librerías/módulos estándar para multiplicadores disponibles (librerías en ASICs, módulos en FPGA). Este enfoque se utiliza a veces en partes críticas de los sistemas (críticas en términos de rendimiento/área/energía). Estas celdas se adaptan a un uso concreto (a nivel de diseño) y no hay posibilidad de que el RLS lo haga mejor.
A no ser que establezcas algunos nodos internos de tu multiplicador de codificación Booth como salidas, la herramienta de síntesis derivará la lógica de bajo nivel. Como la entrada y las salidas de los dos enfoques son exactamente iguales, una buena herramienta de síntesis los optimizaría exactamente de la misma manera, y el resultado no sería diferente. La única forma de forzar a la herramienta de síntesis a implementar un multiplicador de cabina es dividirlo en varios bloques y desactivar la optimización de los límites.