Un circuit comme une unité arithmétique et logique prendra quelques nombres comme entrées et produira un nombre comme sortie. Cela peut garantir que dans un certain laps de temps, tous les bits de la sortie auront atteint leur état final correct, mais le temps réel pour que les bits de sortie deviennent valides peut varier considérablement en fonction d'une variété de facteurs.
Il serait possible de construire une ALU avec une entrée "valide" et une sortie "valide", et de spécifier que si l'entrée "valide" est faible pendant un temps suffisant avant qu'un calcul ne soit effectué, et que les entrées de données contiennent le les valeurs souhaitées avant que l'entrée "valide" ne monte, la sortie "valide" n'ira pas jusqu'à ce que les bits de sortie soient en fait corrects. Une telle conception nécessiterait probablement environ deux fois plus de circuits qu'une ALU conventionnelle [fondamentalement, elle devrait savoir si chaque bit était "connu" pour être nul ou "connu" pour être un; sa sortie "valide" deviendrait vraie une fois que l'état de chaque bit de sortie serait connu].
Pour aggraver les choses, permettre aux parties d'un processeur qui seraient capables de fonctionner plus rapidement de le faire ne sera utile que si elles n'attendent pas tout le temps pour que les parties plus lentes jouent le rattrapage. Pour que cela se produise, il doit y avoir une logique pour décider quelle partie de la machine est "en avance" à un moment donné et sélectionner un plan d'action en fonction de cela. Malheureusement, ce type de décision est l'une des plus difficiles à prendre de manière fiable pour l'électronique. Décider de manière fiable lequel des deux événements s'est produit en premier n'est généralement facile que si l'on peut garantir qu'il n'y aura jamais de "rappels". Supposons qu'un séquenceur de mémoire gère une demande de l'unité de traitement # 1 et que l'unité # 1 ait une autre demande en attente après cela. Si l'unité # 2 soumet une demande avant que la première demande de # 1 ne soit terminée, l'unité de mémoire doit gérer cela; sinon, il devrait traiter la prochaine demande de l'unité n ° 1. Cela semblerait être une conception raisonnable, mais cela finit par être étonnamment problématique. Le problème est que s'il y a un moment tel qu'une demande reçue avant ce moment qui sera traitée immédiatement, et une demande reçue après cela devra attendre, le temps nécessaire pour déterminer si une demande dépasse le délai sera à peu près inversement proportionnelle à la différence entre le moment où la demande a été reçue et le délai. Le temps nécessaire à l'unité de mémoire pour déterminer qu'une demande de # 2 a dépassé le délai d'une femptoseconde peut dépasser considérablement le temps qui aurait été nécessaire pour traiter une deuxième demande de l'unité # 1, mais l'unité ne peut pas traiter l'une ou l'autre demande jusqu'à ce qu'elle décide laquelle traiter en premier.
Le fait que tout fonctionne sur une horloge commune élimine non seulement la nécessité pour les circuits de déterminer quand la sortie d'un calcul est valide, mais permet également d'éliminer les "appels fermés" de synchronisation. Si tout dans le système fonctionne sur une horloge de 100 MHz, aucun signal ne change en réponse à une horloge jusqu'à 1 ns après le front d'horloge, et tout ce qui va se produire en réponse à un front d'horloge se produit dans les 7 ns, alors tout ce qui va se passer avant un un front d'horloge particulier "gagnera" d'au moins 3 ns, et tout ce qui n'arrivera qu'après un front d'horloge "perdra" d'au moins 1 ns. Déterminer si un signal se présente avant ou après l'horloge, lorsqu'il est garanti qu'il ne sera pas "proche", est beaucoup plus facile que de déterminer lequel des deux signaux chronométrés arbitrairement se produit en premier.