Я думаю, что ответ дает правильную сумму (13 циклов), но ставит в стойло неправильную инструкцию .
I5 не нужно останавливаться; I4 (ADD R5, R1, R2
) производит R5 вовремя, чтобы переслать его в EX следующей инструкции для вычисления адреса (LOAD R1, 0(R5)
). (Ваш 5-ступенчатый конвейер classi c RIS C имеет обходную переадресацию).
Но I6 читает результат инструкции загрузки, и загрузки выдают свой результат на цикл позже, чем АЛУ в EX. Так же, как и I3, I6 должен блокироваться, а не I5.
(I7 зависит от I6, но I6 - это инструкция ALU, поэтому он может пересылаться без остановки).
Они останавливаются на этапе D, потому что этап ID не может получить регистры, которые нагрузка I2 / I5 еще не произвела.
Отдельно от этого ваша диаграмма показывает I4 (и что должно быть I7) даже не извлекается, когда предыдущая инструкция останавливается. Это не имеет смысла для меня. В начале этого цикла конвейер даже не знает, что ему нужно остановить, потому что он еще не декодировал I3 (и I6) и обнаружил, что он читает регистр неготовности, поэтому необходима блокировка.
Fetch не ждет, пока после декодирования предыдущей инструкции не будет установлено, остановилась она или нет; это победило бы всю цель конвейерной обработки. Это должно выглядеть так:
I3 IF D D EX MEM WB
I4 IF IF D EX MEM WB
Кстати, задержка загрузки является причиной того, что classi c MIPS имеет слот задержки загрузки (непредсказуемое поведение, если вы попытаетесь использовать регистр в следующей инструкции после загрузка в него). Позже MIPS добавил блокировки для остановки, если вы сделаете это, вместо того, чтобы сделать это ошибкой, так что вы можете сохранить stati c code-size меньшим (без заполнителя NOP) в тех случаях, когда вы не можете найти какую-либо другую инструкцию для вставки в нее. слот. (А некоторые даже позже MIPS сделали exe-out exe c, который может скрывать задержки.)