Блог

Создание процессора со свободная архитектурой RISC-V. Часть 1.

RISC-V — это свободная архитектура набора команд. Проект зародился в Калифорнийском университете в Беркли в 2010 году. Важную роль в его успехе сыграла открытость кода и свобода использования, что резко отличалось от многих других архитектур. Возьмите ARM: чтобы создать совместимый процессор, вы должны заплатить авансовый сбор от $1 млн до $10 млн, а также выплачивать роялти 0,5−2% с продаж. Свободная и открытая модель делает RISC-V привлекательным вариантом для многих, в том числе для стартапов, которые не могут оплатить лицензию на ARM или другой процессор, для академических исследователей и (очевидно) для сообщества open source.

Стремительный рост популярности RISC-V не остался незамеченным. ARM запустила сайт, который пытался (довольно безуспешно) подчеркнуть предполагаемые преимущества ARM над RISC-V (сайт уже закрыт). Проект RISC-V поддерживают многие крупные компании, включая Google, Nvidia и Western Digital.

Система команд

В архитектуре RISC-V имеется обязательное для реализации небольшое подмножество команд (набор инструкций I — Integer) и несколько стандартных опциональных расширений.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Для наиболее часто используемых инструкций стандартизовано применение их аналогов в более компактной 16-битной кодировке (C — Compressed extension).

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

Стандартизован отдельный набор атомарных операций (A — Atomic extension).

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

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

Список наборов команд

СокращениеНаименованиеВерсияСтатус
Базовые наборы
RV32I Базовый набор с целочисленными операциями, 32-битный 2.0 Frozen
RV32E Базовый набор с целочисленными операциями для  встраиваемых систем, 32-битный, 16 регистров 1.9 Open
RV64I Базовый набор с целочисленными операциями, 64-битный 2.0 Frozen
RV128I Базовый набор с целочисленными операциями, 128-битный 1.7 Open
Стандартные расширеные наборы
M Целочисленное умножение и деление (Integer Multiplication and Division) 2.0 Frozen
A Атомарные операции (Atomic Instructions) 2.0 Frozen
F Арифметические операции с плавающей точкой над числами одинарной точности (Single-Precision Floating-Point) 2.0 Frozen
D Арифметические операции с плавающей точкой над числами двойной точности (Double-Precision Floating-Point) 2.0 Frozen
G Сокращеное обозначение для комплекта из базового и стандартного наборов команд н/д н/д
Q Арифметические операции с плавающей точкой над числами четвертной точности 2.0 Frozen
L Арифметические операции над числами с фиксированной точкой (Decimal Floating-Point) 0.0 Open
C Сокращённые имена для команд (Compressed Instructions) 2.0 Frozen
B Битовые операции (Bit Manipulation) 0.36 Open
J Двоичная трансляция и поддержка динамической компиляции (Dynamically Translated Languages) 0.0 Open
T Транзакционная память (Transactional Memory) 0.0 Open
P Короткие SIMD-операции (Packed-SIMD Instructions) 0.1 Open
V Векторные расширения (Vector Operations) 0.2 Open
N Инструкции прерывания (User-Level Interrupts) 1.1 Open

В 32-битных микроконтроллерах и для других встраиваемых применений используется набор RV32EC. В 64-битных процессорах может быть набор групп RV64GC, то же самое в полной записи – RV64IMAFDC.

Форматы машинных команд

