Un pequeño cambio en el módulo Verilog da como resultado un gran cambio en el consumo de energía (Synopsys Design Compiler)

Estoy comparando dos diseños de Verilog:

  • Diseño (1): un módulo superior que funciona con un reloj que funciona a 50 MHz, que es el reloj principal del sistema.

  • Diseño (2): El mismo módulo superior que en Diseño (1) con una diferencia, es decir, el reloj del sistema principal funciona a 400 MHz, pero utilizo un divisor de reloj dividido por 8 (/8) para obtener la misma frecuencia de reloj como Diseño (1).

Intuitivamente, los dos diseños deberían tener consumos de energía comparables. La razón principal detrás de esta intuición es que los dos módulos superiores de los dos diseños funcionan a la misma frecuencia de reloj de 50 MHz. Sin embargo, se espera que el Diseño (2) consuma un poco más de energía debido al uso del divisor de reloj superior.

Sin embargo, después de sintetizar los dos diseños con Synopsys Design Compiler, los informes de potencia de los dos diseños indican que el Diseño (1) consume 63,4 microvatios, mientras que el Diseño (2) consume 500 microvatios, es decir, el Diseño (2) consume casi 8 veces más potencia consumida por Diseño (1). Tenga en cuenta que las cifras de energía informadas se refieren al consumo total de energía, es decir, la suma de todas las categorías de energía.

En un esfuerzo por comprender la razón detrás de esta potencia 8 veces mayor, sospeché que el divisor de reloj /8 es el responsable. Sin embargo, después de sintetizar el divisor solo (por sí mismo) con una frecuencia de reloj maestro de 400 MHz, su consumo de energía total resulta ser de solo 35,4 microvatios. Los números no parecen cuadrar de alguna manera, ¿no?

De todos modos, espero que alguien pueda explicarme la fuente de esta potencia 8 veces mayor, por favor. Gracias de antemano.

PD: Supongo que la pregunta no necesita mis fuentes Verilog y scripts de síntesis, ¿verdad? De todos modos, avíseme si son necesarios y actualizaré la pregunta con más detalles.

Respuestas (5)

He visto que algunos sintetizadores son lo suficientemente inteligentes como para optimizar expresiones lógicas.

Si el código fuente, por ejemplo, contiene:

(A or B) and (A or C)

... en realidad producirán la siguiente lógica en el FPGA:

A or (B and C)

Si su sintetizador lo hizo, puede suceder que no solo el divisor /8 "vea" la señal de 400 MHz.


Un ejemplo hipotético:

Bpodría ser una señal de entrada de 400 MHz y Cpodría ser otra señal que se comporte de tal manera que la expresión B and Cresulte en una señal de 50 MHz. El ciclo de trabajo de B and Cno sería del 50% en este caso, pero el ciclo de trabajo no es tan importante para el consumo de energía de los circuitos CMOS.

Si tiene el siguiente código (aquí pseudocódigo, no Verilog):

Z = B and C
Y1 = X1 or Z
Y2 = X2 or Z
...
Y100 = X100 or Z

... se podría pensar que solo una celda lógica recibe una señal de 400 MHz: La que genera la señal Z.

Sin embargo, el optimizador podría optimizar la lógica de la siguiente manera:

Y1 = X1 or (B and C)
Y2 = X2 or (B and C)
...
Y100 = X100 or (B and C)

... lo que significa que todas las celdas lógicas funcionan con 400 MHz.

Para muchos tipos de FPGA, el consumo de energía de una celda depende principalmente de la señal de entrada más rápida de esa celda, mientras que las otras señales de entrada tienen un impacto menor en el consumo de energía.

Tenga en cuenta también que algunos FPGA tienen "líneas de reloj global" que son entradas para todas las celdas lógicas utilizadas (tal vez incluso si la señal no se utiliza). Introducir una señal de alta frecuencia en esa línea sería una mala idea.

Lo siento, pero no pude ver cómo algunas optimizaciones lógicas pueden conducir a un aumento en el consumo de energía. ¿Es posible dar un ejemplo?
@ user84204884834329 Agregué un ejemplo a la respuesta.
+1 para aclaración; sin embargo, necesitaré más tiempo para digerir su ejemplo y verificar que sea una respuesta correcta a mi pregunta.

El punto de partida de su investigación podría ser las herramientas de Quartus -> Netlist Viewers -> RTL Viewer, encuentre su señal de 400 MHz en el mapa y rastree a dónde va.

El reloj de 50 MHz debe limitarse a la salida del divisor de reloj. Design Compiler no calcula una división de reloj por sí mismo. Propaga el reloj principal (400 MHz) o detiene la propagación al resto del circuito, pero nunca propaga un reloj de 50 MHz a menos que el usuario defina las restricciones requeridas.

Mmm, interesante (+1). Dos preguntas de seguimiento, por favor: (1) ¿Está esto documentado en alguna parte del manual de DC? (2) ¿Hay alguna manera de definir los 400 MHz como un reloj maestro y la salida del divisor de reloj como un reloj secundario? (3) Muestre cómo restringir el reloj de 50 MHz.
Los documentos de DC no son públicos y solo se distribuyen a los clientes, pero otros proveedores de herramientas también admiten las restricciones de diseño de Synopsys (SDC). Por ejemplo, Xilinx tiene un documento , solo busque create_clocky create_generated_clockordene en él.

Bueno, su consumo de energía solo aumentó aproximadamente 8 veces.

Está ejecutando un pequeño circuito que funciona a 8 veces la velocidad del reloj original, este pequeño circuito usa registros para contar hasta 8 para dividir la velocidad del reloj, supongo. Los registros usan más energía que la lógica y usted está actualizando estos registros a una velocidad de 500 MHz.

Ahí es donde va toda la energía.

(1) Edité la pregunta y corregí el "10X" a "8X" como se sugirió. (2) La síntesis del divisor de reloj por sí solo da como resultado un consumo de energía de 35,4 microvatios. Esto es mucho menos que el poder total del Diseño (2). Por lo tanto, con todo respeto, dudo que la energía sea extraída por el divisor del reloj.

La estimación de potencia a veces no es lo suficientemente buena a menos que ayudemos a las Herramientas a hacer el trabajo correcto.

En su caso, el divisor de salida PLL debe estar restringido para indicar exactamente el reloj utilizado por su lógica impulsada. de lo contrario, las herramientas entienden solo 400 MHz como reloj principal. La realidad es que la potencia real en el chip es menor porque está alimentando un reloj real de 50 MHz. Como el divisor de reloj de alta frecuencia alterna a alta frecuencia, es obvio que consume un poco más de energía, pero el diseño real no consume una cantidad increíble de energía. Restringir el divisor del reloj de salida debería resolver el problema:

https://www.intel.com/content/dam/www/programmable/us/en/pdfs/literature/manual/mnl_timequest_cookbook.pdf

https://www.xilinx.com/support/documentation/sw_manuals/xilinx2018_1/ug903-vivado-using-constraints.pdf

https://www.microsemi.com/document-portal/doc_download/131597-design-constraints-guide