Уровень 63: Пять команд в полёте
Задание
Цель: собрать линейную программу из 13 команд (lui/addi/ori/xor/and/sw/lw), запустить её и предсказать, какая по счёту команда будет в стадии EX на такте 8. Race Track 61-го показывал, где команда на текущем такте; теперь вы читаете всю трассу сразу. Каскадная диаграмма (waterfall) — такты по горизонтали, стадии по вертикали: каждая команда рисует диагональ из пяти клеток, от IF до WB. Первые четыре такта конвейер заполняется: в полёте меньше пяти команд. Затем поток: пять команд летят одновременно — прикиньте, какая по счёту команда стоит в заданной стадии на заданном такте. После последней команды — четыре такта опустошения.
Race Track 61-го показывал, где команды на текущем такте. Теперь вы читаете трассу целиком — по каскадной диаграмме (waterfall): такты идут по горизонтали, стадии IF/ID/EX/MEM/WB — по вертикали, и каждая команда рисует диагональ из пяти клеток, от выборки до записи результата.
Схема не собирается — уровень программный. Задания:
- Соберите линейную программу из 13 команд: база
lui x5, 0x1, данныеaddi x6, x0, 7иaddi x7, x0, 20, константаori x8, x0, 0x7F0, записьsw x6, 0(x5), чтение назадlw x12, 0(x5), логикаxor x9, x6, x7,and x10, x6, x8,add x11, x9, x7, и ещё память с арифметикой:sw x8, 4(x5),add x13, x12, x11,sw x13, 8(x5),add x14, x10, x12. - Предскажите номер команды в стадии. Перед первой проверкой «Проверить» спросит: какая по счёту команда (по порядку выборки) стоит в стадии EX на такте 8? Считайте сами: команда №n выбирается на такте n и доходит до EX на такте n+2.
- Прогоните и переключите вид. На платформе — переключатель «Дорожки/Каскад»; каскад открывается сразу. Жмите «Шаг» и смотрите, как диагональ команд растёт на один такт за шаг. Клик по клетке — карточка команды.
- Объясните фазы. 13 команд — а тактов 17: такты 1–4 — заполнение (в полёте меньше пяти команд), такты 5–13 — поток (пять команд летят одновременно), такты 14–17 — опустошение.
Решение для самопроверки
Сначала напишите программу сами. Решение ниже — контрольные точки.
Что должно получиться: программа из 13 команд даёт 17 тактов (13 ретайров + 4 заполнения); предикт сходится: в стадии EX на такте 8 — команда №6 (lw x12); фазы трассы: заполнение 1–4, поток 5–13, опустошение 14–17.
Шаг 1 — эталонная программа.
lui x5, 0x1 # 0: база 0x1000
addi x6, x0, 7 # 4
addi x7, x0, 20 # 8
ori x8, x0, 0x7F0 # 12
sw x6, 0(x5) # 16: DMEM[0x1000] = 7
lw x12, 0(x5) # 20
xor x9, x6, x7 # 24: 19
and x10, x6, x8 # 28: 0
add x11, x9, x7 # 32: 39
sw x8, 4(x5) # 36: DMEM[0x1004] = 0x7F0
add x13, x12, x11 # 40: 46
sw x13, 8(x5) # 44: DMEM[0x1008] = 46
add x14, x10, x12 # 48: 7
.end # 52: останов
Шаг 2 — контрольные числа. Прогон: 13 команд = 13 ретайров, 17 тактов (13 + 4 заполнения), останов на PC = 52. Регистры в финале: x5 = 0x1000, x6 = 7, x7 = 20, x8 = 0x7F0, x9 = 19, x10 = 0, x11 = 39, x12 = 7, x13 = 46, x14 = 7; память: 0x1000 = 7, 0x1004 = 0x7F0, 0x1008 = 46. Пузырей нет: lw x12 отстоит от первого использования x12 на пять команд — load-use не возникает.
Шаг 3 — предикт. EX на такте 8 — команда №6 (lw x12): №6 выбирается на такте 6, такт 7 — ID, такт 8 — EX, такт 9 — MEM (чтение слова), такт 10 — WB.
Шаг 4 — читаем каскад. Диагональ №1 идёт от клетки (такт 1, IF) до (такт 5, WB) и выходит из конвейера; параллельные диагонали №2–№5 следуют за ней со сдвигом на такт. Заполнение — «лестница» первых четырёх тактов, опустошение — её зеркальное отражение в конце.
Проверь себя
Как по каскаду найти команду в заданной стадии на заданном такте?
Это обратный отсчёт: команда №n выбирается на такте n и доходит до EX на такте n + 2, до MEM — n + 3. Значит, EX на такте 8 держит команду №6, а MEM на том же такте — №5.