Формат 32-битной машинной команды (признаки – младшие биты всегда «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
Регистр/регистр funct7 rs2 rs1 funct3 rd код операции 1 1
С операндом ± imm[10:0] rs1 funct3 rd код операции 1 1
С длинным операндом ± imm[30:12] rd код операции 1 1
Сохранение ± imm[10:5] rs2 rs1 funct3 imm[4:0] код операции 1 1
Ветвление ± imm[10:5] rs2 rs1 funct3 imm[4:1] [11] код операции 1 1
Переход ± imm[10:1] [11] imm[19:12] rd код операции 1 1
  • rs1 - номер регистра в котором находится первый операнд
  • rs2 - номер регистра в котором находится второй операнд
  • rd - номер регистра в который будет записан результат

Регистры

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

Для операций над числами в бинарных форматах плавающей точкой используется набор дополнительных 32 регистров FPU (Floating Point Unit), которые совместно используются расширениями базового набора инструкций для трёх вариантов точности: одинарной — 32 бита (F extension), двойной — 64 бита (D — Double precision extension), а также четверной — 128 бит (Q — Quadruple precision extension).

Доступ к памяти

Как и многие проекты RISC, RISC–V является архитектурой load-store: инструкции адресуют только регистры, а инструкции load и store передаются в память и из памяти.

Большинство инструкций загрузки и хранения включают 12-битное смещение и два идентификатора регистра. Один регистр является базовым регистром. Другой регистр является источником (для записи) или местом назначения (для чтения.)

Смещение добавляется в базовый регистр для получения адреса. Формирование адреса в виде Базового регистра плюс смещение позволяет отдельным инструкциям получить доступ к структурам данных. Например, если базовый регистр указывает на вершину стека, отдельные инструкции могут обращаться к локальным переменным подпрограммы в стеке. Аналогичным образом инструкции загрузки и хранения могут обращаться к структуре стиля записи или устройству ввода-вывода с отображением в памяти. Использование постоянного нулевого регистра в качестве базового адреса позволяет отдельным командам обращаться к памяти вокруг нулевого адреса.[1]

Память адресуется как 8-битные байты, причем слова находятся в порядке little-endian.[1] Слова, вплоть до размера регистра, могут быть доступны с инструкциями загрузки и хранения.

Адреса доступной памяти не обязательно должны быть выровнены по ширине слова, но доступ к выровненным адресам может быть быстрее; например, простые процессоры могут реализовывать доступ к не выровненным данным с помощью программной эмуляции, которая вызвается в прерывании сбоя выравнивания, естественно это будет работать медленнее, чем аппаратная реализация.[1]

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

Инструкция fence гарантирует, что результаты предшествующих операций видны для последующих операций других потоков или устройств ввода-вывода. Инструкция fence может гарантировать порядок комбинаций как орпераций работы с памятью, так и операций ввода-вывода с отображением в памяти. Например, он может разделять операции чтения и записи памяти, не влияя на операции ввода-вывода. Или, если система может работать устройства ввода / вывода параллельно с памятью, fence не заставляет их ждать друг друга. Один процессор с одним потоком может декодировать fence как nop.

Как и многие наборы команд RISC (и некоторые сложные наборы команд компьютера (CISC), такие как x86 и IBM System/360 семейств), RISC-V не имеет адресных режимов, которые записывают lданные обратно в регистры. Например, не предусмотенно команд с автоинкрементом адресных регистров.[1]

RISC-V мало похож на другие знакомые, успешные процессорные архитектуры, например, x86. Этот факт также уменьшает сложность процессора и немного уменьшает стоимость, потому что он читает все размеры слов в том же порядке. Например, набор инструкций RISC-V декодирует, начиная с самого младшего адресованного байта инструкции. Спецификация оставляет открытой возможность нестандартных систем big-endian или bi-endian.[1]

Некоторые процессоры RISC (такие как MIPS, PowerPC, DLX и Berkeley's RISC-I) размещают 16 бит смещения в теле комманд load и store. Они устанавливают верхние 16 бит с помощью инструкции верхнего слова загрузки. Это позволяет легко устанавливать значения верхнего полуслова без сдвига битов. Тем не менее, в большинстве случаев использование инструкции верхнего полуслова создает 32-битные константы, такие как адреса. RISC-V использует SPARC-подобную комбинацию 12-битных смещений и 20-битных верхних кодов инструкций. Меньшее 12-битное смещение помогает компактным 32-битным командам загрузки и сохранения выбрать два из 32 регистров, но при этом все еще имеет достаточно битов для поддержки кодирования команд переменной длины RISC-V.[1]

Непосредственная адресация

RISC-V обрабатывает 32-битные константы и адреса с помощью инструкций, которые устанавливают старшие 20 бит 32-битного регистра. Инструкция непосредственной загрузки lui, загружает 20 бит в биты от 31 до 12. Затем вторая инструкция, такая как addi, может установить нижние 12 бит.

Этот метод расширен для того чтобы позволить создавать положение-независимый код путем добавление инструкции, например auipc которая генерирует 20 старших битов адреса путем добавления смещения к счетчику программы и сохранения результата в базовом регистре. Это позволяет программе генерировать 32-разрядные адреса, используя смещение относительно счетчика программы.

Базовый регистр часто можно использовать как есть с 12-битными смещениями для команд load и store. При необходимости addi может установить нижние 12 бит регистра. В 64-битных и 128-битных ISA lui и auipc расширяют результат, чтобы получить больший адрес.[1]

Некоторые быстрые процессоры могут интерпретировать комбинации инструкций как одиночные слитые инструкции. lui или auipc могут быть хорошими кандидатами для слияния с addi, load или store.

Вызовы подпрограмм, переходы и ветвления

Вызов подпрограммы RISC-V jal (jump and link) помещает свой обратный адрес в регистр. Это быстрее во многих компьютерных архитектурах, потому что это экономит доступ к памяти по сравнению с системами, которые сохраняют обратный адрес непосредственно на стеке в памяти. JAL имеет 20-битный знак (дополнение до 2) смещение. Смещение умножается на 2, а затем добавляется к счетчику программ PC, чтобы сгенерировать относительный адрес для 32-битной инструкции. Если результат не находится на 32-разрядном адресе (т. е. равномерно делится на 4), процессор может вызвать исключение.[1]

Процессоры RISC-V переходят к вычисляемым адресам с помощью jump и link-регистров, инструкции jalr. jalr похожи на jal, но получает свой адрес назначения, добавляя 12-битное смещение к базовому регистру. (В отличие от этого, jal добавляет большее 20-битное смещение к счетчику программ PC.)

Битовый формат jalr похож на регистр-относительные команды load и store. Как и они, jalr может использоваться с инструкциями, которые устанавливают верхние 20 бит Базового регистра, чтобы сделать 32-разрядные адреса условного перехода, либо абсолютные адреса (используя lui), либо относительно счетчика программ PC (используя auipc для позиционно-независимого кода). (Использование постоянного нулевого базового адреса позволяет создавать однокомандные вызовы с небольшим фиксированный положительным или отрицательным смещением адреса.)

RISC-V перерабатывает команды jal и jalr для получения безусловных 20-разрядных переходов относительно счетчика программ PC и безусловных 12-разрядных переходов на основе регистров. Переходы просто устанавливают регистр связи 0, чтобы обратный адрес не сохранялся.[1]

RISC-V также использует команду jalr для возврата из подпрограммы: для этого базовый регистр команды jalr устанавливается как регистр связи, сохраненный jal или jalr. Если смещение jalr и регистр связи рвны нулю, то смещение отсутствует, и обратный адрес не сохраняется.

Как и многие проекты RISC, в вызове подпрограммы компилятор RISC-V должен использовать отдельные инструкции для сохранения регистров в стеке при запуске, а затем для восстановления их из стека при выходе. RISC-V не имеет инструкций сохранения или восстановления нескольких регистров. Считалось, что они делают процессор слишком сложным и, возможно, медленным.[59] такая реализация может занять больше места в коде. Дизайнеры архитектуры планировали уменьшить размер кода с помощью библиотечных процедур для сохранения и восстановления регистров.[60]

RISC-V не имеет регистра кодов условия или бита переноса. Разработчики считали, что коды условий делают быстрые процессоры более сложными, заставляя взаимодействовать между инструкциями на разных этапах выполнения. Этот выбор делает арифметику повышенной точности более сложной. Кроме того, такое решение требуют больше энергии.[1]

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

Инструкции ветвления-сравнения имеют двенадцатиразряднное знаковое смещение и переходят относительно счетчика программ PC.[1]

ISA RISC-V требует предсказания ветвлений по умолчанию для проектируемых процессоров: Условные ветви с переходом назад должны быть предсказаны. Условные ветви с переходом вперед прогнозировать не берутся. Предсказания легко декодировать в конвейерном процессоре: адреса перехода- это знаковые числа в коде дополнения до 2, которые прибавляются к счетчику программ PC. Ветви с переходом назад имеют отрицательные смещения ареса в коде дополнения до 2, и, таким образом, имеют 1 в старшем значащем бите адреса. Ветви с переходом вперед имеют 0. Самый старший значащий бит находится в фиксированном месте в коде операции для ускорения конвейера. Сложные процессоры могут добавлять предсказатели ветвей, чтобы хорошо работать даже с необычными данными или ситуациями.

Руководство ISA рекомендует оптимизировать программное обеспечение, чтобы избежать остановок конвеера, используя прогноз ветвлений по умолчанию. Это позволяет повторно использовать старший значащий бит знакового относительного адреса в качестве бита подсказки, чтобы предсказать, будет ли выполнен условный переход или нет. Таким образом, никакие другие биты подсказки не требуются в кодах операций ветвления RISC-V. Эта особенность дает возможность использовать больше битов в кодах операций ветвления. Простые, недорогие процессоры могут просто следовать прогнозам по умолчанию и по-прежнему хорошо работать с оптимизирующими компиляторами. Компиляторы по-прежнему могут выполнять статистическую оптимизацию пути выполнения программы, если это необходимо.[1]

Чтобы избежать ненужной загрузки блока предсказания ветвления (и, следовательно, ненужных остановок конвейера), сравниваемые коды ветвления никогда не должны использоваться для безусловных переходов.[1]

RISC-V не поддерживает предикацию (условное выполнение инструкций), поскольку ее разработчики утверждают, что процессоры без предикации легче проектировать, а оптимизирующие компиляторы менее склонны ошибочно использовать предикацию там, где она не должна использоваться. Дизайнеры утверждают, что очень быстрые, out-of-order CPU все равно делают предикацию, выполняя ветвь сравнения и условный код параллельно, а затем отбрасывая эффекты неиспользуемой ветви. Они также утверждают, что даже в более простых процессорах предикация менее ценна, чем предсказание ветвей, что может предотвратить большинство остановок конвеера, связанных с условными ветвями. Код без предикации больше, с большим количеством ветвей, но они также утверждают, что сжатый набор команд (например, набор RISC-V версия C) решает эту проблему в большинстве случаев.[1]

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

Арифметические и логические наборы команд

RISC-V разделяет математику на минимальный набор целочисленных инструкций (set I) с добавлением, вычитанием, сдвигом, битовой логикой и ветвлением со сравнением. Реализации могут имитировать большинство других наборов инструкций RISC-V с помощью программного обеспечения. (Атомарные инструкции являются заметным исключением.) RISC-V в настоящее время не хватает счетчика ведущих нулей и операций над битовым полем, которые обычно используются для ускорения программного обеспечения с плавающей точкой в процессоре с чистыми целочисленными инструкциями.

Целочисленные инструкции умножения (набор M) включают в себя знаковое и беззнаковое умножение и деление. Целочисленные операции умножения и деления двойной точности включены, как умножения и деления, которые вычисляют старшее слово результата. В документе ISA рекомендуется, чтобы разработчики процессоров и компиляторов объединяли стандартизированную последовательность команд умножения и деления старших и младших разрядов комбинировали в одну операцию, если это возможно.[1]

Инструкции с плавающей точкой (набор F) включают арифметику с одинарной точностью, а также условные переходы, аналогичные целочисленной арифметике. Для этого требуется дополнительный набор из 32 регистров с плавающей точкой. Они отделены от целочисленных регистров. Инструкции с плавающей точкой двойной точности (набор D) обычно предполагают, что регистры с плавающей точкой являются 64-разрядными (т. е. двойной длины), и подмножество F совместимо с набором D. Также определяется 128-битный ISA (Q) с плавающей точкой с квадратичной точностью. Процессоры RISC-V без плавающей точкой могут использовать библиотеку программной эмуляции работы с плавающей точкой.[1]

RISC-V не вызывает исключений по арифметическим ошибкам, включая переполнение, исчезновение значащих разрядов, субнормализацию и деление на ноль. Вместо этого как целочисленная, так и арифметика с плавающей точкой выдают разумные значения по умолчанию и устанавливают биты состояния. Деление на ноль может быть обнаружено одной ветвью после деления. Биты состояния могут быть проверены операционной системой или периодическим прерыванием.[1]

Атомарные операции с памятью

RISC-V поддерживает компьютеры, которые совместно используют память между несколькими процессорами и потоками. Стандартной моделью согласованности памяти RISC-V является согласованность освобождения. То есть операции load и store могут быть в целом переупорядочены, но некоторые операции load могут быть обозначены как операции выделения, которые должны предшествовать более поздним обращениям к памяти, а некоторые операции store могут быть обозначены как операции release, которые должны следовать за более ранними обращениями к памяти.[1]

Базовый набор команд включает в себя минимальную поддержку в виде команды fence для обеспечения упорядочения памяти. Хотя этого достаточно (операции fence r, rw обеспечивают выделение и fence rw, w обеспечивает освобождение), хотя комбинированные операции могут быть более эффективными.[1]

Расширение atomic memory operation extension поддерживает два типа атомарных операций памяти для обеспечения release consistency. Во-первых, он предоставляет универсальные инструкции load-reserved lr и store-conditional sc. lr выполняет загрузку и пытается зарезервировать этот адрес для своего потока. Выполняющаяся позднее операция store-conditional sc для записи в зарезервированный адрес будет выполнена только в том случае, если резервирование не будет нарушено промежуточной операцией store из другого источника. Если операция store выполнена успешно, ноль помещается в сохраненный регистр. Если запись не удалась, ненулевое значение указывает, что программное обеспечение должно повторить операцию. В любом случае бронирование аннулируется.[1]

Вторая группа атомарных инструкций выполняет последовательности чтения-изменения-записи: load (которая необязательно является load-acquire) в регистр назначения, затем операция между загруженным значением и исходным регистром, затем store результата (которое может необязательно быть store-release). Создание дополнительных барьеров памяти позволяет комбинировать операции. Дополнительные операции включаются с помощью битов acquire и release, которые присутствуют в каждой атомарной инструкции. RISC-V определяет девять возможных операций: swap (непосредственно использовать значение исходного регистра); add; побитовое and, or и exclusive-or; и знаковый и беззнаковый минимум и максимум.[1]

Конструкция системы может оптимизировать эти совмещенные операции больше чем lr и sc. Например, если регистр назначения для swap является постоянным нулем, загрузка может быть пропущена. Если сохраненное значение не изменено с момента загрузки, store может быть пропущено.[1]

IBM System/370 и его преемники, включая Z / Architecture и x86, реализуют инструкцию compare-and-swap (cas), которая проверяет и условно обновляет местоположение в памяти: если местоположение содержит ожидаемое старое значение, cas заменяет его заданным новым значением; затем он возвращает указание о том, внес ли он изменение. Однако простая инструкция типа load обычно выполняется перед cas для извлечения старого значения. Классическая проблема заключается в том, что если поток читает (загружает) значение A, вычисляет новое значение C, а затем использует (cas) для замены A на C, он не может знать, заменила ли программа в другом потоке какое-либо другое значение B, а затем восстановила A между ними. В некоторых алгоритмах (например, в тех, в которых значения в памяти являются указателями на динамически выделенные блоки) эта проблема ABA может привести к неверным результатам. Наиболее распространенное решение использует инструкцию cas двойной ширины для обновления указателя и смежного счетчика; к сожалению, такая инструкция требует специального формата инструкции для указания нескольких регистров, выполняет несколько операций чтения и записи и может иметь сложную операцию шины.[1]

Альтернатива использования lr/sc инструкций более эффективна. Обычно требуется только одна операция загрузка памяти, так как желательно минимизировать медленные операции с памятью. Это также точно: он контролирует все обращения к ячейке памяти, а не просто обеспечивает битовый шаблон. Однако, в отличие от cas, он может разрешить livelock, в котором два или более потоков неоднократно вызывают сбой инструкций друг друга. RISC-V гарантирует поступательное продвижение (без livelock), если код следует правилам о времени и последовательности инструкций: 1) он должен использовать только подмножество I. 2) чтобы предотвратить повторяющиеся промахи кэша, код (включая цикл повтора) должен занимать не более 16 последовательных инструкций. 3) оно не должен включать никакие инструкции system или fence, или выполнение обратных ветвлений между lr и sc. 4) Обратная ветвь цикла повторения должна соответствовать исходной последовательности. [1]

