Цель каждого из этих промежуточных регистров состоит в том, чтобы хранить данные, которые могут понадобиться на ближайшем следующем этапе или на более поздних этапах. Я расскажу об одном возможном дизайне, но, как я объясню, действительно много возможных дизайнов.
На этапе выборки следующая команда, которая должна быть выполнена (на которую указывает текущий ПК), выбирается из памяти, и ПК обновляется, чтобы указывать на следующую инструкцию для выборки. Следовательно, IF / ID будет включать одно 4-байтовое поле для хранения извлеченной инструкции. Существует два способа вычисления нового ПК: текущий ПК + 4 или ПК + 4 + смещение в случае ответвления. Если извлеченная инструкция сама является инструкцией ветвления, то нам нужно будет передать новый ПК, чтобы целевой адрес ветвления можно было вычислить на этапе EX. Мы можем добавить 4-байтовое поле в IF / ID для хранения нового значения ПК, которое будет передаваться на стадию EX через стадию ID.
На этапе декодирования определяются код операции и его операнды. Код операции находится в фиксированном месте в инструкции в MIPS. Инструкция MIPS может работать с одним регистром источника, двумя регистрами источника, одним регистром источника и 32-битным непосредственным значением с расширенным знаком, 32-битным непосредственным значением с расширенным знаком или без операндов. Мы можем либо подготовить только необходимые операнды для стадии EX на основе кода операции, либо подготовить все операнды, которые могут потребоваться для любого кода операции. Последний дизайн проще, но требует большего регистра ID / EX. В частности, два 4-байтовых поля необходимы для хранения двух возможных значений исходного регистра (значения считываются из файла регистров на этапе декодирования) и 4-байтового поля для возможного немедленного значения с расширенным знаком. Никакой код операции не потребует всех этих полей, но давайте все равно подготовим их и сохраним в фиксированных местах в регистре ID / EX. Это упрощает дизайн.
Мы также передадим вычисление нового значения ПК на этапе выборки на этап выполнения на тот случай, если код операции окажется ветвью. Целевой адрес ветвления вычисляется относительно текущего значения ПК (ПК инструкции, следующей за ветвью в статическом программном порядке). Здесь возможны два варианта: либо добавить шину из нового поля ПК в IF / ID на сцену EX, либо добавить поле в ID / EX для хранения нового значения ПК, к которому затем можно получить доступ на стадии EX. Последний дизайн добавляет 4-байтовое поле в ID / EX.
EX требует код операции со стадии ID. Мы можем передать только код операции, а не всю инструкцию. Но на более поздних этапах могут потребоваться другие части инструкции. Как правило, в конвейерах RISC предпочтительно проходить, чтобы сделать всю инструкцию доступной для всех этапов. Таким образом, все части инструкции уже доступны, когда в будущем будут внесены изменения на любом этапе конвейера. Итак, давайте добавим 4-байтовое поле в ID / EX для хранения инструкции.
Этап EX считывает операнды и код операции из регистра ID / EX (код операции является частью инструкции) и выполняет операцию, указанную кодом операции. Регистр EX / MEM должен быть достаточно большим, чтобы вместить все возможные результаты, которые могут включать следующее: 4-байтовое значение, вычисленное ALU в результате арифметической или логической операции, 4-байтовое значение, представляющее вычисленный эффективный адрес для операция загрузки или сохранения памяти, 4-байтовое значение, представляющее целевой адрес перехода в случае инструкции перехода, и 1-битное условие в случае инструкции условного перехода. Мы можем использовать одно 4-байтовое поле в EX / MEM для результата (независимо от того, что оно представляет) и 1-битное поле для условия. Кроме того, как и прежде, нам нужно 4-байтовое поле для хранения инструкции. Также для инструкций сохранения нам нужно еще одно 4-байтовое поле для хранения значения, которое нужно сохранить. Одна из возможных альтернативных схем здесь заключается в том, что вместо сохранения 1-битного условия и 4-байтового целевого адреса ветвления в EX / MEM они могут быть переданы непосредственно на стадию IF.
На этапе MEM, в случае инструкции ветвления, целевой адрес ветвления и условие ветвления передаются обратно из EX / MEM в выборку IF для определения нового ПК. В случае операции сохранения памяти операция выполняется, и результат не передается на какой-либо этап. В случае операции загрузки памяти, 4-байтовое значение выбирается из памяти и сохраняется в поле в регистре MEM / WB. В случае операции ALU 4-байтовый результат будет просто передан в поле в регистре MEM / WB. Кроме того, как и прежде, нам нужно 4-байтовое поле в MEM / WB для хранения инструкции.
Наконец, на этапе WB 4-байтовый результат, загруженный из памяти или вычисленный ALU, сохраняется в регистре назначения. Это происходит только для инструкций, которые дают результаты. В противном случае этап WB можно пропустить.
Таким образом, в конструкции, которую я обсуждал, размеры промежуточных регистров следующие: IF / ID имеет размер 8 байтов, ID / EX имеет размер 20 байтов, EX / MEM имеет размер 25 бит, размер MEM / WB составляет 8 байт.
Проектное решение о том, требуется ли поле в промежуточном регистре для хранения какого-либо значения или может ли оно быть передано непосредственно на том же этапе в логику, которая требует значения, является решением "на уровне схемы". Если можно гарантировать, что сигналы не повреждены, и если возможно или удобно добавить выделенную шину, они могут быть подключены напрямую.