Les dispositifs logiques numériques modernes sont généralement (*) conçus avec une «pratique de conception synchrone»: un style de conception de transfert de registre (RTL) déclenché par front globalement synchrone: tous les circuits séquentiels sont divisés en registres déclenchés par front connectés au signal d'horloge global CLK et pure logique combinatoire.
Ce style de conception permet aux gens de concevoir rapidement des systèmes logiques numériques sans égard au calendrier. Leur système "fonctionnera" aussi longtemps qu'il y aura suffisamment de temps d'un front d'horloge à l'autre pour que l'état interne se stabilise.
Avec ce style de conception, le décalage d'horloge et d'autres problèmes liés au timing ne sont pas pertinents, sauf pour déterminer "Quelle est la fréquence d'horloge maximale pour ce système?".
Qu'est-ce que le décalage d'horloge exactement?
Par exemple:
...
R1 - register 1 R3
+-+
->| |------>( combinational ) +-+
...->| |------>( logic )->| |--...
->|^|------>( )->|^|
+-+ ( ) +-+
| +--->( ) |
CLK | +->( ) CLK
| |
R2: | |
+-+ | |
...->| |->+ |
->|^|->--+
+-+
|
CLK
Dans le matériel réel, le signal "CLK" ne change jamais vraiment exactement simultanément à chaque registre. Le décalage d' horloge Tskew est le retard de l'horloge aval par rapport à l'horloge amont ( a ):
Tskew (source, destination) = destination_time - source_time
où source_time est le temps d'un front d'horloge actif au registre source en amont (dans ce cas, R1 ou R2), et destination_time est le temps du "même" front d'horloge actif à un registre de destination en aval (dans ce cas, R3) .
- décalage d'horloge négatif: le CLK à R3 commute avant l'horloge à R1.
- décalage d'horloge positif: le CLK à R3 commute après l'horloge à R1.
Quel est l'effet du décalage d'horloge?
(peut-être qu'un chronogramme ici rendrait cela plus clair)
Pour que les choses fonctionnent correctement, même dans le pire des cas, les entrées de R3 ne doivent pas changer pendant le temps de configuration ou de maintien de R3. Dans d'autres pires, pour que les choses fonctionnent correctement, nous devons concevoir des choses telles que:
Tskew (R1, R3) <Tco - Th.
Tclk_min = Tco + Tcalc + Tsu - Tskew (R1, R3).
où:
- Tcalc est le temps de stabilisation maximal dans le pire des cas de tout bloc de logique combinatoire n'importe où dans le système. (Parfois, nous pouvons repenser le bloc de logique combinatoire qui se trouve sur le chemin critique, en poussant les pièces en amont ou en aval, ou en insérant une autre étape de pipelining, de sorte que la nouvelle conception a un Tcalc plus petit, ce qui nous permet d'augmenter la fréquence d'horloge) .
- Tclk_min est la période de temps minimale d'un front d'horloge actif au front d'horloge actif suivant. Nous le calculons à partir de l'équation ci-dessus.
- Tsu est l'heure de configuration du registre. Le fabricant de registres s'attend à ce que nous utilisions une horloge suffisamment lente pour toujours répondre à cette exigence.
- C'est le temps de maintien du registre. Le fabricant de registres s'attend à ce que nous contrôlions suffisamment le décalage d'horloge pour toujours répondre à cette exigence.
- Tco est le retard de l'horloge à la sortie (temps de propagation). Après chaque front d'horloge actif, R1 et R2 continuent de diriger les anciennes valeurs vers la logique combinatoire pendant un court instant Tco avant de passer aux nouvelles valeurs. Ceci est défini par le matériel et garanti par le fabricant, mais uniquement tant que nous répondons aux exigences Tsu et Th et aux autres exigences spécifiées par le fabricant pour un fonctionnement normal.
Un biais trop positif est un désastre absolu. Un biais trop positif peut (avec certaines combinaisons de données) provoquer des "chemins sournois" tels qu'au lieu de R3 verrouiller les "données correctes" à l'horloge N + 1 (une fonction déterministe des données précédemment verrouillées dans R1 et R2 à l'horloge N) , les nouvelles données verrouillées dans R1 et R2 à l'horloge N + 1 peuvent s'infiltrer, bouleverser la logique combinatoire et provoquer le verrouillage de données erronées dans R3 au "même" front d'horloge N + 1.
N'importe quelle quantité de biais négatif peut être "corrigée" en ralentissant la fréquence d'horloge. C'est seulement "mauvais" dans le sens où cela nous oblige à faire fonctionner le système à une fréquence d'horloge plus lente, afin de donner aux entrées de R3 le temps de s'installer après que R1 et R2 aient verrouillé de nouvelles données au bord de l'horloge N, puis plus tard R3 verrouille le résultat au "prochain" front d'horloge N + 1.
De nombreux systèmes utilisent un réseau de distribution d'horloge qui tente de réduire le décalage à zéro. Contre-intuitivement, en ajoutant soigneusement des retards le long du chemin d'horloge - le chemin du générateur d'horloge à l'entrée CLK de chaque registre - il est possible d'augmenter la vitesse apparente que le front d'onde du front d'horloge parcourt physiquement de l'entrée CLK d'un registre à l'entrée entrée CLK du registre suivant à une vitesse supérieure à la vitesse de la lumière.
La documentation d'Altera mentionne
"Évitez d'utiliser la logique combinatoire dans les trajets d'horloge car cela contribue à un décalage d'horloge."
Cela fait référence au fait que de nombreuses personnes écrivent des HDL qui sont compilés sur un FPGA d'une manière qui provoque d'une manière ou d'une autre autre que le signal CLK global à piloter l'entrée CLK locale de certains registres. (Il peut s'agir d'une logique de "synchronisation d'horloge" de sorte que les nouvelles valeurs ne sont chargées dans un registre que lorsque certaines conditions sont remplies; ou de logique de "diviseur d'horloge" qui ne laisse passer que 1 horloge N sur, ou etc.). Ce CLK local est généralement dérivé du CLK global d'une manière ou d'une autre - le CLK global coche, puis soit le CLK local ne change pas, soit (un court délai après le CLK global pour que le signal se propage à travers "quelque chose d'autre") le CLK local change une fois.
Lorsque "quelque chose d'autre" entraîne le CLK du registre aval (R3), cela rend le biais plus positif. Lorsque "quelque chose d'autre" entraîne le CLK du registre amont (R1 ou R2), cela rend le biais plus négatif. Parfois, tout ce qui entraîne le CLK du registre amont et tout ce qui entraîne le CLK du registre aval ont pratiquement le même retard, ce qui rend le décalage entre eux pratiquement nul.
Le réseau de distribution d'horloge à l'intérieur de certains ASIC est délibérément conçu avec de petites quantités de décalage d'horloge positif sur certains registres, ce qui donne à la logique combinatoire en amont un peu plus de temps pour s'installer et ainsi le système entier peut être exécuté à une fréquence d'horloge plus rapide. Ceci est appelé "optimisation du décalage d'horloge" ou "planification du décalage d'horloge" et est lié à la " resynchronisation ".
Je suis toujours mystifié par la set_clock_uncertainty
commande - pourquoi voudrais-je jamais "spécifier manuellement" l'inclinaison?
(*) Une exception:
les systèmes asynchrones .