Схема, подобная арифметическому логическому блоку, примет пару чисел в качестве входных данных и выдаст число как выходной. Это может гарантировать, что в течение некоторого периода времени все биты выходных данных достигнут своих правильных конечных состояний, но фактическое количество времени, в течение которого выходные биты станут действительными, может значительно варьироваться в зависимости от множества факторов.
Можно было бы построить АЛУ с «действительным» входом и «действительным» выходом и указать, что при условии, что «действительный» вход является низким в течение достаточного периода времени, прежде чем будет выполнено вычисление, а входные данные содержат требуемые значения до того, как «действительный» входной сигнал станет высоким, «действительный» выходной сигнал не будет высоким, пока выходные биты фактически не будут правильными. Такая конструкция, вероятно, потребовала бы примерно вдвое больше схем, чем обычный ALU [в основном, она должна была бы отслеживать, был ли «известен» каждый бит равным нулю или «известен» как единица; его «действительный» вывод станет истинным, как только станет известно состояние каждого выходного бита].
Что еще хуже, разрешение на выполнение тех частей ЦП, которые могли бы работать быстрее, будет полезно только в том случае, если они не будут все время ждать, пока медленные части не начнут играть в догонялки. Чтобы это произошло, должна быть логика, чтобы решить, какая часть машины находится «впереди» в данный момент времени, и выбрать курс действий, основанный на этом. К сожалению, такое решение является одним из самых сложных для электроники. Надежно решить, какое из двух событий произошло первым, как правило, легко, если можно гарантировать, что никогда не будет «близких вызовов». Предположим, что секвенсор памяти обрабатывает запрос от блока обработки № 1, а блок № 1 ожидает еще один запрос после этого. Если модуль № 2 отправляет запрос до того, как первый запрос от # 1 будет завершен, модуль памяти должен обработать это; в противном случае он должен обработать следующий запрос от блока № 1. Это может показаться разумным дизайном, но в итоге он оказывается на удивление проблематичным. Проблема состоит в том, что если есть какой-то момент времени, такой, что запрос, полученный до этого момента, который будет обработан немедленно, и запрос, полученный после этого, придется ждать, то количество времени, необходимое для определения того, превысит ли запрос крайний срок, будет примерно обратно пропорционально разнице между временем получения запроса и крайним сроком. Время, необходимое блоку памяти для определения того, что запрос от # 2 превысил крайний срок на одну фемтосекунду, может существенно превысить количество времени, которое потребовалось бы для обслуживания второго запроса от блока # 1, но блок не может обслуживать либо запрос, пока он не решит, какой из них обслуживать первым.
Если все работает на общих часах, это не только устраняет необходимость в схемах определять, когда выходные данные вычислений действительны, но также позволяет исключить синхронизацию «близких вызовов». Если все в системе работает с тактовой частотой 100 МГц, сигнал не изменяется в ответ на тактовую частоту до 1 нс после фронта тактовой частоты, и все, что должно произойти в ответ на тактовую частоту, происходит в течение 7 нс, тогда все, что должно произойти до конкретный фронт тактовых импульсов будет "выигрывать" по меньшей мере на 3 нс, и все, что не произойдет, пока после тактового фронта "не потеряет" по меньшей мере 1 нс. Определить, есть ли сигнал до или после тактового сигнала, когда гарантированно не будет «близко», гораздо проще, чем определить, какой из двух сигналов с произвольной синхронизацией произойдет первым.