# Лекция 6. Архитектура RISC-V

***Система команд*** процессора — это все команды, выполнение которых аппаратно поддерживается процессором. ***Архитектура системы команд*** (Instruction Set Architecture, ISA) включает в себя систему команд и средства для их выполнения, такие как форматы данных, системы регистров, способы адресации, модели памяти. Лекция была посвящена обзору ISA RISC-V и её особенностей.

RISC (Reduced Instruction Set Computer) — архитектура с сокращённым набором команд. В таких архитектурах поддерживается относительно небольшой набор простых инструкций (обычно до 100), притом все они имеют одинаковый размер. RISC также является load/store архитектурой, это значит, что для того, чтобы выполнить какую-либо операцию над данными, их необходимо предварительно разместить в регистровом файле. Все операции происходят только с данными в регистровом файле, а для доступа к основной памяти используются специальные инструкции типа load и store.

RISC-V является RISC-архитектурой (мы рассматриваем исключительно её 32-битный вариант). Регистровый файл включает 32 регистра общего назначения, кроме регистра по адресу 0, там находится константное значение 0 (записать в него ничего не получится). Все регистры 32-битные. АЛУ выполняет операции только над данными размещёнными в регистровом файле. Основная память имеет побайтовую адресацию, при этом считывать из памяти можно байты, полуслова (16 бит) и слова (32 бита).

![../.pic/Lectures/06.%20RISC-V%20architecture/fig_01.png](../.pic/Lectures/06.%20RISC-V%20architecture/fig_01.png)

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

![../.pic/Lectures/06.%20RISC-V%20architecture/fig_02.png](../.pic/Lectures/06.%20RISC-V%20architecture/fig_02.png)

Каждая инструкция кодируется 32 битами. Чтобы не использовать инструкции представленные в машинном коде (нулями и единицами), их записывают с помощью инструкций языка ассемблера. Язык ассемблера представляет собой машинные коды, записанные в виде понятной человеку мнемоники. Например, машинная инструкция 00000000001100010111000010000011 для RISC-V записывается на языке ассемблера как and x1, x2, x3 — это понятней и наглядней, чем машинная инструкция. Разные архитектуры процессоров имеют разные ассемблеры.

Типичная команда ассемблера начинается с короткого слова, указывающего **что** нужно сделать, далее указывается **с какими данными** это надо сделать. Названия регистров состоят из буквы x и номера регистра, например, x10 — это десятый регистр регистрового файла.

Базовый набор целочисленных инструкций архитектуры RISC-V включает в себя:

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

  ```assembly
  add x4, x3, x2  # сложение x4 = x3 + x2
  or x8, x5, x1   # логическое ИЛИ x8 = x5 | x1
  sll x5, x4, x3  # логический сдвиг влево x5 = x4 << x3
      # и тому подобное
  ```

- 9 вычислительных инструкций, использующих в качестве одного из операндов регистр из регистрового файла, а второго — константу из инструкции

  ```assembly
  addi x4, x3, -5   # сложение x4 = x3 + (-5)
  srli x5, x4, 2    # логический сдвиг вправо x5 = x4 >> 2
      # и тому подобное
  ```

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

  ```assembly
  lw x4, 8(x7)  # загрузить слово (32 бита) из памяти
                # по адресу x7 + 8 в регистр x4
  lbu x3, 0(x2) # загрузить беззнаково байт (8 бит) из памяти
                # по адресу x2 + 0 в регистр x3
  sw x2, 16(x5) # переместить данные из регистра x2 в память по адресу x5 + 16
  ```

- 6 инструкций условного перехода, сравнивающих значение из двух регистров

  ```assembly
  beq x14, x15, label # если x14 == x15, то PC = PC + label
  blt x20, x21, label # если x20 < x21, то PC = PC + label
                      # label - это метка, представляющая собой обычное число
  ```

- 2 инструкции безусловного перехода с сохранением адреса возврата

  ```assembly
  jal x3, label # x3 = PC + 4; PC = PC + label
  ```

  И ещё несколько специфических инструкций. Полный список базовых целочисленных инструкций форматы их кодирования приводятся ниже.

![../.pic/Labs/lab_05_decoder/rv32i_summary.png](../.pic/Labs/lab_05_decoder/rv32i_summary.png)

![../.pic/Lectures/06.%20RISC-V%20architecture/fig_04.png](../.pic/Lectures/06.%20RISC-V%20architecture/fig_04.png)

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

```assembly
mv x2, x1 # переместить данные из регистра x1 в x2
```

на самом деле является инструкцией

```assembly
addi x2, x1, 0
```

## Основные материалы лекции

1. [Ссылка](https://www.youtube.com/watch?v=wMhUfqiBj5M) на видеозапись лекции
2. Все материалы лекции можно найти в этом источнике, к сожалению аналога на русском пока не нашел [***Patterson Hennessy***. *Computer organization and design. RISC-V edition* — 2 глава]

## Дополнительные материалы к лекции для саморазвития

1. Понятный разбор очень похожей архитектуры MIPS [***Харрис и Харрис***. *Цифровая схемотехника и архитектура компьютера* — параграфы 6.1, 6.2]
2. Еще один годный разбор другой популярной RISC архитекрутры — ARM [***Харрис и Харрис***. *Цифровая схемотехника и архитектура компьютера. Дополнение по архитектуре ARM* — параграфы 1.1, 1.2]
3. Обзор популярной тройки: x86, ARM, AVR [***Таненбаум и Остин***. *Архитектура компьютера* — Глава 5]

## Популярные материалы

1. На [этом](https://www.kvakil.me/venus/) сайте можно сразу писать код на языке ассемблера RISC-V, запускать, отлаживать, а потом еще и машинный код сохранить себе
2. [Расширение](https://marketplace.visualstudio.com/items?itemName=hm.riscv-venus) для VSCode ассемблера и дебаггера RISC-V
3. Немного [мёда](https://www.terraelectronica.ru/news/6423) про RISC-V
4. Отличнейшая популярная книга о цифровой схемотехнике и архитектуре компьютера, рекомендую заглянуть в нее при любом уровне понимания материала. Объем не большой, страницы маленькие, буквы большие, за пару полных вечеров вполне читается, многое проясняет и ставит на место [***Чарльз Петцольд***. *Код. Тайный язык информатики*]

![../.pic/Lectures/06.%20RISC-V%20architecture/fig_05.jpg](../.pic/Lectures/06.%20RISC-V%20architecture/fig_05.jpg)