В спецификации приведены примеры использования этого подмножества для блокировки структуры данных.[1]

Сокращенные команды

Стандарт RISC-V ISA указывает, что все инструкции являются 32-битными. Это делает особенно простой реализацию, но, как и другие процессоры RISC с таким кодированием команд, приводит к большему размеру кода, чем в других наборах команд.[1] [59] для компенсации 32-разрядные инструкции RISC-V на самом деле составляют 30 бит; 3⁄4 пространства кода операции зарезервировано для дополнительного (но рекомендуемого) сжатого набора команд переменной длины, RVC, который включает 16-разрядные инструкции. Как и ARM's Thumb и MIPS16, сжатые инструкции являются просто псевдонимами для подмножества более крупных инструкций. В отличие от ARM's Thumb или сжатого набора MIPS, пространство было зарезервировано с самого начала, поэтому нет отдельного режима работы. Стандартные и сжатые инструкции могут быть смешаны свободно.[1] [59] (ревизия С)[60]

Поскольку (как Thumb-1 и MIPS16) сжатые инструкции являются просто альтернативными кодировками (псевдонимами) для выбранного подмножества более крупных инструкций, сжатие может быть реализовано в ассемблере, и компилятору не обязательно даже знать об этом.

Прототип RVC был протестирован в 2011 году.[59] код прототипа был на 20% меньше, чем сжатый код x86 PC и MIPS, и на 2% больше, чем код ARM Thumb-2.[59] Это также существенно уменьшило как необходимую кэш-память, так и оценочное энергопотребление системы памяти.[59]

