Процессоры RISC-V
Краткое описание инструкций RISC-V
Ниже приводится в таблице 4.1 краткое описание различных типов команд и их определения в спецификациях RISC-V. Это форматы 32-битовых инструкций RISC-V:
Тип | 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 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Регистр/регистр (R) | funct7 | rs2 | rs1 | funct3 | rd | код операции | ||||||||||||||||||||||||||
С операндом (I) | imm[11:0] | rs1 | funct3 | rd | код операции | |||||||||||||||||||||||||||
С длинным операндом (U) | imm[31:12] | rd | код операции | |||||||||||||||||||||||||||||
Сохранение (S) | imm[11:5] | rs2 | rs1 | funct3 | imm[4:0] | код операции | ||||||||||||||||||||||||||
Ветвление (B) | [12] imm[10:5] | rs2 | rs1 | funct3 | imm[4:1] [11] | код операции | ||||||||||||||||||||||||||
Переход (J) | [20] imm[10:1] | [11] | imm[19:12] | rd | код операции |
- код операции (7 бит): частично определяет один из 6 типов форматов инструкций. Чтобы узнать больше, см. следующую статью Википедии.
- funct7 и funct3 (10 бит): в комбинации дополнительно указывают выполняемую операцию.
- rs1 (5 бит): определяет по индексу регистр-источник, содержащий первый операнд.
- rs2 (5 бит): указывает регистр источника, содержащий второй операнд.
- rd (5 бит): указывает регистр назначения, в который будет направлен результат вычислений.
RISC-V ISA определяет необходимый набор регистров, которые должны быть реализованы в процессоре, так что программное обеспечение во всех реализациях видит один и тот же набор регистров процессора.
Ниже приведен список регистров. Из этой таблицы 4.2 можно понять, какие регистры необходимы в процессоре RISC-V. Как разработчик, вы должны уметь эффективно использовать эти регистры для создания приложений.
Имя регистра в RISC-V | Псевдоним | Описание | Кто сохраняет |
---|---|---|---|
32 целочисленных регистра | |||
x0 | Zero | всегда ноль | |
x1 | Ra | Адрес возврата | Вызывающий |
x2 | Sp | Указатель стека | Вызываемый |
x3 | Gp | Глобальный указатель | |
x4 | Tp | Потоковый указатель | |
x5 | t0 | Temporary/альтернативный адрес возврата | Вызывающий |
x6-7 | t1-2 | Temporary | Вызывающий |
x8 | s0/fp | Saved register / frame pointer | Вызываемый |
x9 | s1 | Saved register | Вызываемый |
x10-11 | a0-1 | Аргумент / возвращаемое значение | Вызывающий |
x12-17 | a2-7 | Аргумент | Вызывающий |
x18-27 | s2-11 | Saved register | Вызываемый |
x28-31 | t3-6 | Temporary | Вызывающий |
32 дополнительных регистра с плавающей запятой | |||
f0-7 | ft0-7 | Floating-point temporaries | Вызывающий |
f8-9 | fs0-1 | Floating-point saved registers | Вызываемый |
f10-11 | fa0-1 | Floating-point arguments / Return values | Вызывающий |
f12-17 | fa2-7 | Floating-point arguments | Вызывающий |
f18-27 | fs2-11 | Floating-point saved registers | Вызываемый |
f28-31 | ft8-11 | Floating-point temporaries | Вызывающий |
Для реализаций процессоров, не поддерживающих расширения с плавающей запятой, не нужно определять регистры с плавающей запятой.
Память
Харт RISC-V имеет единое адресное пространство размером байт для всех обращений к памяти, где XLEN - ширина инструкции (например, для RV32 XLEN равен 32).
Слово памяти определяется как 32 бита (4 байта). Соответственно, полуслово - 16 бит (2 байта), двойное слово - 64 бита (8 байт), а четверное слово - 128 бит (16 байт). Адресное пространство памяти является кольцевым; следовательно, байт по адресу является соседним с байтом по адресу ноль. Соответственно, вычисления адресов памяти, выполняемые аппаратным обеспечением, игнорируют переполнение и вместо этого преобразуются в значения по модулю
.
Среда выполнения определяет отображение аппаратных ресурсов в адресное пространство hart-а. Различные диапазоны адресов адресного пространства hart-а могут:
- быть свободными;
- содержать основную память;
- содержать одно или несколько устройств ввода-вывода.
Чтение и запись в устройства ввода-вывода могут иметь видимые побочные эффекты, но доступ к основной памяти - нет. Хотя среда выполнения может называть устройством ввода-вывода все, что находится в адресном пространстве hart-а, обычно ожидается, что некоторая часть будет указана как основная память.
Когда процессор имеет более одного hart-а:
- адресное пространство может быть уникальным для каждого из hart-ов;
- оно может быть одинаковым для обоих hart-ов;
- некоторые части могут быть общими, а другие - уникальными для каждого из них.
Выполнение каждой машинной инструкции в RISC-V приводит к одному или нескольким явным или неявным обращениям к памяти. Для каждой выполненной инструкции существует по крайней мере один неявный доступ к памяти - это операция fetch выборки инструкции, которая инструктирует процессор о том, что должно быть выполнено. Ряд инструкций RISC-V не требует дополнительных неявных обращений к памяти, кроме fetch-а, поскольку вся информация, необходимая процессору для выполнения операции, закодирована в fetch-е. Существуют также специальные инструкции load и store, которые выполняют явный доступ к памяти, обращаясь к требуемому местоположению как часть инструкции. Механизм выполнения может предписывать дополнительные неявные обращения к памяти, например, для выполнения трансляции адреса, но это не определено в спецификации RISC-V и зависит от конкретной реализации.
Среда выполнения определяет, какая часть памяти доступна для того или иного типа доступа к памяти. На основании этого определения некоторые части памяти не могут быть доступны для определенной операции, и любая попытка доступа к этим местам приведет к тому, что процессор выдаст исключение для этой инструкции. Свободные места в адресном пространстве никогда не доступны.
Если не указано иное, неявные чтения, которые не вызывают исключений и не имеют побочных эффектов, могут происходить произвольно, рано и спекулятивно, даже до того, как машина сможет доказать, что чтение будет необходимо. Например, допустимая реализация может попытаться прочитать всю основную память при первой же возможности, кэшировать как можно больше доступных для выборки (исполняемых) байтов для последующих выборок инструкций и никогда больше не читать основную память для выборок инструкций. Чтобы гарантировать, что определенные неявные чтения упорядочены только после записи в те же области памяти, программное обеспечение должно выполнять определенные инструкции ограничения или управления кэшем, определенные для этой цели, такие как инструкция FENCE.I.
RISC-V определяет модель упорядочивания памяти, которая является слабой моделью упорядочивания памяти. Модель согласованности памяти по умолчанию для RISC-V - это RISC-V Weak Memory Ordering (RVWMO). Эта модель определена как часть спецификаций. Альтернативная сильная модель также определена в спецификациях, и реализация может выбрать поддержку этой модели упорядочивания вместо слабой модели памяти.
Кодирование длины инструкции
Длина базовой инструкции RISC-V составляет 32 бита. Однако схема кодирования стандартной длины предназначена для поддержки кодирования инструкции переменной длины. Расширенные инструкции могут содержать любое количество 16-битовых посылок, выровненных по 16-битовой границе.
Стандартный сжатый ISA обеспечивает сжатую форму инструкций шириной 16 бит, что может привести к уменьшению размера кода. Это также ослабляет ограничения на выравнивание инструкций и позволяет выравнивать все инструкции по 16-битовой границе (как для 16-битовых, так и для 32-битовых инструкций), что приводит к улучшению плотности кода.
Более подробную информацию о кодировании ISA с переменной длиной можно найти в базовых спецификациях RISC-V
Поддержка инструкций Endian
Базовые ISA RISC-V имеют либо little-endian, либо big-endian системы памяти, а привилегированная архитектура дополнительно определяет bi-endian операции. Инструкции хранятся в памяти в виде последовательности 16-битовых посылок в little-endian, независимо от "эндианальности" системы памяти. Посылки, образующие одну инструкцию, хранятся по возрастающим адресам в полслова, причем самая младшая посылка содержит младшие биты в спецификации инструкции (как сказано в спецификации RISC-V).
Исключения, прерывания и ловушки
В этом разделе мы обсудим, как RISC-V обрабатывает исключения и прерывания.
Исключения - это необычные условия, связанные с инструкцией в текущем RISC-V hart-е, которые могут возникнуть во время выполнения. Прерывания - это внешние асинхронные события, которые могут привести к неожиданной передаче управления RISC-V hart. Ловушки означают передачу управления обработчику ловушек, вызванную либо исключением, либо прерыванием.
То, как ловушки обрабатываются и становятся видимыми для программ, работающих на hart'е, зависит от окружающей среды выполнения. С точки зрения программ, работающих в этой среде выполнения, ловушки, с которыми сталкивается hart во время выполнения, могут иметь четыре различных эффекта:
-
Содержащаяся ловушка
Этот тип ловушек виден и обрабатывается программным обеспечением, работающим в EEI. Например, в случае, когда и пользовательский режим, и режим супервизора на hart-ах обрабатываются EEI, ECALL hart-а, работающего в пользовательском режиме, приведет к передаче управления обработчику режима супервизора, работающему на том же hart'е.
-
Запрошенная ловушка
Когда синхронное исключение возникает в результате явного вызова среды выполнения, требующего действия от программного обеспечения в среде выполнения, это называется запрошенной ловушкой. Примером может служить системный вызов. В этом случае выполнение может возобновиться или не возобновиться после того, как программное обеспечение в среде выполнения выполнит запрошенное действие.
-
Невидимая ловушка
Этот тип ловушки обрабатывается средой выполнения прозрачным образом, и выполнение программы возобновляется в обычном режиме после обработки ловушки. Примеры включают эмуляцию отсутствующих инструкций, обработку ошибок нерезидентных страниц в системе виртуальной памяти, работающей по требованию, и обработку прерываний устройства для другого задания в многопрограммной машине.
-
Фатальная ловушка
Фатальные ловушки представляют собой фатальный сбой в системе и вызывают завершение выполнения программы. В качестве примера можно привести сбой проверки защиты страниц виртуальной памяти или истечение срока действия сторожевого таймера. Каждый EEI должен определить, как завершается выполнение и как об этом сообщается во внешнюю среду.
Способ обработки каждой ловушки определяется EEI; рекомендация заключается в точной обработке ловушек, но EEI может решить обрабатывать их иначе. Некоторые ловушки, такие как содержащиеся и запрашиваемые ловушки, наблюдаются программным обеспечением EEI как неточные. Невидимые ловушки по определению не могут быть замечены, независимо от того, являются ли они точными или неточными. Ловушки редко упоминаются в первом томе спецификации RISC-V, поскольку в этом документе подробно описаны непривилегированные инструкции.
Архитектурные средства обработки содержащихся ловушек описаны в руководстве по привилегированной архитектуре, наряду с другими возможностями. Непривилегированные инструкции, которые определены исключительно для того, чтобы вызывать запрошенные ловушки, также документированы там. Невидимые ловушки по своей природе выходят за рамки данного курса.
Кодировки инструкций, не определенные в спецификациях RISC-V ISA и не определенные каким-либо другим способом, могут привести к фатальной ловушке.