RISC- (читается как риск-пять) — система команд управления вычислительными машинами с публичным стандартом.

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

Применяется в разработке системного ПО и конструировании процессорных архитектур любого назначения, например для центральных микропроцессоров и микроконтроллеров (периферийных процессоров). Используется в проектах открытых или закрытых вычислительных ядер СнК непосредственно в кремнии, процессорных эмуляторах, для конфигурирования ПЛИС и так далее.

История Идея проектирования открытой и расширяемой системы команд для процессоров с применением RISC-подхода возникла в 2010 году как продолжение исследований по изучению вычислительных систем в Калифорнийском университете Беркли в США, при непосредственном участии профессора Дэвида Паттерсона — одного из авторов концепций RISC и обладателя премии Тьюринга. Именование новой системы команд следует исторической линейке проектов — RISC-I/RISC-II (1981), RISC-III/SOAR (1984) и RISC-IV/SPUR (1988).

Руководителем группы разработчиков RISC-V был профессор Крсте Асанович, нынешние участники процесса развития RISC-V являются добровольцами из разных стран мира: коммерческих компаний, научных организаций, университетов, профессиональных объединений и альянсов. В отличие от других академических проектов, сосредоточенных на образовательных целях, RISC-V изначально проектируется для широкого круга компьютерных применений.

В 2015 году для развития, стандартизации и продвижения RISC-V создан международный фонд RISC-V и ассоциация RISC-V со штаб-квартирой в Цюрихе в Швейцарии, с более чем 4500 членами из 70 стран по состоянию на 2025 год. С 2018 года фонд RISC-V работает в партнёрстве с The Linux Foundation. В руководство и технические комитеты входят компании из разных стран, в том числе российские разработчики процессорных ядер Syntacore и CloudBEAR, а также разработчики системного программного обеспечения Альт Линукс и Астра Линукс. В России процессоры с системой команд RISC-V проектируют и выпускают компании Микрон, Прогресс, Миландр, НИИЭТ, Союз, Байкал Электроникс, Крафвей и другие.

В сентябре 2022 года в России образован Альянс RISC-V. По состоянию на декабрь 2022 года 13 из 25 мест в совете директоров RISC-V занимают китайские компании и организации, ведущую роль из которых занимает Китайская академия наук.

RISC-V добавлен в ядро Linux 5.17 в 2022 году вместе с его инструментальной цепочкой сборки. В Альт Линукс и openSUSE поддержка RISC-V развивается с 2018 года. В 2023 году RISC-V включен в качестве официальной архитектуры дистрибутива Debian GNU/Linux под названием riscv64. Дистрибутивы GNU/Linux Fedora и Gentoo также поддерживает RISC-V в качестве альтернативной архитектуры с 2025 года. ОС из линейки BSD (OpenBSD, NetBSD, FreeBSD) так же поддерживают порт на RISC-V.

С утверждением в 2024 году профиля команд RVA23, стандарт RISC-V получил стабильный долгосрочный набор команд для производительных вычислительных систем уровня современных ПК и ноутбуков.

Базовый набор команд и профили

Стандарт определяет 32 базовых регистра и 40 кодов команд в RV32I или 52 кодов в RV64I. Аббревиатура RV32I – это RISC-V, 32-разрядная (соответственно, в RV64I — 64-разрядная), I (от Integer) — кодирование команд с целочисленной арифметики.

Основные расширения базовых наборов команд: M — операции целочисленного умножения и деления. A — атомарные операции с памятью. F и D — операции с плавающей точкой одинарной (Float) и двойной (Double) точности и специальные дополнительные 32 регистра для них. C — сжатый формат команд длиной 16 бит, коды реализованы как подмножество RV32I/RV64I, предназначено для удвоения плотности упаковки в машинном слове наиболее востребованных стандартных команд. Обозначение RV32IMAC расшифровывается как система команд RISC-V 32-разрядная с расширениеми M, А и С.

Длина кода команд фиксированная — 32 бита (16 бит в С-расширении).

Базовый набор команд RV32Е предназначен для встраиваемых систем и совпадает по командам с RV32I, но содержит только 16 регистров. Применяется, например, в ядрах простых недорогих микроконтроллеров.

RV128I — планируемый базовый набор команд над 128-разрядными числами. Предусмотрен стандартом как резерв кодов под реализацию в будущем.

