Не следует путать с RISC-5 — системой команд виртуальной машины Никлауса Вирта, разработанной в ETH Цюрих для языков семейства Паскаль/Модула/Оберон и операционной системы Оберон.
RISC-V — открытый общественный стандарт на правила кодирования машинных команд для компьютерных систем на основе концепции RISC[1]. Используется для разработки системного ПО и создания процессорных архитектур любого назначения, например для центральных микропроцессоров и микроконтроллеров (периферийных процессоров). Стандарты кодирования процессорных инструкций в виде архитектурных описаний RISC-V свободно доступны и бесплатны для изучения и использования в ПО, а также при реализации в вычислительных ядрах непосредственно в кремнии или для конфигурирования ПЛИС. Участие в проектировании системы команд и обсуждении спецификаций архитектурных описаний открытое. Стандарт RISC-V включает специально предусмотренные биты в кодировке команд, предназначенные для развития стандартных расширений и бесконфликтного добавления других процессорных инструкций без ограничения области применения, включая коммерческие и закрытые реализации.
Идея проектирования открытой и расширяемой системы команд для процессоров появилась в 2010 году как продолжение исследований по изучению вычислительных систем в Калифорнийском университете Беркли в США, при непосредственном участии профессора Дэвида Паттерсона[2][3] — обладателя премии Тьюринга и одного из авторов концепций RISC. Именование новой системы команд следует исторической линейке проектов — RISC-I/RISC-II (1981), RISC-III/SOAR (1984) и RISC-IV/SPUR (1988).[4]
Руководителем группы разработчиков RISC-V был профессор Крсте Асанович, нынешние участники процесса развития RISC-V являются добровольцами из многих научных организаций, университетов и коммерческих компаний разных стран мира. В отличие от других академических проектов, сосредоточенных на образовательных целях, RISC-V изначально проектируется для широкого круга компьютерных применений.
В 2015 году для развития, стандартизации и продвижения RISC-V создан международный фонд RISC-V[5] и ассоциация со штаб-квартирой в Цюрихе[6] в Швейцарии. С 2018 года фонд RISC-V работает в партнёрстве с The Linux Foundation[7]. В руководство и технические комитеты входят компании из разных стран, в том числе русские разработчики процессорных ядер Syntacore[8] и CloudBEAR, а также разработчики системного программного обеспечения Альт Линукс и Астра Линукс[9]. В России процессоры с системой команд RISC-V проектируют и выпускают компании Микрон[10], Прогресс[11], Миландр[12], НИИЭТ[13], Союз[14], Байкал Электроникс[15] и другие.
В феврале 2022 года компания Intel объявила[16] об инвестировании в развитие RISC-V одного миллиарда долларов и вошла в состав руководства RISC-V. В сентябре 2022 года в России образован Альянс RISC-V[17][18]. По состоянию на декабрь 2022 года 13 из 25 мест в совете директоров RISC-V занимают китайские компании и организации, ведущую роль из которых занимает Китайская академия наук.
RISC-V добавлен в ядро Linux 5.17 в 2022 году вместе с его инструментальной цепочкой сборки[19]. В Альт Линукс[20] и openSUSE поддержка RISC-V развивается с 2018 года. В 2023 году RISC-V включен в качестве официальной архитектуры дистрибутива DebianЛинукс под названием riscv64[21]. Дистрибутивы Линукс Fedora и Gentoo также поддерживает RISC-V в качестве альтернативной архитектуры с 2025 года. ОС из линейки BSD (openBSD, NetBSD, FreeBSD) так же поддерживают порт[22] на RISC-V.
Базовый набор команд
Набор команд RV32IMAC
Спецификация стандарта[23] определяет 32 базовых регистра и 40 кодов машинных инструкций в RV32I или 52 кода в RV64I. Аббревиатура RV32I расшифровывается как RV — RISC-V, 32-разрядная (в RV64I — 64-разрядная), I (от Integer) — кодирование команд с целочисленной арифметикой. Длина машинных инструкций фиксированная — 32 бита.
Основные расширения для дополнения базовых наборов команд:
M — целочисленное умножение и деление.
A — атомарные операции с памятью.
F и D — дополнительные 32 регистра и инструкции для операций с плавающей точкой одинарной (Float) и двойной (Double) точности.
C — сжатый формат команд длиной 16 бит, кодирование инструкций реализовано как подмножество RV32I/RV64I и предназначено для удвоения плотности упаковки в машинном слове наиболее востребованных стандартных инструкций.
Обозначение RV32IMAC расшифровывается как система команд RISC-V 32-разрядная с расширением M, А и С.
Базовый набор команд RV32Е для встраиваемых систем совпадает по кодированию и набору инструкции с RV32I, но содержит только 16 регистров. Применяется, например, в ядрах простых недорогих микроконтроллеров.
RV128I — планируемый базовый набор для 128-разрядных операций. Предусмотрен стандартом как резерв кодов машинных инструкций под реализацию в будущем.
Наиболее частые в использовании и доказанные в применении комбинации базовых инструкций в комплекте с расширениями стандартизированы в профили:
профили RVI20, RVA20, RVA22 имеют версию 1.0 по состоянию на март 2023 года[24];
профили RVA23 и RVB23 имеют версию 1.0 по состоянию на октябрь 2024 года. RVA23U64 делает векторное расширение V обязательным (было опциональным для RVA22U64)[25].
Архитектурные особенности системы команд
В базовые наборы входят инструкции условной и безусловной передачи управления/ветвления, минимальный набор целочисленных арифметических/битовых операций на регистрах, операций с памятью (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.
Наборы базовых команд и расширений
Сокращение
Наименование
Версия
Статус
Количество команд
Базовые наборы
RVWMO
Базовая модель согласованности памяти
2.0
Стандарт
RV32I
Базовый набор с целочисленными операциями, 32-битный
2.1
Стандарт
40
RV32E
Базовый набор RV32I с сокращённым до 16 количеством регистров (embedded)
2.0
Стандарт
40
RV64I
Базовый набор с целочисленными операциями, 64-битный
2.1
Стандарт
52
RV64E
Базовый набор с целочисленными операциями, 64-битный (embedded)
2.0
Стандарт
52
RV128I
Базовый набор с целочисленными операциями, 128-битный
1.7
Проект
64
Расширения
M
Целочисленное умножение и деление (Integer Multiplication and Division)
Инструкции для работы с регистрами состояния и конфигурации ядра (Control and Status Register (CSR) Instructions)
2.0
Стандарт
6
Zicond
Условное выполнение инструкций
1.0
Стандарт
Zifencei
Инструкции синхронизации потоков команд и данных (Instruction-Fetch Fence)
2.0
Стандарт
1
Zihintpause
Pause Hint
2.0
Стандарт
Zihintntl
Non-Temporal Locality Hints
0.3
Проект
Zam
Расширение для смещённых атомарных операций (Extension for Misaligned Atomics)
0.1
Проект
Zfh
Extensions for Half-Precision Floating-Point
1.0
Стандарт
Zfhmin
Extensions for Half-Precision Floating-Point
1.0
Стандарт
Zfinx
Standard Extensions for Floating-Point in Integer Registers
1.0
Стандарт
Zdinx
Standard Extensions for Floating-Point in Integer Registers
1.0
Стандарт
Zhinx
Standard Extensions for Floating-Point in Integer Registers
1.0
Стандарт
Zhinxmin
Standard Extensions for Floating-Point in Integer Registers
1.0
Стандарт
Ztso
Расширение для модели согласованности памяти RVTSO (Extension for Total Store Ordering)
0.1
Проект
G
=IMAFD Zicsr Zifencei Обобщенное/сокращёное обозначение для набора расширений
н/д
н/д
Наборы команд для привилегированных режимов
Machine ISA
Инструкции аппаратного уровня
1.12
Стандарт
Supervisor ISA
Инструкции уровня супервизора
1.12
Стандарт
4
Svnapot Extension
(Extension for NAPOT Translation Contiguity)
1.0
Стандарт
Svpbmt Extension
(Extension for Page-Based Memory Types)
1.0
Стандарт
Svinval Extension
(Extension for Fine-Grained Address-Translation Cache Invalidation)
1.0
Стандарт
Hypervisor ISA
Инструкции уровня гипервизора
1.0
Стандарт
15
В 32-битных микроконтроллерах и для других встраиваемых применений используется набор RV32EC. В 64-битных процессорах может быть набор групп RV64GC, то же самое в полной записи — RV64IMAFDC.
Форматы машинных команд
Схемы кодирования 32-битных машинных команд в RISC-V
(признаки — младшие биты всегда «11» и 2-4 биты ≠̸ «111»)
Тип
31
30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
Сохранение
±
но[10:5]
исх2
исх1
оп3
но[4:0]
код операции
11
Ветвление
±
но[10:5]
исх2
исх1
оп3
но[4:1]
[11]
код операции
11
Регистр/регистр
оп7
исх2
исх1
оп3
назн
код операции
11
Короткий операнд
±
но[10:0]
исх1
оп3
назн
код операции
11
Длинный операнд
±
но[30:12]
назн
код операции
11
Переход
±
но[10:1]
[11]
но[19:12]
назн
код операции
11
± — знак непосредственного операнда (0 плюс/1 минус)
но — значение непосредственного операнда с номерами бит в кодировке значения
исх1 — номер регистра, в котором находится первый операнд
исх2 — номер регистра, в котором находится второй операнд
назн — номер регистра, в который будет записан результат
оп3/оп7 — уточняющий код операции.с размером в битах
Схемы кодирования 16-битных машинных команд в RISC-V
(используется только в расширении С — сжатые команды, младшие биты ≠̸ «11»)
Тип
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
Регистр/регистр
оп4
назн/исх1
исх2
оп2
Короткий операнд
оп3
но
назн/исх1
но
оп2
Загрузка/сохранение [х2]
оп3
но
исх2
оп2
Длинный операнд
оп3
но
назн*
оп2
Загрузка [регистр]
оп3
но
исх1*
но
назн*
оп2
Сохранение [регистр]
оп3
но
исх1*
но
исх2*
оп2
Арифметические
оп6
назн*/исх1*
оп2
исх2*
оп2
Ветвление/арифм.
оп3
но
назн*/исх1*
но
оп2
Переход
оп3
но
оп2
но — значение непосредственного операнда с номерами бит в кодировке значения
исх1 — номер регистра, в котором находится первый операнд
исх2 — номер регистра, в котором находится второй операнд
назн — номер регистра, в который будет записан результат
* — особые значения кодов в соответствии с требованиями кодирования в С-расширении
Регистры
RISC-V имеет 32 (или 16 для встраиваемых применений) целочисленных регистра. При реализации вещественных групп команд есть дополнительно 32 вещественных регистра.
Рассматривается вариант включения в стандарт дополнительного набора из 32 векторных регистров с вариативной длиной обрабатываемых значений, длина которых указывается в CSR vlenb[26].
Для операций над числами в бинарных форматах плавающей запятой используется набор дополнительных 32 регистров FPU (Floating Point Unit), которые совместно используются расширениями базового набора инструкций для трёх вариантов точности: одинарной — 32 бита (F extension), двойной — 64 бита (D — Double precision extension), а также четверной — 128 бит (Q — Quadruple precision extension).
Имена регистров в системе команд и соглашения о псевдонимах в EABI и psABI
Здесь может располагаться отдельный раздел. Помогите Википедии, написав его.(17 августа 2021)
Реализации
В рамках проекта создано и опубликовано под свободной лицензией шесть дизайнов микропроцессоров с архитектурой RISC-V: генератор 64-разрядных Rocket (7 октября 2014[27][28]) и пять упрощённых учебных ядер «Sodor» с различными микроархитектурами.
Также опубликовано несколько симуляторов (включая qemu и ANGEL — JavaScript-симулятор, работающий в браузере), компиляторов (LLVM, GCC), вариант ядра Linux для работы на RISC-V и компилятор дизайнов Chisel, который позволяет получать Verilog-код. Также опубликованы верификационные тесты[29].
Некоммерческая организация lowRISC планирует создание системы на кристалле на базе 64-битного ядра Rocket RISC-V с последующим массовым производством чипов[30][31].
На конференции RISC-V Workshop 2017 стало известно, что компания Esperanto Technologies разрабатывает 64-битный высокопроизводительный процессор общего назначения на системе команд RISC-V с гетерогенной архитектурой с высокой степенью параллелизма (напоминающий по строению процессор Cell), который в максимальной конфигурации будет содержать 16 ядер «ET-Maxion» (представляют собой конвейеры с неупорядоченным выполнением команд и работающие с данными с плавающей запятой) и 4096 ядер «ET-Minion» (конвейеры с последовательным выполнением команд и блоком с векторными вычислениями в каждом ядре)[32].
Компания Western Digital заявила, что в партнёрстве с компанией Esperanto она повысит текущий статус процессорной архитектуры RISC-V с уровня микроконтроллеров до уровня высокопроизводительных решений и создаст вычислительную архитектуру нового поколения для обработки «больших данных»[33], а также экосистему быстрого доступа к данным — речь идёт о создании специализированных RISC-V-ядер для построения архитектуры «процессор в памяти» (processor-in-memory)[34].
Популярные и недорогие микроконтроллеры серии ESP32 выпускаются с архитектурой RISC-V, например, серии ESP32-C, ESP32-H и ESP32-P.
Процессорные ядра
Ряд компаний предлагает готовые сложно-функциональные блоки (англ. IP-cores) вычислительных ядер с системой команд RISC-V для проектирования топологии микропроцессоров или использования для прошивки ПЛИС, среди них:
Микрон (Россия): MIK32 (32-битное RV32IMC ядро SCR1 Syntacore, 1-32 МГц, фабрика Микрон, ОЗУ 16 КБ, ППЗУ 8 КБ, 64 входа/выхода, АЦП 12 бит 8 каналов до 1 МГц;, ЦАП 12 бит 4 канала до 1 МГц, криптография ГОСТ Р 34.12-2015 «Магма», «Кузнечик» и AES 128). Технологические нормы 180 нм.[69][70]
Переход ESP32 на чипы с RISC-V ядрами (ESP32-C и ESP32-H), в 2022 году компания Espressif Systems сообщила о переходе всех своих линеек чипов на архитектуру RISC-V[71]
ARM — семейство лицензируемых 32-битных и 64-битных микропроцессорных ядер разработки компании ARM Limited
OpenPOWER — коллаборация вокруг архитектуры IBM Power, основанная в 2013 году IBM, Google, Mellanox, NVIDIA
OpenSPARC — свободная (GPL) реализация архитектуры SPARC V9 от 2005 года
OpenRISC — свободная архитектура 2000 года с GPL-реализацией or1k
LEON — свободные реализации (GPL, LGPL) архитектуры SPARC V8, появившиеся в 1997 году
MIPS (MIPS Open) — наборы команд и архитектура, имеющие свободную лицензию на некоторые наборы команд с конца 2018 до конца 2019 года[72]
Примечания
↑Frequently-asked questions. (неопр.)RISC-V. Regents of the University of California. Дата обращения: 25 августа 2014. Архивировано из оригинала 19 февраля 2016 года.
↑Contributors (неопр.). riscv.org. Regents of the University of California. Дата обращения: 25 августа 2014. Архивировано из оригинала 20 августа 2014 года.