Исследователи намеревались уменьшить двоичный размер кода для небольших компьютеров, особенно встроенных компьютерных систем. Прототип включал 33 наиболее часто используемые инструкции, перекодированные в виде компактного 16-битного формата с использованием кодов операций, ранее зарезервированных для сжатого набора.[59] сжатие было сделано в ассемблере, без изменений в компиляторе. Сжатые инструкции пропускали поля, которые часто равны нулю, использовали небольшие непосредственные значения или обращались к подмножествам (16 или 8) регистров. Операция addi очень распространена и часто сжимается.[59]

Большая часть разницы в размере по сравнению с набором Arm's Thumb произошла из-за того, что RISC-V и прототип не имеют инструкций по сохранению и восстановлению нескольких регистров. Вместо этого компилятор генерирует обычные инструкции, которые обращаются к стеку. Затем прототип RVC assembler часто преобразовывал их в сжатые формы, которые были вдвое меньше. Однако это по-прежнему занимало больше места в коде, чем инструкции ARM, которые сохраняют и восстанавливают несколько регистров. Исследователи предложили модифицировать компилятор для вызова библиотечных подпрограмм для сохранения и восстановления регистров. Эти процедуры, как правило, остаются в кэше кода и, таким образом, выполняются быстро, хотя, вероятно, не так быстро, как команда сохранения нескольких регистров.[59]

