В синхронной цифровой системе во время цикла есть две разные фазы.
На первом этапе операнды читаются и преобразуются с помощью операторов. На втором этапе результирующие данные записываются в регистры.
В зависимости от реализации эти фазы могут соответствовать первому и второму полупериоду или полному периоду и переднему фронту часов.
В любом случае, важным аспектом является то, что можно прочитать (на первом этапе) и изменить (в конце) один и тот же регистр. Вот почему можно делать такие действия, как
pc <= pc+4
за один цикл.
В проблеме, которую вы поднимаете, именно так и происходит.
Акция
add $1, $2, $3 # WB
будет считывать регистр конвейера с результатом на первом этапе и записывать в $ 1 в конце цикла. в то время как
beq $1, $4, target # ID
будет читать $ 1 и $ 4 на первом этапе и записывать результат, который ppline регистрирует в конце цикла. Следовательно, без пересылки будет записано предыдущее значение $ 1.
(отредактировано в соответствии с комментариями ниже)
Все эти объяснения верны, если ветвь имеет дело со стандартным HW. В этом случае сравнение выполняется ALU на этапе «EX», а компьютер обновляется в конце этого этапа.
Но это приводит к штрафу за ветвь в два цикла. Чтобы уменьшить этот штраф, можно добавить HW, чтобы выполнить сравнение на этапе идентификации. В этом случае, если для сравнения требуется вычислить значение (например, $ 1 в вашем примере), потребуется остановка.