Уровень 48: Прощай, аккумулятор!

Открыть уровень →

Задание

Цель: сравнить две машины: аккумуляторную (каждая операция три раза гоняет данные через ACC) и регистровую (RegFile из 32 ячеек). Выполните все задания виджета — и попробуйте записать 42 в x0: он останется нулём.

Первый уровень RISC Lab — без схем и кода. Перед вами интерактивный виджет с двумя машинами: слева знакомый аккумуляторный процессор из части 2, справа — регистровая машина с файлом из 32 регистров по 32 бита. Выполните четыре задания виджета и ответьте на вопрос уровня.

В аккумуляторной архитектуре одна из сторон каждой арифметической операции привязана к регистру ACC. Команда ADD x5 читает ACC, складывает его с x5 и пишет результат обратно в ACC. Данные трижды за команду проходят через один и тот же регистр — в этом и узкое место.

В регистровой архитектуре команда явно указывает оба источника и место назначения. Трёхоперандная команда ADD x5, x6, x7 означает: прочитать x6, прочитать x7, сложить, записать сумму в x5. Ни один регистр не привилегирован — кроме одного.

Задания виджета:

  1. Прогнать сложение на аккумуляторной машине — счётчик проходов через ACC вырастет на 3.
  2. Записать 42 в x5 регистровой машины и прочитать значение обратно.
  3. Попробовать записать 42 в x0 — и убедиться, что он останется нулём.
  4. Прочитать x5 двумя портами одновременно — регистровый файл выдаёт оба операнда за один такт.

Решение для самопроверки

Сначала выполните эксперименты в виджете. Решение ниже поможет сверить понимание.

Что должно получиться: все четыре задания виджета выполнены: сложение прогнано (счётчик проходов через ACC вырос на 3), 42 записана в x5 и прочитана, запись в x0 оставила ноль, два порта чтения выдали x5 одновременно.

x0 — не регистр, а константа. Ноль в программах нужен так часто, что в RV32I его сделали «бесплатным»: биты x0 физически подключены к нулю, а декодер записи его никогда не выбирает. Запись в x0 не изменяет его значение — не потому, что процессор сбрасывает регистр каждый такт, а потому, что записывающего пути у x0 просто нет.

Два порта чтения. Регистровый файл выдаёт значения двух разных регистров одновременно — это необходимо командам вида ADD x5, x6, x7: оба операнда должны попасть в АЛУ за один такт.

Сравнение архитектур. Посчитайте проходы через ACC в короткой программе: каждая арифметическая команда добавляет три (чтение ACC, запись ACC, плюс чтение операнда из памяти или регистра). В регистровой машине данные идут напрямую из регистра в регистр — ACC в цепочке не участвует.

После всех четырёх заданий откроется концепт-чек: почему запись в x0 «пропадает»? Верный ответ — первый: x0 физически не существует как регистр, его биты заземлены.

Материалы по теме

Проверь себя

Почему запись в x0 «пропадает», хотя он выглядит как обычный регистр?

У x0 нет записывающего пути: его биты физически заземлены, а декодер записи никогда его не выбирает. Константа ноль «бесплатна» в каждой команде — поэтому x5 через x0 обнуляется без лишних инструкций.