Сейчас я пытаюсь реализовать конвейерный ЦП на основе RV32I ISA.
Мой ЦП имеет алгоритм переименования для опасностей данных и предсказания ветвей для опасностей управления.
Это мой пример кода для алгоритм переименования и прогноз ветвления:
addi x1, x0, 25
addi x2, x0, 50
bne x1, x2, LABLE
addi x1, x0, 200
addi x2, x0, 300
LABLE:
addi x1, x1, 1
addi x2, x2, 1
Позвольте мне объяснить свой процессор.
В строке 1, «addi x1, x0, 25», тег x1 равен 15.
В строке 2, «addi x2, x0, 50», тег x2 равен 14.
В строке 3, «bne x1, x2, LABLE», результат предсказания не берется. Итак, инструкция в строке 4 выполняется.
В строке 4, «addi x1, x0, 200», тег x1 равен 13. (Эта инструкция не должна выполняться в истинном следовании)
В строке 5, «addi x2, x0, 300», тег x2 равен 12. (Эта инструкция не должна выполняться в истинном следовании)
В строках 6 и 7 эти инструкции должны читать x1, x2 с истинным тегом - 15, 14, но в этом случае считываемые теги - это 13, 12. Итак, ЦП выходит из строя.
Итак, когда "bne" выполняется на этапе выполнения, как можно он восстанавливает теги x1 и x2 до 15, 14?
На какие книги или источники мне следует обратиться для решения этой проблемы?