Конкретный случай опасности данных (когда инструкция R-типа появляется после двух последовательных LW)
Я проектирую MIPS-подобный процессор с Verilog, и теперь я работаю с опасностями данных. У меня есть эти инструкции:
Ins[0] = LW r1 r0(100)
Ins[1] = LW r2 r0(101)
Ins[2] = ADD r3 r2 r1
Я использую конвейер, и мой dataPath выглядит примерно так: https://raw.githubusercontent.com/mhyousefi/MIPS-pipeline-processor/master/docs/MIPS_diagram.png У меня 5 ступеней, с 4 буферами защелки, разделяющими их.
Проблема в том, что когда инструкция ADD достигает стадии 3 (где ALU должен вычислить r1 + r2), инструкция 1 (вторая LW) находится на стадии 4 и еще не прочитала адрес памяти r0 + 101, поэтому я должен остановить один цикл и после этого Ins1 достигает последней стадии.
В этой ситуации первый LW завершил свою работу, и новое значение r1 отсутствует в dataPath, но мне нужно передать это значение на вход B ALU.
(Это называется пересылкой данных, потому что, когда третья инструкция находилась на этапе 2, значение r1 не было готово, и я должен переслать его с более поздних этапов (синие провода, которые выходят из последнего MUX и переходят в ALU MUX), но потому что стойла второго LW, у меня нет значения r1, кроме того.
Спасибо за любую помощь.
1 ответ
Я допустил ошибку. Моя ошибка в том, что когда за инструкцией LDM следует RType, я задерживаю процессор, когда Rtype находится в stage3, а LDM в stage4. но вместо этого я должен обнаружить зависимость за один такт до этого, когда RType находится в stage2 (декодирование), а LDM находится в stage3 (exec).
В этой ситуации я должен остановить трубопровод.
Таким образом, в результате, когда Rtype находится на этапе 2, второй LDM находится на этапе 3, а первый LDM находится на этапе 4, я обнаруживаю зависимость и конвейер останова за один цикл.
Таким образом, в следующие часы Rtype все еще находится на этапе 2, второй LDM на этапе 4 и первый LDM выполняет обратную запись в регистр, и, таким образом, поскольку RType все еще находится на этапе 2, он может считывать данные, записанные в файл регистров. (Обратная запись завершается в нужное время. В posedge первый аргумент RType готов.)