Стандарт RVC требует переодического использования 32-разрядных инструкций. Несколько нестандартных реализаций RVC являются полными, не требующими 32-разрядных инструкций, и, как говорят, имеют более высокие плотности, чем стандартные RVC.[61] [62] Другая реализация основывается на них и утверждает, что также использует меньший диапазон кодирования.[63]

Команды для встраиваемых применений

Набор команд для самых маленьких встроенных процессоров (набор E) сокращается другими способами: поддерживаются только 16 из 32-разрядные целочисленные регистры. Инструкции с плавающей точкой не должны поддерживаться (спецификация запрещает это как неэкономичное), поэтому должна использоваться библиотека программного обеспечения с плавающей точкой.[1] Рекомендуется использовать сжатый набор C. Привилегированный набор команд поддерживает только машинный режим, пользовательский режим и схемы памяти, которые используют перемещение базовых и связанных адресов.[18]

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

Корреспонденты также предложили меньшие нестандартные 16-битные ISA RV16E: в нескольких серьезных предложениях использовались бы 16-битные инструкции C с 8 × 16-битными регистрами. [66] [67] В качестве первоапрельской шутки предложили очень практичную схему: использовать 16 × 16-битные целочисленные регистры со стандартными Eimc ISAs (включая 32-битные инструкции.) Шутка состояла в том, чтобы предложить регистры с переключением банков, когда 32-битный процессор будет явно лучше..[67]

Привелегированные набор команд

ISA RISC-V включает отдельную привилегированную спецификацию набора инструкций. По состоянию на август 2019 года, версия 1.11 ратифицирована фондом.[2][18]

Версия 1.11 спецификации поддерживает несколько типов компьютерных систем:

  • Системы, которые имеют только машинный режим, возможно, для встроенных систем,
  • Системы как с машинным режимом (для супервизора), так и с пользовательским режимом для реализации операционных систем, запускающих ядро в привилегированном режиме.
  • Системы с машинным режимом, гипервизорами, несколькими супервизорами и пользовательскими режимами под каждым супервизором.

Они примерно соответствуют системам реализации С- максимум с четырьмя кольцами привилегий и безопасности: машина, гипервизор, супервизор и пользователь. Каждый уровень также должен иметь тонкий слой стандартизированного поддерживающего программного обеспечения, которое взаимодействует с более привилегированным уровнем или аппаратным обеспечением.[18]

Общий план для этого ISA состоит в том, чтобы сделать режим гипервизора ортогональным режимам пользователя и супервизора.[68] Основная функция-это бит конфигурации, который либо разрешает коду уровня супервизора обращаться к регистрам гипервизора, либо вызывает прерывание при доступе. Этот бит позволяет режиму супервизора напрямую обрабатывать аппаратное обеспечение, необходимое гипервизору. Это упрощает гипервизор типа 2, размещенный в операционной системе. Это популярный режим для запуска warehouse-scale компьютеров. Для поддержки типа 1, неустановленных гипервизоров, бит может вызвать прерывание этих обращений к гипервизору. Бит упрощает вложенность гипервизоров, в которых гипервизор работает под гипервизором. Также говорится, что это упрощает код супервизора, позволяя ядру использовать свои собственные функции гипервизора с собственным кодом ядра. В результате форма гипервизора ISA поддерживает пять режимов: машина, супервизор, пользователь, супервизор под гипервизором и пользователь под гипервизором.

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

Существующие определения регистров управления и состояния поддерживают исключения ошибок и памяти RISC-V, а также небольшое количество прерываний. Для систем с большим количеством прерываний спецификация также определяет контроллер прерываний. Прерывания всегда начинаются на самом высоком привилегированном машинном уровне, и управляющие регистры каждого уровня имеют явные биты пересылки для маршрутизации прерываний в менее привилегированный код. Например, гипервизор не должен включать программное обеспечение, которое выполняется на каждом прерывании для пересылки прерывания в операционную систему. Вместо этого, при настройке, он может установить биты для переадресации прерывания.[18]

В спецификации поддерживается несколько систем памяти. Физический - только подходит для самых простых встроенных систем. Существует также три системы виртуальной памяти в стиле UNIX для кэширования памяти в системах массового хранения. Системы виртуальной памяти имеют три размера, с адресами размером 32, 39 и 48 бит. Все системы виртуальной памяти поддерживают 4 страницы KiB, многоуровневые деревья таблиц страниц и используют очень похожие алгоритмы для обхода деревьев таблиц страниц. Все они предназначены для аппаратного или программного обхода страниц. Чтобы дополнительно снизить стоимость переходов по таблицам страниц, сверхразмерные страницы могут быть конечными страницами на более высоких уровнях дерева таблиц страниц системы. SV32 имеет двухслойное дерево таблиц страниц и поддерживает 4 MiB суперстраницы. SV39 есть три таблицы на уровне страницы, и поддерживает 2 MiB суперстраницы  и 1 GiB гигастраницы. SV48 требуется для поддержки SV39. Он также имеет 4-уровневую таблицу страниц и поддерживает 2 MIB суперстраницы, 1 GiB гигастраницы и 512 GiB террастраницы. Суперстраницы выравниваются по границам страницы для следующего самого низкого размера страницы.[18]

Битовые операции