Наиболее частые в использовании и доказанные в применении комбинации базовых команд в комплекте с расширениями стандартизированы в профили: первоначально заданный профиль G в описании инициативы RISC-V 2016 года, который включает группу из 98 команд в составе IMAFD и в дальнейшем дополнен уточняющими расширениями Zicsr и Zifence профили RVI20, RVA20, RVA22 имеют версию 1.0 по состоянию на март 2023 года профили RVA23 и RVB23 имеют версию 1.0 по состоянию на октябрь 2024 года. RVA23U64 делает векторное (V) и RVA23S64 гипервизорное (H) расширения обязательными, которые были опциональными в RVA22.

Архитектурные особенности системы команд В базовые наборы входят команды условной и безусловной передачи управления/ветвления, минимальный набор целочисленных арифметических/битовых команд на регистрах, команды работы с памятью (load/store), а также небольшое число служебных команд.

Команды ветвления не используют каких-либо общих флагов как результатов ранее выполненных команд сравнения, а непосредственно сравнивают свои регистровые операнды. Для поддержки комплементарных команд операнды меняются местами.

Базовые наборы используют следующий набор регистров: регистр x0 (zero, с фиксированным значением, всегда равный нулю), 31 целочисленный регистр общего назначения (x1 — x31), регистр счётчика команд (PC, доступен только косвенно), а также набор служебных регистров CSR (Control and Status Registers, всего может быть адресовано до 4096 таких регистра).

Для встраиваемых применений может использоваться вариант архитектуры RV32E (Embedded) с сокращённым набором регистров общего назначения (первые 16 — x0-x15). Уменьшение количества регистров позволяет не только экономить аппаратные ресурсы, но и сократить затраты памяти и времени на сохранение/восстановление регистров при переключениях контекста.

При одинаковых кодах команд в RISC-V предусмотрены реализации архитектур с 32-, 64- и 128-битными регистрами общего назначения и операциями (RV32I, RV64I и RV128I, соответственно).

Разрядность регистровых команд всегда соответствует размеру регистра, а одни и те же значения в регистрах могут трактоваться как целые числа как со знаком, так и без знака.

Нет команд над частями регистров, нет каких-либо выделенных «регистровых пар».

Команды не сохраняют где-либо биты переноса или переполнения. Также аппаратно не генерируются исключения по переполнению и по делению на 0. Все необходимые проверки операндов и результатов выполнения команд должны производиться программно.

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

Размер операнда может отличаться от размера регистра только в командах работы с памятью. Транзакции к памяти осуществляются блоками, размер в байтах которых должен быть целой неотрицательной степенью 2, от одного байта до размера регистра включительно. Операнд в памяти должен иметь «естественное выравнивание» (адрес кратен размеру операнда).

Архитектура использует только модель little-endian — первый байт операнда в памяти соответствует младшим битам значений регистрового операнда.

Для пары инструкций сохранения/загрузки регистра операнд в памяти определяется размером регистра выбранной архитектуры, а не кодировкой команды (код команды один и тот же для RV32I, RV64I и RV128I, но размер операндов 4, 8 и 16 байт соответственно), что соответствует размеру указателя.

Для меньших, чем размер регистра, размеров операндов в памяти, имеются отдельные команды загрузки/сохранения младших битов регистра, в том числе для загрузки из памяти в регистр есть парные варианты команды, которые позволяют трактовать загружаемое значение как со знаком (старшим знаковым битом значения из памяти заполняются старшие биты регистра) или без знака (старшие биты регистра устанавливаются в 0).

Команды базового набора имеют длину 32 бита с выравниванием на границу 32-битного слова, но в общем формате предусмотрены команды различной длины (стандартно — от 16 до 192 бит с шагом в 16 бит) с выравниванием на границу 16-битного слова. Полная длина кода команды декодируется унифицированным способом из её первого 16-битного слова.

Команды умножения, деления и вычисления остатка не входят в минимальный набор кодов, а выделены в отдельное расширение (M — Multiply extension). Имеется ряд доводов в пользу разделения и данного набора на два отдельных (умножение и деление).

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

Спецификацией RISC-V предусмотрено несколько областей в пространстве кодов команд для пользовательских «X-расширений» архитектуры, которые поддерживаются на уровне ассемблера, как группы команд custom0 и custom1.

Базовые системы команд и расширения