Files
APS/Lectures/06. RISC-V architecture.md
A-re-s 3feb6a8df0 fix lectures typos (#138)
* Update 06. RISC-V architecture.md

* Update 02. Instruments.md

* Update 03. Digital arithmetics.md

* Update 04. Operations units.md

* Update 05. Sequencial logic.md

* Update 07. RISC-V programming.md

* Update 08. Singlecycle processor.md

* Update 09. Multicycle processor.md

* Update 10. Pipeline processor.md

* Update 11. Pipeline hazards.md

* Update Lectures/02. Instruments.md

* Update Lectures/04. Operations units.md

---------

Co-authored-by: Andrei Solodovnikov <VoultBoy@yandex.ru>
2025-06-22 22:59:23 +03:00

99 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Лекция 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)