убить все инструкции, которые пришли после ветки
Нет, если это настоящий MIPS. MIPS имеет один интервал задержки ветвления : инструкция после ветвления всегда выполняется независимо от того, взята ветвь или нет. (Обратный адрес jal
- это конец интервала задержки, поэтому он не выполняется дважды.)
Этого было достаточно, чтобы полностью скрыть 1 цикл задержки ветвления в classi c MIPS I ( R2000), в котором использовался скаляр classi c RIS C 5-ступенчатый конвейер . Он справился с этой задержкой на 1 тактовую ветвь путем пересылки из первой половины тактового цикла EX на IF, начинающийся во 2-й половине тактового цикла . Вот почему условия ветвления MIPS являются «простыми» (не требуют переноса через целое слово), как beq
между двумя регистрами, но только один операнд bgez
/ bltz
против неявного 0
для подписано 2 дополнения сравнения. Для этого нужно только проверить знаковый бит.
Если бы ваш конвейер был хорошо спроектирован, вы могли бы ожидать, что он разрешит ответвления после X0, потому что MIPS ISA уже ограничен, чтобы облегчить принятие решения о ветвлении с малой задержкой. ALU. Но, очевидно, ваш конвейер не оптимизирован, и решения о ветвях не готовы до конца X1, что противоречит цели заставить его запускать код MIPS вместо RIS C -V или любого другого набора команд RIS C.
Я придумал 4. Я думаю, что это потому, что разрешение ветвления происходит в X1, и нам нужно будет убить все инструкции, которые пришли после ветки.
Я думаю, что 4 цикла выглядят правильно для обобщенного c скалярного конвейера без слота задержки ветвления.
В конце этого цикла X1 есть инструкция в каждый из предыдущих 4 этапов конвейера, ожидающих перехода к следующему этапу на этом тактовом фронте. (Предполагая, что нет других пузырьков трубопровода). Команда интервала задержки - одна из тех, и ее не нужно уничтожать.
(Если не было пропуска I-кэша при получении команды интервала задержки, в этом случае команда интервала задержки может даже не быть пока в конвейере. Так что это не так просто, как убить 3 этапа до X0 или даже убить все, кроме самой старой предыдущей инструкции в конвейере. Слоты задержки не свободны для реализации, что также усложняет обработку исключений.)
Таким образом, инструкции 0..3 должны быть уничтожены на этапах конвейера от F до I. (Если возможно, чтобы инструкция интервала задержки находилась на одном из этих этапов, вы должны обнаружить этот особый случай. Если это не так Например, задержка пропадания I-кэша достаточно велика, чтобы он либо находился в X0, либо все еще ожидал извлечения, тогда конвейер может просто убить эти первые 3 этапа и сделать что-то на основе X0, являющегося пузырем или нет.)
Я думаю, что это будет 12, потому что вы можете получить 3 инструкции за один раз
Нет. Помните, что сама ветвь является одной из группы из 3 инструкций, которые могут go пройти по конвейеру . В случае непредсказуемости, предположительно, этап декодирования отправил бы все 3 команды в этой группе извлечения / декодирования по конвейеру.
Худший случай, я думаю, когда ветвь является первой (самая старая в программный порядок) обучение в группе. Затем необходимо убить 1 (или 2 без слота задержки перехода) из этой группы в X1, а также все инструкции на предыдущих этапах. Затем (при условии отсутствия пузырьков) вы отменяете 13 (или 14) инструкций, по 3 на каждом предыдущем этапе.
Наилучший случай - это когда ветвь является последней (самой младшей в программном порядке) в группе из 3 человек. Затем вы отбрасываете 11 (или 12 без слота задержки).
Таким образом, для версии этого конвейера с шириной 3 без слота задержки, в зависимости от пузырьков на предыдущих стадиях конвейера, вы уничтожение 0..14 инструкций, которые уже находятся в конвейере.
Реализация слота задержки отстой; есть причина, по которой новые ISA не раскрывают детали этого конвейера. Долгосрочная боль для кратковременного усиления.