Да, конечно, есть опасность RAW. Одна инструкция читает результат предыдущей инструкции, разделенная на много меньше длины конвейера. Википедия: https://en.wikipedia.org/wiki/Classic_RISC_pipeline#Data_hazards
Опасность данных возникает, когда инструкция, запланированная вслепую, будет пытаться использовать данные до того, как данные будут доступны в файле регистра.
Классический c коммерческий MIPS, такой как R2000, имеет обходную переадресацию и не должен останавливаться , потому что его логика переадресации c обнаруживает опасность (которая все еще существует ) и перенаправляет результат EX из add
в мультиплексор для чтения регистра для sw
. Таким образом, если мы перейдем к остальной части конвейера, эта инструкция будет иметь перенаправленное значение $t0
и значение файла реестра $s2
. https://en.wikipedia.org/wiki/Classic_RISC_pipeline#Solution_A ._ Обход
Без обходной переадресации, да, вам действительно придется остановиться. Предполагая, что SW
все еще считывает оба входных операнда из файла регистров в обычное время, на этапе ID. IDK, если возможно, что вы могли бы позволить магазинам читать их регистр данных поздно (в начале состояния MEM), чтобы уменьшить количество циклов задержки на 1, но для этого может потребоваться дополнительный порт чтения в файле реестра, поскольку этап идентификации может также читайте 2 инструкции.
Ваш конвейер все еще должен обнаружить опасность и иметь возможность ее остановить (https://en.wikipedia.org/wiki/Classic_RISC_pipeline#Solution_B ._ Pipeline_interlock ). Эффективная задержка простых инструкций ALU хуже 1 цикла довольно ужасна, поэтому все реальные конвейеры RIS C выполняют переадресацию вместо того, чтобы просто обнаруживать и останавливать. Компиляторы имеют достаточно жесткий код планирования времени для заполнения интервалов задержки загрузки и задержки без необходимости скрывать задержку для каждой простой инструкции ALU!