Un pequeño cambio en el módulo Verilog produce un alto cambio en el consumo de energía (Synopsys Design Compiler)

2

Estoy comparando dos diseños de Verilog:

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

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

Intuitivamente, los dos diseños deben 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 se ejecutan a la misma frecuencia de reloj de 50MHz. 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 utilizando Synopsys Design Compiler, los informes de potencia de los dos diseños indican que el Diseño (1) consume 63.4 micro vatios, mientras que el Diseño (2) consume 500 micro vatios, es decir, el Diseño (2) consume Casi 8 veces la potencia consumida por Diseño (1). Tenga en cuenta que las cifras de potencia informadas se refieren al consumo total de energía, es decir, a la suma de todas las categorías de potencia.

En un esfuerzo por entender la razón detrás de esta potencia 8X superior, sospeché que el divisor de reloj / 8 es responsable. Sin embargo, después de sintetizar el divisor solo (todo por sí mismo) con una frecuencia de reloj principal de 400MHz, su consumo total de energía resulta ser solo de 35.4 micro vatios. Los números no parecen sumarse de alguna manera, ¿no?

De todos modos, espero que alguien pueda explicarme la fuente de este poder 8X superior, ¿por favor? Gracias de antemano.

PS: Supongo que la pregunta no necesita mis fuentes de Verilog ni los scripts de síntesis, ¿verdad? En cualquier caso, avíseme si son necesarios y actualizaré la pregunta con más detalles.

    

4 respuestas

3

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)

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

A or (B and C)

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

Un ejemplo hipotético:

B podría ser una señal de entrada de 400 MHz y C podría ser otra señal que se comporte de manera que la expresión B and C pueda dar como resultado una señal de 50 MHz. El ciclo de trabajo de B and C no 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í seudocódigo, no Verilog):

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

... 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 se controlan 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 menos impacto en el consumo de energía.

Tenga en cuenta 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). La introducción de una señal de alta frecuencia en una línea de este tipo sería una mala idea.

    
respondido por el Martin Rosenau
1

El punto de partida de su investigación podría ser Herramientas de Quartus - > Visores de la lista de redes - > Visor RTL, encuentre su señal de 400 MHz en el mapa y rastree a dónde va.

    
respondido por el Anonymous
1

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

    
respondido por el ahmedus
0

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

Usted está ejecutando un pequeño circuito que funciona a 8 veces la velocidad del reloj original, este pequeño circuito utiliza registros para contar hasta 8 para dividir la velocidad del reloj, supongo. Los registros utilizan más poder que la lógica y usted está actualizando estos registros a una velocidad de 500mghz.

Ahí es donde va toda la energía.

    
respondido por el Garret Gang

Lea otras preguntas en las etiquetas