¿Qué es el sesgo del reloj y por qué puede ser negativo?

Mi compilador HDL (Quartus II) genera informes de tiempo. En él, los nodos tienen una columna de "sesgo de reloj". La única definición de sesgo de reloj que encontré está en la documentación de TimeQuest (consulte la página 7-24):

Para especificar manualmente la incertidumbre del reloj, o sesgo, para las transferencias de reloj a reloj, utilice el set_clock_uncertaintycomando.

Entonces, si el sesgo es "incertidumbre", ¿por qué algunos de mis sesgos de reloj son negativos (por ejemplo, -0.048)? ¿Qué es exactamente el sesgo del reloj?

Respuestas (3)

De Wikipedia :

En un sesgo de reloj de circuito síncrono ( T S k mi w ) es la diferencia en el tiempo de llegada entre dos registros adyacentes secuencialmente. Dados dos registros adyacentes secuencialmente R i y R j con tiempos de llegada del reloj en los pines del reloj de registro como T C i y T C j respectivamente, entonces el sesgo del reloj se puede definir como:

T S k mi w i , j = T C i T C j

El sesgo del reloj puede ser positivo o negativo. Si las señales de reloj están en completa sincronía, entonces el sesgo de reloj observado en estos registros es cero.

Entonces, la cantidad de sesgo de reloj en un registro es relativa a otro registro. Como es relativo, puede ser positivo o negativo.

Algunas ilustraciones:

sesgo positivo/negativo sesgo adelantado/rezagado

Tomemos, por ejemplo, una transferencia intraclock como se define en el documento de TimeQuest que proporcionó:

Las transferencias dentro del reloj ocurren cuando la transferencia de registro a registro tiene lugar en el núcleo del dispositivo y los relojes de origen y destino provienen del mismo puerto de reloj o pin de salida PLL.

Entonces, si el registro de destino está físicamente más cerca del circuito de generación de reloj, entonces el reloj probablemente llegará al registro de destino antes de que llegue al registro de origen, lo que resultará en un sesgo de reloj adelantado que en realidad es positivo. Si el registro de destino recibiera el flanco del reloj después del registro de origen, el sesgo del reloj se retrasaría o sería negativo.

Dicho de otra manera, el sesgo de reloj es la incertidumbre acerca de qué tan juntos en el tiempo un borde de reloj alcanzará dos registros separados dados en unidades de tiempo con respecto a un registro de origen en una transferencia de registro a registro.

Ampliar esa definición para incluir transferencias entre relojes y tiempos de configuración y espera se vuelve un poco complicado. Por lo tanto, probablemente sea más fácil pensar en ello como "cuán sincrónico" es un borde o un tiempo de espera entre dos registros. Tendemos a pensar en "sincrónico" como "que ocurre al mismo tiempo". Pero las cosas rara vez ocurren exactamente al mismo tiempo. Así que tenemos que poner una tolerancia en ese momento. Y las tolerancias a menudo se expresan en términos de positivo y negativo (es decir, ±).

Los dispositivos lógicos digitales modernos generalmente se diseñan (*) con "prácticas de diseño síncrono": un estilo de diseño de transferencia de registro (RTL) activado por flanco globalmente sincrónico: todos los circuitos secuenciales se dividen en registros activados por flanco conectados a la señal de reloj global CLK y lógica combinacional pura.

Ese estilo de diseño permite a las personas diseñar rápidamente sistemas lógicos digitales sin tener en cuenta el tiempo. Su sistema "simplemente funcionará" siempre que haya suficiente tiempo de un borde de reloj al siguiente para que se estabilice el estado interno.

Con este estilo de diseño, el sesgo del reloj y otros problemas relacionados con el tiempo son irrelevantes, excepto para averiguar "¿Cuál es la frecuencia de reloj máxima para este sistema?".

¿Qué es exactamente el sesgo del reloj?

Por ejemplo:

...
     R1 - register 1              R3
     +-+                  
   ->| |------>( combinational  )  +-+
...->| |------>(         logic  )->| |--...
   ->|^|------>(                )->|^|
     +-+       (                )  +-+
      |   +--->(                )   |
     CLK  | +->(                )  CLK
          | |
     R2:  | |
     +-+  | |               
...->| |->+ |
   ->|^|->--+
     +-+
      |
     CLK

En hardware real, la señal "CLK" nunca cambia exactamente simultáneamente en cada registro. El sesgo de reloj Tskew es el retraso del reloj aguas abajo en relación con el reloj aguas arriba ( a ):

Tskew(fuente, destino) = hora_destino - hora_fuente

donde source_time es el tiempo de un borde de reloj activo en el registro de origen ascendente (en este caso, R1 o R2), y Destination_time es el tiempo del "mismo" borde de reloj activo en algún registro de destino descendente (en este caso, R3) .

  • sesgo de reloj negativo: el CLK en R3 cambia antes que el reloj en R1.
  • sesgo de reloj positivo: el CLK en R3 cambia después del reloj en R1.

¿Cuál es el efecto del sesgo del reloj?

(quizás un diagrama de tiempo aquí lo aclararía)

Para que las cosas funcionen correctamente, incluso en el peor de los casos, las entradas de R3 no deben cambiar durante el tiempo de configuración o el tiempo de espera de R3. En otros peores, para que las cosas funcionen correctamente, debemos diseñar las cosas de tal manera que:

Tskew(R1, R3) < Tco - Th.

Tclk_min = Tco + Tcalc + Tsu - Tskew (R1, R3).