Была проделана существенная работа по созданию предварительного, хотя и не одобренного, набора инструкций ISA битовых манипуляций (B) для RISC-V. Исполнение набора инструкций хорошее, подмножество битовых манипуляций может помочь криптографическим, графическим и математическим операциям. Критерии для включения, задокументированные в проекте, заключались в соблюдении принципов RV5 и форматов ISA, существенном улучшении плотности или скорости кода (т. е., по крайней мере, сокращение инструкций 3 к 1) и существенных реальных приложениях, включая уже существующую поддержку компилятора. Версия 0.37 включала в себя [69] бесспорные инструкции для подсчета ведущих нулей, подсчета одного бита, выполнения и дополнения, сдвига, поворота, обобщенного битового реверса и перетасовки, байтовых свопов, битовых экстрактов и депозитов и некоторых битовых манипуляций для сжатого набора (not, neg и reverse). Он также включает в себя спорное предложение по извлечению и размещению битового поля, используя нестандартный 48-битный формат инструкций.

Компактный набор команд для SIMD

Для простых, экономичных систем RISC-V предлагается использовать биты регистров с плавающей точкой для выполнения параллельной одиночной инструкции, с множественными данными (SIMD). Это широко используется для ускорения мультимедиа и приложений цифровой обработки сигналов.[1] По состоянию на 2016 год этот ISA не определен, но может напоминать мультимедийные инструкции PA-RISC: Multimedia Acceleration eXtensions. Помимо родной 64-битной математики, процессор PA-RISC MAX2 может выполнять арифметику сразу по четырем 16-битным подсловам с несколькими методами переполнения. Он также может перемещать подслова в разные позиции. MAX2 PA-RISC был намеренно упрощен. Ему не хватало поддержки 8-битных или 32-битных подслов. 16-битный размер подслова был выбран для поддержки большинства задач цифровой обработки сигналов. Эти инструкции были недорогими для проектирования и производства. Тем не менее, они увеличили производительность процессора на задачах цифровой обработки сигналов более чем в 48 раз, что позволило на практике запускать видеокодеки в реальном масштабе времени в 1995 году.[70] [71]

Операции с векторами

Предлагаемый набор команд векторной обработки может сделать набор packed SIMD устаревшим. Проектировщики надеются получить достаточную гибкость, чтобы процессор мог реализовать векторные инструкции в регистрах стандартного процессора. Это позволит обеспечить минимальные реализации с аналогичной производительностью для мультимедийного ISA, как указано выше. Однако истинный векторный сопроцессор может выполнять тот же код с более высокой производительностью.[72]

По состоянию на 29 июня 2015 года предложение по векторной обработке представляет собой консервативную, гибкую конструкцию универсального векторного процессора смешанной точности, пригодного для выполнения вычислительных ядер. Код будет легко переноситься на процессоры с разной длиной вектора, в идеале без перекомпиляции.[72]

Напротив, короткие SIMD-расширения менее удобны. Они используются в x86, ARM и PA-RISC. В них изменение ширины слова вызывает изменение набора команд для расширения векторных регистров (в случае x86 - с 64-битных регистров MMX до 128-битных потоковых SIMD-расширений (SSE) на 256-битные расширенные Векторные расширения (AVX) и AVX-512). Результатом является растущий набор команд и необходимость переносить рабочий код в новые инструкции..

В векторном ISA RISC-V вместо фиксирования длины вектора в архитектуре доступна команда (setvl), которая принимает запрашиваемый размер и устанавливает длину вектора равной минимуму аппаратного предела и запрашиваемого размера. Таким образом, предложение RISC-V больше похоже на длинно-векторный дизайн Cray. То есть каждый вектор, содержащий до 32 векторов, имеет одинаковую длину.[72]

Приложение задает общую ширину вектора, которая ему требуется, а процессор определяет длину вектора, которую он может предоставить с помощью доступных внутрикристальных ресурсов. Реализация принимает форму инструкции (vsetcfg) с четырьмя непосредственными операндами, указывающими количество векторных регистров каждой необходимой ширины. Общая сумма должна быть не более адресуемого ограничения в 32, но может быть меньше, если приложение не требует их всех. Длина вектора ограничена доступным хранением на кристалле, деленным на количество байтов памяти, необходимых для каждой записи. (Могут также существовать дополнительные аппаратные ограничения, что, в свою очередь, может позволить реализации в стиле SIMD.)[72]

За пределами векторных циклов приложение может запрашивать регистры с нулевым вектором, что позволяет операционной системе сохранять их при переключении контекста.[72]

Длина вектора не только архитектурно изменчива, но и предназначена для изменения во время выполнения. Для достижения такой гибкости набор инструкций, вероятно, будет использовать пути данных переменной ширины и операции переменного типа с использованием полиморфной перегрузки.[72] план состоит в том, что они могут уменьшить размер и сложность ISA и компилятора.[72]

Последние экспериментальные векторные процессоры с трактами данных переменной ширины также показывают прибыльное увеличение операций в секунду (скорость), площадь (более низкая стоимость) и Ватт (более длительный срок службы батареи).[73]

В отличие от типичного современного графического процессора, не планируется предоставлять специальное оборудование для поддержки предикации ветвей. Вместо этого будет использоваться более дешевая предикация на основе компилятора.[72] [74]

Команды для отладки

Существует предварительная спецификация для аппаратного отладчика RISC-V. Отладчик будет использовать транспортную систему, такую как Joint Test Action Group (JTAG) или Universal Serial Bus (USB) для доступа к отладочным регистрам. Стандартный аппаратный интерфейс отладки может поддерживать либо стандартизированный абстрактный интерфейс, либо подачу команд.[75] [76]

По состоянию на январь 2017 года точная форма абстрактного интерфейса остается неопределенной, но предложения включают систему отображения памяти со стандартизированными адресами для регистров отладочных устройств или регистром команд и Регистром данных, доступным для системы связи.[75] корреспонденты утверждают, что подобные системы используются интерфейсом фонового режима отладки Freescale (BDM) для некоторых процессоров, ARM, OpenRISC и LEON Aeroflex.[75]

