Los dispositivos lógicos digitales modernos generalmente están diseñados (*) con "práctica de diseño sincrónico": un estilo de diseño de transferencia de registro (RTL) activado por borde globalmente sincrónico: todos los circuitos secuenciales se dividen en registros activados por borde conectados a la señal de reloj global CLK y pura lógica combinacional.
Ese estilo de diseño permite a las personas diseñar rápidamente sistemas de lógica digital sin tener en cuenta el tiempo. Su sistema "simplemente funcionará" siempre que haya suficiente tiempo de un borde del reloj al siguiente para que el estado interno se estabilice.
Con este estilo de diseño, la asimetría del reloj y otros problemas relacionados con el tiempo son irrelevantes, excepto para determinar "¿Cuál es la frecuencia de reloj máxima para este sistema?".
¿Qué es exactamente la inclinación 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 del reloj Tskew es el retraso del reloj aguas abajo en relación con el reloj aguas arriba ( a ):
Tskew (source, destination) = destination_time - source_time
donde source_time es el tiempo de un flanco de reloj activo en el registro de origen aguas arriba (en este caso, R1 o R2), y destination_time es el tiempo del "mismo" flanco de reloj activo en algún registro de destino aguas abajo (en este caso, R3) .
- inclinación negativa del reloj: el CLK en R3 cambia antes que el reloj en R1.
- inclinación positiva del reloj: el CLK en R3 cambia después del reloj en R1.
¿Cuál es el efecto de la inclinación del reloj?
(tal vez un diagrama de tiempo aquí aclararía esto)
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 otro peor, para que las cosas funcionen correctamente, debemos diseñar cosas que:
Tskew (R1, R3) <Tco - Th.
Tclk_min = Tco + Tcalc + Tsu - Tskew (R1, R3).
dónde:
- Tcalc es el tiempo máximo de ajuste 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 se encuentra en la ruta crítica, empujando las piezas hacia arriba o hacia abajo, o insertando otra etapa de tubería, por lo que el nuevo diseño tiene un Tcalc más pequeño, lo que nos permite aumentar la velocidad 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 del registro espera que usemos un reloj lo suficientemente lento como para cumplir siempre con este requisito.
- Este es el tiempo de espera de registro. El fabricante del registro espera que controlemos el sesgo del reloj lo suficiente como para cumplir siempre con este requisito.
- Tco es el retardo de reloj a salida (tiempo de propagación). Después de cada flanco de reloj activo, R1 y R2 continúan manejando los valores antiguos a la lógica combinacional por un corto 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 el fabricante especifique para el funcionamiento normal.
Un sesgo demasiado positivo es un desastre no mitigado. Demasiada asimetría positiva puede (con algunas combinaciones de datos) causar "caminos furtivos" de tal manera que, en lugar de que R3 bloquee los "datos correctos" en el reloj N + 1 (una función determinista de los datos previamente bloqueados en R1 y R2 en el reloj N) , los nuevos datos enclavados 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 puede "repararse" 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, a fin de dar a las entradas de tiempo R3 para que se asienten después de que R1 y R2 bloqueen los nuevos datos en el borde del reloj N, y luego R3 bloquea el resultado en "el próximo" borde del reloj N + 1.
Muchos sistemas usan una red de distribución de reloj que intenta reducir la inclinación a cero. Contra-intuitivamente, agregando cuidadosamente retrasos a lo largo de la ruta del reloj, la ruta desde el generador del reloj hasta la entrada CLK de cada registro, es posible aumentar la velocidad aparente que el frente de onda del borde del reloj viaja físicamente desde la entrada CLK de un registro hasta el La siguiente entrada CLK del registro es más rápida que la velocidad de la luz.
La documentación de Altera menciona
"Evite usar la lógica combinacional en las rutas del reloj porque contribuye a la distorsión 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 más que la señal CLK global controle la entrada CLK local de algunos registros. (Esto puede ser una lógica de "activación de reloj" para que los nuevos valores se carguen en un registro solo cuando se cumplen ciertas condiciones; o lógica de "divisor de reloj" que solo deja pasar 1 de N relojes, etc.). Esa CLK local generalmente se deriva de la CLK global de alguna manera: la CLK global marca, y luego la CLK local no cambia o (un breve retraso después de la 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 la inclinación sea más positiva. Cuando ese "algo más" impulsa el CLK del registro ascendente (R1 o R2), hace que la inclinación sea más negativa. 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 la diferencia 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 un poco más de tiempo para establecerse y, por lo tanto, todo el sistema puede ejecutarse a una velocidad de reloj más rápida. Esto se llama "optimización de inclinación de reloj" o "programación de inclinación de reloj", y está relacionado con " reajuste ".
Todavía estoy desconcertado por el set_clock_uncertainty
comando: ¿por qué querría "especificar manualmente" sesgo?
(*) Una excepción:
sistemas asincrónicos .