donde:

  • Tcalc es el tiempo máximo de establecimiento en el peor de los casos de cualquier bloque de lógica combinacional en cualquier parte del sistema. (A veces podemos rediseñar el bloque de lógica combinacional que está en la ruta crítica, empujando partes aguas arriba o aguas abajo, o insertando otra etapa de canalización, de modo que el nuevo diseño tenga un Tcalc más pequeño, lo que nos permite aumentar la frecuencia del reloj) .
  • Tclk_min es el período de tiempo mínimo desde un borde de reloj activo hasta el siguiente borde de reloj activo. Lo calculamos a partir de la ecuación anterior.
  • Tsu es el tiempo de configuración del registro. El fabricante de cajas registradoras espera que usemos un reloj lo suficientemente lento para cumplir siempre con este requisito.
  • Este es el tiempo de retención del registro. El fabricante de la caja registradora espera que controlemos el desfase del reloj lo suficiente como para cumplir siempre con este requisito.
  • Tco es el retraso del reloj a la salida (tiempo de propagación). Después de cada flanco de reloj activo, R1 y R2 continúan llevando los valores antiguos a la lógica combinacional durante un breve período de tiempo Tco antes de cambiar a los nuevos valores. Esto lo establece el hardware y lo garantiza el fabricante, pero solo mientras cumplamos con los requisitos Tsu y Th y otros requisitos que especifica el fabricante para el funcionamiento normal.

Demasiado sesgo positivo es un desastre absoluto. Demasiado sesgo positivo puede (con algunas combinaciones de datos) causar "caminos furtivos" de modo que, en lugar de que R3 enganche los "datos correctos" en el reloj N+1 (una función determinista de los datos previamente enclavados en R1 y R2 en el reloj N) , los nuevos datos bloqueados en R1 y R2 en el reloj N+1 pueden filtrarse, alterar la lógica combinacional y hacer que los datos incorrectos se enganchen en R3 en el "mismo" borde del reloj N+1.

Cualquier cantidad de sesgo negativo se puede "arreglar" disminuyendo la velocidad del reloj. Solo es "malo" en el sentido de que nos obliga a ejecutar el sistema a una velocidad de reloj más lenta, para dar tiempo a las entradas de R3 a establecerse después de que R1 y R2 enganchen nuevos datos en el borde del reloj N, y luego R3 bloquea el resultado en el "siguiente" borde del reloj N+1.

Muchos sistemas utilizan una red de distribución de reloj que intenta reducir el sesgo a cero. En contra de la intuición, al agregar cuidadosamente retrasos a lo largo de la ruta del reloj (la ruta desde el generador de reloj hasta la entrada CLK de cada registro), es posible aumentar la velocidad aparente a la que el frente de onda del borde del reloj viaja físicamente desde la entrada CLK de un registro hasta la entrada CLK de cada registro. La entrada CLK del siguiente registro es más rápida que la velocidad de la luz.

La documentación de Altera menciona

"Evite usar lógica combinacional en las rutas del reloj porque contribuye al sesgo del reloj".

Esto se refiere al hecho de que muchas personas escriben HDL que se compila en un FPGA de una manera que de alguna manera hace que algo diferente a la señal CLK global controle la entrada CLK local de algunos registros. (Esto puede ser una lógica de "compuerta de reloj" para que los nuevos valores se carguen en un registro solo cuando se cumplen ciertas condiciones; o una lógica de "divisor de reloj" que solo deja pasar 1 de N relojes, etc.). Ese CLK local generalmente se deriva del CLK global de alguna manera: el CLK global marca, y luego el CLK local no cambia, o (un breve retraso después del CLK global para que la señal se propague a través de ese "algo más") el CLK local cambia una vez.

Cuando ese "algo más" impulsa el CLK del registro descendente (R3), hace que el sesgo sea más positivo. Cuando ese "algo más" impulsa el CLK del registro ascendente (R1 o R2), hace que el sesgo sea más negativo. Ocasionalmente, lo que impulsa el CLK del registro ascendente y lo que impulsa el CLK del registro descendente tienen prácticamente el mismo retraso, lo que hace que el sesgo entre ellos sea prácticamente cero.

La red de distribución de reloj dentro de algunos ASIC está diseñada deliberadamente con pequeñas cantidades de sesgo de reloj positivo en algunos registros, lo que le da a la lógica combinacional ascendente un poco más de tiempo para establecerse y así todo el sistema puede ejecutarse a una velocidad de reloj más rápida. Esto se denomina "optimización de la desviación del reloj" o "programación de la desviación del reloj" y está relacionado con la " reprogramación ".

Todavía estoy desconcertado por el set_clock_uncertaintycomando: ¿por qué querría "especificar manualmente" el sesgo?

(*) Una excepción: sistemas asíncronos .

Creo que la idea detrás de agregar retraso para minimizar el sesgo del reloj a veces puede implicar retrasar el reloj casi un ciclo completo. Una vez que el reloj está funcionando, puede configurarlo para que el flip flop A vea el borde 1 del reloj al mismo tiempo que el flip flop B ve el borde 2 del reloj. Desde una vista externa, son bordes diferentes, pero el circuito no. No importa siempre y cuando los bordes estén perfectamente alineados.

el sesgo del reloj es cuando el reloj llega a diferentes puntos del circuito en diferentes momentos debido a la distancia, la capacitancia, etc., lo que puede provocar un mal funcionamiento. Creo que el negativo debe ser cuando el reloj llega a ese punto antes de llegar a la referencia.