При подаче инструкций ЦП будет обрабатывать исключение отладки для выполнения отдельных инструкций, записанных в регистр. Это может быть дополнено регистром передачи данных и модулем для прямого доступа к памяти. Подача инструкций позволяет отладчику получать доступ к компьютеру точно так же, как и программное обеспечение. Это также сводит к минимуму изменения в процессоре и адаптируется ко многим типам процессоров. Говорят, что это особенно подходит для RISC-V, потому что он разработан специально для многих типов компьютеров. Регистр передачи данных позволяет отладчику записывать цикл перемещения данных в ОЗУ, а затем выполнять цикл для перемещения данных в или из компьютера со скоростью, близкой к максимальной скорости канала данных системы отладки. [76] Корреспонденты утверждают, что подобные системы используются MIPS Technologies MIPS, Intel Quark, Xensa от Tensilica и интерфейсом фонового режима отладки (BDM) процессоров Freescale Power ISA.[75]

Ссылки

1) Waterman, Andrew; Asanović, Krste. "The RISC-V Instruction Set Manual, Volume I: Base User-Level ISA version 2.2" University of California, Berkeley. EECS-2016-118. Retrieved 25 May 2017.

20) Celio, Christopher. "riscv-boom" . GitHub. Regents of the University of California. Retrieved 11 November 2016. 39) "SCR1, open-source RISC-V core" Retrieved 11 December 2018. 58) Lustig, Dan. Memory Consistency Model Status Update Youtube. RISC-V Foundation. Retrieved 4 January 2018.
2) RISC-V Privileged ISA Specification, June 8, 2019 21) Asanović, Krste; et al. "rocket-chip" GitHub. The RISC-V Foundation. Retrieved 11 November 2016. 40) "RISC-V workshop proceedings". Retrieved 11 December2018. 59) Waterman, Andrew (13 May 2011). Improving Energy Efficiency and Reducing Code Size with RISC-V Compressed U.C. Berkeley: Regents of the University of California. p. 32. Retrieved 25 August 2014.
3) Big and bi-endianness supported as extensions 22) Celio, Christopher. "riscv-sodor" GitHub. Regents of the University of California. Retrieved 11 November 2016. 41) "Andes Technology" RISC-V Foundation. Retrieved 10 July 2018. 60) Waterman, Andrew; et al. "The RISC-V Compressed Instruction Set Manual Version 1.9 (draft)"
(PDF). RISC-V. Retrieved 18 July 2016.

4) "Contributors" riscv.org. Regents of the University of California. Retrieved 25 August 2014.

23) Traber, Andreas; et al. "PULP: Parallel Ultra Low Power" ETH Zurich, University of Bologna. Retrieved 5 August 2016. 42) Manners, David. "Codasip and UltraSoC Combine on RISC-V" Electronics Weekly. Metropolis International Group, Ltd. Retrieved 23 November 2016. 61) Brussee, Rogier. "A Complete 16-bit RVC" Google Groups. RISC-V Foundation. Retrieved 18 July 2019.
5) Demerjian, Chuck (7 August 2013). "A long look at how ARM licenses chips: Part 1". SemiAccurate. 24) "Chisel: Constructing Hardware in a Scala Embedded Language" UC Berkeley. Regents of the University of California. Retrieved 12 February 2015. 43) "GreenWaves GAP8 is a Low Power RISC-V IoT Processor Optimized for Artificial Intelligence Applications" CNXSoft: Embedded Systems News. Retrieved 4 March 2018. 62) Brussee, Rogier. "Proposal: Xcondensed, [a] ... Compact ... 16 bit standalone G-ISA" RISC-V ISA Mail Server. Google Groups. Retrieved 10 November 2016.
6) Demerjian, Chuck (8 August 2013). "How ARM licenses its IP for production: Part 2". SemiAccurate. 25) "FreeBSD Wiki: RISC-V" 44) Yoshida, Junko (26 February 2018). "AI Comes to Sensing Devices" EE Times. Retrieved 10 July 2018. 63) Phung, Xan. "Improved Xcondensed" Google Groups. RISC-V Foundation. Retrieved 18 July 2019.
7) Asanović, Krste. "Instruction Sets Should be Free" (PDF). U.C. Berkeley Technical Reports. Regents of the University of California. Retrieved 15 November 2016. 26) "FreeBSD Foundation: Initial FreeBSD RISC-V Architecture Port Committed" 45) "GreenWaves Technologies Announces Availability of GAP8 Software Development Kit and GAPuino Development Board" (Press release). 22 May 2018. 64) Ionescu, Liviu. "The RISC-V Microcontroller Profile" Github. Retrieved 5 April 2018.
8) "Rocket Core Generator".RISC-V. Regents of the University of California. Retrieved 1 October 2014. 27) Montezelo, Manuel. "Debian GNU/Linux port for RISC-V 64" Google Groups. Retrieved 19 July 2018. 46) "Hex Five Security Adds MultiZone Trusted Execution Environment to the SiFive Software Ecosystem" Hex Five Security. Retrieved 13 September 2018. 65) Brussee, Rogier. "A Complete 16-bit RVC" Google Groups. RISC-V FOundation. Retrieved 18 July 2019.
9) Celio, Christopher; Love, Eric. "ucb-bar/riscv-sodor"
. GitHub Inc. Regents of the University of California. Retrieved 12 February 2015.
28) "Architectures/RISC-V" Fedora Wiki. Red Hat. Retrieved 26 September 2016. 47) "CloudBEAR" Retrieved 16 October 2018. 66) Brussee, Rogier. "Proposal: Xcondensed, [a] ... Compact ... 16 bit standalone G-ISA" RISC-V ISA Mail Server. Google Groups. Retrieved 10 November 2016.
10) "SHAKTI Processor Project". Indian Institute of Technology Madras. Retrieved 15 September 2014. 29) Begari, Padmarao. "U-Boot port on RISC-V 32-bit is available" Google Groups. Microsemi. Retrieved 15 February 2017 48) Shilov, Anton. "Western Digital Reveals SweRV RISC-V Core, Cache Coherency over Ethernet Initiative" www.anandtech.com. Retrieved 23 May 2019. 67) Barros, Cesar. "Proposal: RV16E" Google Groups, RISC-V ISA Dev. Retrieved 2 April 2018.
11) Celio, Christopher. "CS 152 Laboratory Exercise 3"(PDF). UC Berkeley. Regents of the University of California. Retrieved 12 February 2015. 30) RiscVEdk2 on GitHub 49) "China's Alibaba is making a 16-core, 2.5 GHz RISC-V processor" www.techspot.com. Retrieved 30 July 2019. 68) Bonzini, Paolo; Waterman, Andrew. "Proposal for Virtualization without H mode" Google Groups, RISC-V ISA Dev. RISC-V Foundation. Retrieved 24 February 2017.

