Архитектура RISC-V: открытый стандарт процессоров простым языком

RISC-V — открытый стандарт набора инструкций процессора, предложенный в 2010 году в Калифорнийском университете в Беркли и опубликовный в 2014-м. Слово «открытый» здесь буквальное: спецификацию читают и реализуют все, платить за право делать процессор по этому стандарту не нужно, а к базовому набору можно дописывать свои расширения. Ниже — как устроен этот стандарт, чем он отличается от x86 и ARM, и как соотносится с учебным процессором в этом курсе. Общая карта предмета, частью которой является архитектура процессора, — на странице «Схемотехника».

Чем RISC-V отличается от x86 и ARM

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

Свойствоx86ARMRISC-V
Кто владеет стандартомIntel и AMD, оба под лицензиейArm Holdings, лицензия на ядроRISC-V International, спецификация открыта
Стоимость лицензии ядраЗависит от соглашенияЕсть, в том числе бесплатные уровниНет
Свои расширенияТолько внутри компанииСвои блоки по лицензии Arm Custom InstructionРазрешены, в том числе нестандартные
Где встречаетсяКомпьютеры и серверыСмартфоны, серверы, микроконтроллерыМикроконтроллеры, встраиваемые системы, образование

Ограничение у RISC-V одно и оно существенное: под конкретную микросхему на этом стандарте нет двадцати лет накопленного программного обеспечения. Открытая спецификация решает задачу, которую не может решить закрытая, и не решает задачу, которую закрытая уже решила.

Из чего состоит базовый набор

Базовое ядро стандарта называется RV32I для 32-битных машин и RV64I для 64-битных. В нём 32 регистра общего назначения, имя регистра номер один — x0, и он жёстко зашит на ноль: записать в него единицу нельзя, зато можно использовать как константу в вычислениях. Действующая ратифицированная версия базовой спецификации вышла в 2024 году.

Всё, что добавляют сверх базового набора, оформлено расширениями с буквенными именами, и это позволяет собрать профиль под задачу.

РасширениеЧто добавляет
MУмножение и деление
AАтомарные операции над памятью: многопоточность и блокировки без блокировки шины
F и DВычисления с плавающей точкой на 32 и 64 бита
CСжатые инструкции длиной 16 бит: экономия памяти и места на кристалле
BПобитовые операции: отдельные команды вместо цепочки AND, OR, сдвигов
VВекторные операции

Такая схема объясняет, почему слова «процессор RISC-V» не означают ничего конкретного. Микроконтроллер с базовым набором и расширением M, серверное ядро с A, F, D и V и учебное ядро с одним I — это три разные машины на одном стандарте. Встречаются и нестандартные расширения: производитель добавляет свои команды, и его процессор перестаёт быть совместим с чужими, оставаясь RISC-V для себя.

Как устроена инструкция

Инструкция в базовом наборе занимает 32 бита, и её биты распределены по функциям: сначала код операции, затем регистры и способ их использования. Учебный процессор курса устроен скромнее: у него 8 бит на инструкцию, 4 бита отданы под код операции и 4 под операнд. Сравнение нагляднее любого описания.

Учебный процессор курса: 8 бит код 4 бита операнд 4 бита адрес памяти 0–15 или константа 0–15 RISC-V, инструкция R-типа: 32 бита opcode 7 rd 5 funct3 rs1 5 rs2 5 funct7 7 операция куда вид первый операнд второй операнд вид операции Один байт на команду против четырёх: в этом и состоит разница в масштабе задачи
Учебная команда умещается в один байт, инструкция RISC-V занимает четыре: разные объёмы памяти команд и разные требования к транслятору

Учебная машина курса и RISC-V рядом

Процессор, который вы собираете в этом курсе, к RISC-V отношения не имеет: у него 8-битные регистры, 15 команд, гарвардская архитектура с раздельной памятью команд и данных и арифметика через аккумулятор с константой. Сравнение всё равно полезно, потому что видно, какие решения RISC-V принимает иначе.

ЗадачаУчебный процессор курсаRV32I
Загрузить из памятиLDA 5 — по адресуlw, lb — регистр плюс смещение
Записать в памятьSTA 5sw, sb
СложитьADD 3 — константа в аккумуляторadd rd, rs1, rs2 — три регистра
Вычесть, умножитьSUB 3, умножения нетsub, mul в расширении M
Исключающее ИЛИКоманды нет, собирается из AND, OR, NOTxor, xori в базовом наборе
Условный переходJZ, JN — по знаку результатаbeq, bne — по сравнению регистров
ОстановитьсяHLTebreak — ловушка, не штатная остановка

Одна и та же задача в двух синтаксисах: сложить данные, записанные в память, и сохранить результат.

; учебный процессор курса
LDA 5      ; загрузить из ячейки 5 в аккумулятор
ADD 3      ; сложить константу 3
STA 7      ; записать результат в ячейку 7
HLT        ; остановиться

