Опубликован: 19.04.2025 | Доступ: свободный | Студентов: 1 / 0 | Длительность: 07:05:00
Лекция 4:

Разработка простейшего декодера команд RISC-V

< Лекция 3 || Лекция 4: 1234 || Лекция 5 >

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

Это отражено в спецификации архитектуры в виде ряда понятий:

  • Hart (Аппаратный поток) - архитектура RISC-V поддерживает многопоточность, поэтому может быть несколько аппаратных потоков исполнения кода. Под потоком (hart) подразумевается аппаратный поток - выполнение которого (или точнее "хранение архитектурного состояния") обеспечивается дублирующими регистрами (теневыми регистрами). Естественно полагать, что микропроцессор должен иметь как минимум один поток (hart) с ID равным 0.

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

  • Trap(Ловушка) - ловушка это совокупное объедение смысла таких слов, как прерывание и исключение. Ловушки бывают нескольких типов:

    • Ловушка исключения (exception) - это понятие означает синхронное событие, которое прерывает исполнения кода (наверное, самое банальное - попытка деления на ноль). Исключение может прерываться другим исключением, или NMI.
    • Ловушка прерывания (interrupt) - внешнее асинхронное событие, которое может привести к тому, что поток неожиданно может передать управление. Прерывание может прерываться другим прерыванием, NMI, или исключением.
    • Ловушка немаскируемого прерывания(NMI) - немаскируемое прерывание. NMI не может прерываться другим NMI, но может перейти из обработчика NMI в режим обработки исключения, если в момент обработки NMI произойдет исключение.
  • Machine (машинный) - В ядре все машинное - регистры, таймер, режим. Поэтому всё, что связано со словом machine (машинный) должно поддерживается на уровне ядра. К примеру большинство микроконтроллеров имеет один уровень привилегий- машинный.

Уровни привилегий

Поддержка многопоточности или операционных систем практически всегда порождает понятия уровня привилегий текущего исполняемого кода. В RISC-V архитектуре существует 3 уровня привилегий:

В архитектуре RISC-V существует три уровня привилегий:

  • Машинный.
  • Пользовательский.
  • Уровень супервизора.

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

Существует две спецификации набора инструкций [1-3]:

  • Непривилегированный набор инструкций;
  • Привилегированный набор инструкций.

Непривилегированный набор инструкций

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

Привилегированный набор инструкций

Основное её назначение - это разделение уровня приложений и уровня ядра, а также поддержка операционных систем вплоть до нескольких разных операционных систем типа Linux, работающих через виртуальную машину [3].

Спецификация на привилегированный набор описывает возможную архитектуру привилегированных режимов, в том числе специальные инструкции и дополнительную функциональность для каждого из них [4-6].

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

Разработка простейшего декодера команд RISC-V

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

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

При этом мы имеем регистровые операции, операции с числами (непосредственные значения), работа с памятью, переходы.

При построении декодера команд приятно видеть, что есть жёстко фиксированной поле опкодов, определяющее, по факту, тип команды (да даже и текущий набор команд). Логика расположения дальнейших полей возможно и обоснована [7], но....откровенно говоря, "не блещет красотой"(особенно, что касается непосредственного операнда - imm) - рис.4.1.

Формат 32-битных инструкций RISC-V

Рис. 4.1. Формат 32-битных инструкций RISC-V

Постановка задачи

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

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

Отдельная "головная боль" - переходы, тут попадаем в двоякую ситуацию - с одной стороны понятно стремление разработчиков архитектуры к позиционно-независимому коду (все переходы относительно программного счётчика), с другой - а адресам этих переходы придётся считать, учитывая и значения регистров, и программного счетчика, и смещение заданное числовым значением....

Пробуем провести декомпозицию

Исходя из описания системы команд (или ISA) можно выделить следующие ключевые блоки процессорного ядра архитектуры RISC-V:

  • регистровый файл (31 активный регистр, два выходных порта, один порт на запись);
  • программный счётчик (PC);
  • память программ;
  • память данных (ОЗУ);
  • блок регистров специального назначения (CSR);
  • арифметико-логическое устройство;
  • блок дешифратора команд.

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

Реализация АЛУ, как дешифратора команд также будет зависеть от микроархитектуры, и отчасти, от тех множеств команд, которые планируется поддерживать. Обычно в минимальных ядра поддерживаются наборы I, E, C., в более "серьёзных" ядрах, ещё и М.

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

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

В базовой ISA существует четыре основных формата команд (R/I/S/U), как показано на рисунке 4.2. Все они имеют фиксированную длину в 32 бита и должна быть выровнена по четырехбайтовой границе в памяти.

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

Типы команд базового набора инструкций RISC-V

Рис. 4.2. Типы команд базового набора инструкций RISC-V

При разборе опкодов команд по типам и по расширениям очень помогает битовая карта опкодов - рис.4.3.

"Созвездие" опкодов инструкций

Рис. 4.3. "Созвездие" опкодов инструкций

Каждое непосредственное подполе помечается позицией бита (imm[x]) в создаваемом непосредственном значении, а не позицией бита в непосредственном поле инструкции, как это обычно делается.

RISC-V ISA (рис.3) сохраняет исходный (rs1 и rs2) и целевой (rd) регистры в одном и том же положении во всех форматах для упрощения декодирования (почти единственный видимый плюс кодирования команд, да простят автора истовые поклонники RV). За исключением 5-разрядных немедленных значений, используемых в инструкциях CSR, непосредственные значения всегда расширяются по знаку и, как правило, упаковываются в крайние левые доступные биты в инструкции и были выделены для уменьшения аппаратной сложности. В частности, знаковый бит для всех непосредственных действий всегда находится в бите 31 инструкции для ускорения схемы расширения знака.

Существуют еще два варианта форматов команд (B/J). Единственное различие между форматами S и B заключается в том, что 12-разрядное поле immediate используется для кодирования наборов ответвлений o, кратных 2 в формате B. Вместо того, чтобы сдвигать все биты в закодированном инструкцией непосредственном левом на единицу в аппаратном обеспечении, как это обычно делается, средние биты (imm[10:1]) и знаковый бит остаются в фиксированных положениях, в то время как младший бит в формате S (inst[7]) кодирует бит старшего разряда в инструкциях формата B.

Аналогично, единственное различие между форматами U и J заключается в том, что 20-битный immediate сдвигается влево на 12 бит для формирования U immediate и на 1 бит для формирования J immediate. Расположение командных битов в форматах U и J immediate выбрано таким образом, чтобы максимально перекрывать другие форматы и друг друга.

< Лекция 3 || Лекция 4: 1234 || Лекция 5 >