Очень сложно однозначно ответить без дополнительных подробностей об архитектуре. И там так много вариантов архитектуры mips.
Но сначала взгляните на свои претензии
add $t1, $t2, $t3
sub $t4, $t1, $t0
Существует опасность данных из-за $ t1 ...
Right
Если мы добавим 2 NOPS, мы сможем решить эту проблему
Не совсем. Без какого-либо среднего значения пересылки данных, с одной NOP, новый $ t1 будет в регистрах MM / WR конвейера, а со вторым NOP он будет записан обратно в банк регистров. Но не к трубопроводу DI / EX рег. Таким образом, чтобы получить правильное поведение только с двумя NOPS, вам нужно либо средство для пересылки данных, записанных обратно в банк регистров, в регистры DI / EX, либо использовать трюки, такие как запись на переднем крае часов для банка регистров и чтение это во второй части цикла.
Мы будем предполагать, что ваше предположение верно и что между входом и выходом банка регистров существует некоторая пересылка.
Относительно ветви В инструкции есть несколько способов их реализации.
Наиболее очевидный способ - использовать стадию EX для одновременного вычисления условия ($ t0 =? $ T1) с ALU и адреса ветви с дополнительным сумматором. Но у него есть главный недостаток: пока выполняется это вычисление, этап LI извлекает новую инструкцию (а одна уже находится на этапе декодирования), что приводит к штрафу за переход в 2 цикла.
Что было сделано в конвейер classi c mips состоит в том, что ветви были обработаны на этапе декодирования. На этом этапе сумматор вычисляет адрес ветвления с помощью ПК + непосредственно, и был добавлен выделенный компаратор для непосредственного сравнения выходных данных банка регистров (кстати, по этой причине у вас могут быть только сравнения eq / neq для инструкций ветвления, чтобы упростить этот компаратор, в то время как компаратор ALU может делать другие виды сравнения). Таким образом, штраф за переход составляет всего один цикл.
Если мы предположим, что это ваша фактическая архитектура и что у нас нет средств переадресации, кроме банка регистров, то достаточно одного NOP. После одного NOP новое значение $ t1 находится в регистрах конвейера MEM / WR. А в следующем цикле он будет записан обратно в банк регистров в течение первой половины цикла и может быть использован для сравнения ветви во второй половине цикла.
Конечно, если вы предполагаете, что филиал обрабатывается на этапе EX (и если у вас есть штраф за ветвление в 2 цикла), тогда требуется второй NOP.