; RISC-V, RV32I
lw   t0, 20(x0)   ; t0 = память[x0 + 20]
addi t0, t0, 3    ; t0 = t0 + 3
sw   t0, 28(x0)   ; память[x0 + 28] = t0
ebreak            ; трамплин, останавливает отладчик

Различия видны по строкам. В RISC-V результат живёт в регистре, операнд выбирается регистром, а число 3 кладётся рядом инструкцией сложения с константой. В учебной машине аккумулятор один, а адрес передаётся прямо в коде операции, поэтому операнд в команде — это константа от 0 до 15.

Чем учить

Практическая база бесплатная. RARS — ассемблер и симулятор RV32I от Кембриджского университета: запускается локально одним файлом, показывает состояние регистров и памяти на каждом шаге, умеет пошагово исполнять программу и показывать инструкции в машинных кодах. Это лучший способ увидеть, как команда превращается в биты.

Дальше по ступеням. Spike — точный по тактам симулятор из Беркли, эталон для проверки ядер. QEMU поддерживает RISC-V в пользовательском режиме, что позволяет запускать готовую операционную систему. Verilator компилирует написанный на Verilog процессор в быстрый симулятор, и на нём удобно проверять собственное ядро. Отдельно про обучение железу — статья про иерархию модулей и хаб по Verilog и ПЛИС: путь от кода к настоящей микросхеме в курсе проходит на Tang Nano 9K.

Чего RISC-V не даёт

Стандарт набора инструкций не является процессором. Из описания команд не следует, что машина будет быстрой: тактовая частота, ширина конвейера, кэш и память определяются реализацией, а не спецификацией. Точно так же RISC-V не превращает обычный компьютер в машинку под RISC-V: для этого нужна либо микросхема с таким ядром, либо симулятор, который её изображает.

Симулятор «Компьютера Ершова» к таким инструментам не относится: он выполняет 15 команд учебного процессора, а не инструкции RV32I. Разница между этими машинами — не в сложности, а в задаче. Курс учит собирать вычислитель с нуля из вентилей, Verilog и реальной печатной платы, а RISC-V даёт готовую систему команд, на которой можно писать программы сразу.

Что такое RISC-V?

RISC-V — открытый стандарт набора инструкций процессора, предложенный в 2010 году в Калифорнийском университете в Беркли и опубликованный в 2014-м. Это описание того, как процессор выполняет команды, а не готовая микросхема: по одному и тому же стандарту десятки компаний делают свои ядра и микроконтроллеры.

Чем RISC-V отличается от x86 и ARM?

x86 и ARM — закрытые стандарты: их спецификации и право их реализовывать принадлежат компаниям, и за лицензию платят производители чипов. Спецификация RISC-V открыта, лицензионных платежей за ядро нет, а к базовому набору разрешено добавлять собственные расширения. Обратная сторона: под конкретную RISC-V микросхему нет десятилетия готовых программ, и она не заменяет процессор вашего ноутбука.

Умеет ли симулятор «Компьютера Ершова» выполнять код RISC-V?

Нет. В игре используется учебный 8-битный процессор с 15 командами, собственный ассемблер и симулятор этой машины. Ни одна из команд RISC-V не реализована: симулятор показывает, как устроена вычислительная машина вообще, а не как устроена конкретная современная микросхема.

С чего начать изучение RISC-V?

С базового набора RV32I: 32 регистра общего назначения, загрузка и сохранение, арифметика, сравнения, переходы. Практика — в RARS, бесплатном ассемблере и симуляторе от Кембриджского университета, который запускается локально одним файлом и показывает состояние регистров и памяти на каждом шаге.

Проверьте себя

Зачем в RISC-V есть регистр x0, который всегда равен нулю?

Это константа, зашитая в набор регистров. Вместо отдельной команды «загрузить ноль» вы пишете адрес x0 в поле операнда, и кодирование остаётся одинаковым. Побочный эффект: запись в x0 молча игнорируется, и потерянное значение в выражении не приводит к ошибке, а меняет результат вычисления.

Почему нельзя просто установить в компьютер процессор RISC-V?

Программы на x86 скомпилированы под конкретную систему команд, а Windows и Linux для x86 содержат код, который процессор RISC-V выполнить не сможет. Нужна операционная система, собранная под RISC-V, и прикладные программы под неё. На практике это значит вторую операционную систему и второе программное обеспечение, а не замену процессора в том же корпусе.

Что означает «профиль микросхемы RISC-V»?

Набор расширений, который производитель выбрал для своего ядра: например, базовый RV32I плюс M для умножения и деления. Чем больше расширений, тем больше возможностей и тем уже совместимость с программами, рассчитанными только на базовый набор. Поэтому у RISC-V нет «процессора вообще», есть конкретные ядра с конкретными профилями.

Об устройстве процессора на уровне вентилей читайте в статье как работает процессор, о разнице между программированием и проектированием железа — в статье почему Verilog — это не программирование, о масштабе, к которому всё это приводит, — в статье сколько транзисторов в процессоре.

Попробовать в симуляторе →