12) Patterson, David A.; Ditzel, David R. (October 1980). "The Case for the Reduced Instruction Set Computer". ACM SIGARCH Computer Architecture News. 8 (6): doi:10.1145/6419

14.641917

31) Almatary, Hesham. "RISC-V, seL4" seL4 Documentation. Commonwealth Scientific and Industrial Research Organisation (CSIRO). Retrieved 13 July 2018. 50) "C-DAC announces Tech Conclave 2019 - Times of India" The Times of India. Retrieved 12 April 2019. 69) Wolf, Clifford (22 March 2019). "Bit Manipulation for RISC-V, Draft v0.37" (PDF). Github. Clifford Wolf.
13) "Amber ARM-compatible core" OpenCores. Retrieved 26 August 2014. 32) Almatary, Hesham. "heshamelmatary" GitHub. Retrieved 13 July 2018. 51) "IIT Madras Open Source Processor Project" Rapid IO. IIT Madras. Retrieved 13 September 2014. 70) Lee, Ruby; Huck, Jerry (25 February 1996). "64-bit and Multimedia Extensions in the PA-RISC 2.0 Architecture" Proceedings of Compcon 96: 152–160. Retrieved 21 September2014.
14) "ARM4U".OpenCores. OpenCores. Retrieved 26 August2014. 33) "ANGEL is a Javascript RISC-V ISA (RV64) Simulator that runs riscv-linux with BusyBox". RISCV.org. 52) Xie, Joe (July 2016). NVIDIA RISC V Evaluation Story 4th RISC-V Workshop. Youtube. 71) Lee, Ruby B. (April 1995). "Accelerating Multimedia with Enhanced Microprocessors" (PDF). IEEE Micro. 15 (2): 22–32. CiteSeerX 10.1.1.74.1688
15) "RISC-V Foundation" RISC-V Foundation. Retrieved 15 March 2019. 34) "MultiZone Secure IoT Stack, the First Secure IoT Stack for RISC-V" Hex Five Security. Hex Five Security, Inc. Retrieved 3 March 2019. 53) Ashenden, Peter (9 November 2016). "Re: [isa-dev] RISC V ISA for embedded systems" RISC-V ISA Dev (Mailing list). Google. Retrieved 10 November 2016. At ASTC (www.astc-design.com), we have an implementation of RV32EC as a synthesizable IP core intended for small embedded applications, such as smart sensors and IoT. 72) Schmidt, Colin; Ou, Albert; Lee, Yunsup; Asanović, Krste. "RISC-V Vector Extension Proposal" (PDF). RISC-V. Regents of the University of California. Retrieved 14 March2016.
16) "The Linley Group Announces Winners of Annual Analysts' Choice Awards" (Press release). The Linley Group. 12 January 2017. Retrieved 21 January 2018 35) "HiFive1" SiFive. Retrieved 10 July 2018. 54) "lowRISC website" Retrieved 10 May 2015. 73) Ou, Albert; Nguyen, Quan; Lee, Yunsup; Asanović, Krste. "A Case for MVPs: Mixed-Precision Vector Processors" (PDF). UC Berkeley EECS. Regents of the University of California. Retrieved 14 March 2016.
17) Wolf, Clifford. "Alternative proposal for instruction length encoding" Cliffords Subversion Servier. Clifford Wolf. Retrieved 24 April 2019. 36) SiFive. "Hi-Five1: Open-source Arduino-Compatible Development Kit" Crowd Supply. Retrieved 2 December2016. 55) "PULPino GitHub project" GitHub. Retrieved 2 February2018. 74) Lee, Yunsup; Grover, Vinod; Krashinsky, Ronny; Stephenson, Mark; Keckler, Stephen W.; Asanović, Krste. "Exploring the Design Space of SPMD Divergence Management on Data-Parallel Architectures" (PDF). Berkeley's EECS Site. Regents of the University of California. Retrieved 14 March 2016.
18) Waterman, Andrew; Lee, Yunsup; Avizienas, Rimas; Patterson, David; Asanović, Krste. "Draft Privileged ISA Specification 1.9" RISC-V. RISC-V Foundation. Retrieved 30 August 2016. 37) "FU540 SoC CPU" SiFive. Retrieved 24 October 2018. 56) "PULP Platform" PULP Platform. Retrieved 2 February2018. 75) Bradbury, Alex; Wallentowitz, Stefan. "RISC-V Run Control Debug" Google Docs. RISC-V Foundation. Retrieved 20 January 2017.
19) "RISC-V The Free and Open Instruction Set" RISC-V Foundation. Retrieved 11 November 2016. 38) "Syntacore" Retrieved 11 December 2018. 57) "Esperanto exits stealth mode, aims at AI with a 4,096 core 7nm RISC-V monster" wikichip.org. Retrieved 2 January 2018. 76) Newsome, Tim. "RISC-V Debug Group > poll results" Google Groups, RISC-V Debug Group. RISC-V Foundation. Retrieved 20 January 2017.

Продолжение следует: часть 2.