Compare commits

..

8 Commits

Author SHA1 Message Date
Andrei Solodovnikov
8497d91ffb ЛР10. Уточнение формулировки
Removed redundant phrase in the explanation of interrupts and exceptions.
2025-11-14 13:58:09 +03:00
Andrei Solodovnikov
736a4d283b Update README.md 2025-11-14 10:28:22 +03:00
Andrei Solodovnikov
9bd2e6665c Update SUMMARY.md 2025-11-14 10:08:40 +03:00
Andrei Solodovnikov
c1b37042a7 ЛР3. Уточнение формулировки в порядке выполнения задания 2025-11-14 10:07:23 +03:00
Andrei Solodovnikov
9516b4714e ЛР5. Добавление пропущенного предлога 2025-11-14 10:04:22 +03:00
Andrei Solodovnikov
b765e14cb2 Update SUMMARY.md 2025-11-14 09:28:29 +03:00
Andrei Solodovnikov
a51d46faae Унификация имени процессора CYBERcobra 2025-11-11 13:43:36 +03:00
Andrei Solodovnikov
11720db8e8 ЛР№5. Добавление пропущенного предлога 2025-11-11 13:14:56 +03:00
9 changed files with 18 additions and 17 deletions

2
.github/SUMMARY.md vendored
View File

@@ -21,6 +21,7 @@
- [Лабораторная №2. АЛУ](Labs/02.%20Arithmetic-logic%20unit/README.md) - [Лабораторная №2. АЛУ](Labs/02.%20Arithmetic-logic%20unit/README.md)
- [Лабораторная №3. Регистровый файл и внешняя память](Labs/03.%20Register%20file%20and%20memory/README.md) - [Лабораторная №3. Регистровый файл и внешняя память](Labs/03.%20Register%20file%20and%20memory/README.md)
- [Лабораторная №4. Простейшее программируемое устройство](Labs/04.%20Primitive%20programmable%20device/README.md) - [Лабораторная №4. Простейшее программируемое устройство](Labs/04.%20Primitive%20programmable%20device/README.md)
- [Написание программы под процессор CYBERcobra](Labs/04.%20Primitive%20programmable%20device/Индивидуальное%20задание/README.md)
- [Лабораторная №5. Декодер инструкций](Labs/05.%20Main%20decoder/README.md) - [Лабораторная №5. Декодер инструкций](Labs/05.%20Main%20decoder/README.md)
- [Лабораторная №6. Основная память](Labs/06.%20Main%20memory/README.md) - [Лабораторная №6. Основная память](Labs/06.%20Main%20memory/README.md)
- [Лабораторная №7. Тракт данных](Labs/07.%20Datapath/README.md) - [Лабораторная №7. Тракт данных](Labs/07.%20Datapath/README.md)
@@ -63,4 +64,5 @@
# Дополнительные материалы # Дополнительные материалы
- [RV32I - Стандартный набор целочисленных инструкций RISC-V](Other/rv32i.md) - [RV32I - Стандартный набор целочисленных инструкций RISC-V](Other/rv32i.md)
- [О регистрах контроля и статуса](Other/CSR.md)
- [Список типичных ошибок при работе с Vivado и SystemVerilog](Other/FAQ.md) - [Список типичных ошибок при работе с Vivado и SystemVerilog](Other/FAQ.md)

View File

@@ -345,7 +345,7 @@ module register_file(
3. Не забывайте, что у вас 2 порта на чтение и 1 порт на запись, при этом каждый порт не зависит от остальных (в модуле 3 независимых входа адреса). 3. Не забывайте, что у вас 2 порта на чтение и 1 порт на запись, при этом каждый порт не зависит от остальных (в модуле 3 независимых входа адреса).
4. Чтение из нулевого регистра (чтение по адресу 0) всегда должно возвращать нулевое значение. Этого можно добиться двумя путями: 4. Чтение из нулевого регистра (чтение по адресу 0) всегда должно возвращать нулевое значение. Этого можно добиться двумя путями:
1. Путем добавления мультиплексора перед выходным сигналом чтения (мультиплексор будет определять, пойдут ли на выход данные из ячейки регистрового файла, либо, в случае если адрес равен нулю, на выход пойдет константа ноль). 1. Путем добавления мультиплексора перед выходным сигналом чтения (мультиплексор будет определять, пойдут ли на выход данные из ячейки регистрового файла, либо, в случае если адрес равен нулю, на выход пойдет константа ноль).
2. Путем инициализации нулевого регистра нулевым значением и запретом записи в этот регистр (при записи и проверки write_enable добавить дополнительную проверку на адрес). 2. Путем инициализации нулевого регистра нулевым значением и запретом записи в этот регистр (в логике порта на запись помимо проверки `write_enable` добавить дополнительную проверку на адрес).
3. Каким образом будет реализована эта особенность регистрового файла не важно, выберите сами. 3. Каким образом будет реализована эта особенность регистрового файла не важно, выберите сами.
4. Проверьте модуль с помощью верификационного окружения, представленного в файле [`lab_03.tb_register_file.sv`](lab_03.tb_register_file.sv). В случае, если в TCL-консоли появились сообщения об ошибках, вам необходимо [найти](../../Vivado%20Basics/05.%20Bug%20hunting.md) и исправить их. 4. Проверьте модуль с помощью верификационного окружения, представленного в файле [`lab_03.tb_register_file.sv`](lab_03.tb_register_file.sv). В случае, если в TCL-консоли появились сообщения об ошибках, вам необходимо [найти](../../Vivado%20Basics/05.%20Bug%20hunting.md) и исправить их.
1. Перед запуском моделирования убедитесь, что у вас выбран корректный модуль верхнего уровня в `Simulation Sources`. 1. Перед запуском моделирования убедитесь, что у вас выбран корректный модуль верхнего уровня в `Simulation Sources`.

View File

@@ -10,7 +10,7 @@
## Цель ## Цель
Реализовать простейшее программируемое устройство с архитектурой `CYBERcobra 3000 Pro 2.1` Реализовать простейшее программируемое устройство.
## Ход работы ## Ход работы
@@ -36,7 +36,7 @@
4. изменяется значение `PC`; 4. изменяется значение `PC`;
5. цикл повторяется с `п.1`. 5. цикл повторяется с `п.1`.
Любая инструкция приводит к изменению состояния памяти. В случае процессора с архитектурой `CYBERcobra 3000 Pro 2.1` есть два класса инструкций: одни изменяют содержимое регистрового файла — это инструкции записи. Другие изменяют значение `PC` — это инструкции перехода. В первом случае используются вычислительные инструкции и инструкции загрузки данных из других источников. Во втором случае используются инструкции перехода. Любая инструкция приводит к изменению состояния памяти. В случае процессора, рассматриваемого в данной лабораторной работе, есть два класса инструкций: одни изменяют содержимое регистрового файла — это инструкции записи. Другие изменяют значение `PC` — это инструкции перехода. В первом случае используются вычислительные инструкции и инструкции загрузки данных из других источников. Во втором случае используются инструкции перехода.
Если процессор обрабатывает вычислительную инструкцию, то `PC` перейдет к следующей по порядку инструкции. В ЛР№3 мы реализовали память инструкций с [побайтовой адресацией](../03.%20Register%20file%20and%20memory/#1-Память-инструкций). Это означает, что каждый байт памяти имеет свой собственный адрес. Поскольку длина инструкции составляет `4 байта`, для перехода к следующей инструкции `PC` должен быть увеличен на `4` (`PC = PC + 4`). При этом, регистровый файл сохранит результат некоторой операции на АЛУ или данные с порта входных данных. Если процессор обрабатывает вычислительную инструкцию, то `PC` перейдет к следующей по порядку инструкции. В ЛР№3 мы реализовали память инструкций с [побайтовой адресацией](../03.%20Register%20file%20and%20memory/#1-Память-инструкций). Это означает, что каждый байт памяти имеет свой собственный адрес. Поскольку длина инструкции составляет `4 байта`, для перехода к следующей инструкции `PC` должен быть увеличен на `4` (`PC = PC + 4`). При этом, регистровый файл сохранит результат некоторой операции на АЛУ или данные с порта входных данных.
@@ -48,9 +48,9 @@
![../../.pic/Labs/lab_04_cybercobra/logoCC3000.svg](../../.pic/Labs/lab_04_cybercobra/logoCC3000.svg) ![../../.pic/Labs/lab_04_cybercobra/logoCC3000.svg](../../.pic/Labs/lab_04_cybercobra/logoCC3000.svg)
В качестве первого разрабатываемого программируемого устройства предлагается использовать архитектуру специального назначения `CYBERcobra 3000 Pro 2.1`, которая была разработана в **МИЭТ**. Главным достоинством данной архитектуры является простота её понимания и реализации. Главным её минусом является неоптимальность ввиду неэффективной реализации кодирования инструкций, что приводит к наличию неиспользуемых битов в программах. Но это неважно, так как основная цель разработки процессора с архитектурой `CYBERcobra 3000 Pro 2.1` — это более глубокое понимание принципов работы программируемых устройств, которое поможет при разработке более сложного процессора с архитектурой **RISC-V**. В качестве первого разрабатываемого программируемого устройства предлагается использовать архитектуру специального назначения `CYBERcobra 3000 Pro 2.1` (далее "CYBERcobra"), которая была разработана в **МИЭТ**. Главным достоинством данной архитектуры является простота её понимания и реализации. Главным её минусом является неоптимальность ввиду неэффективной реализации кодирования инструкций, что приводит к наличию неиспользуемых битов в программах. Но это неважно, так как основная цель разработки процессора с архитектурой `CYBERcobra` — это более глубокое понимание принципов работы программируемых устройств, которое поможет при разработке более сложного процессора с архитектурой **RISC-V**.
Простота архитектуры `CYBERcobra 3000 Pro 2.1` проявляется, в том числе, за счёт отсутствия памяти данных. Это значит, что данные c которыми работает программа могут храниться только в регистровом файле. Также в таком процессоре почти полностью отсутствует устройство управления (формально оно существует, но состоит только из проводов и пары логических вентилей). Простота архитектуры `CYBERcobra` проявляется, в том числе, за счёт отсутствия памяти данных. Это значит, что данные c которыми работает программа могут храниться только в регистровом файле. Также в таком процессоре почти полностью отсутствует устройство управления (формально оно существует, но состоит только из проводов и пары логических вентилей).
Архитектурой предусмотрена поддержка 19 инструкций (5 типов команд): Архитектурой предусмотрена поддержка 19 инструкций (5 типов команд):
@@ -97,7 +97,7 @@ _Рисунок 0. Размещение на схеме основных бло
![../../.pic/Labs/lab_04_cybercobra/ppd_code_1.png](../../.pic/Labs/lab_04_cybercobra/ppd_code_1.png) ![../../.pic/Labs/lab_04_cybercobra/ppd_code_1.png](../../.pic/Labs/lab_04_cybercobra/ppd_code_1.png)
_Таблица 1. Кодирование вычислительных инструкций в архитектуре CYBERcobra 3000 Pro v2.1._ _Таблица 1. Кодирование вычислительных инструкций в архитектуре CYBERcobra._
``` C ``` C
reg_file[WA] ← reg_file[RA1] {alu_op} reg_file[RA2] reg_file[WA] ← reg_file[RA1] {alu_op} reg_file[RA2]
@@ -258,7 +258,7 @@ _Таблица 5. Кодирование безусловного перехо
Кроме того, при безусловном переходе в регистровый файл также ничего не пишется. А значит, необходимо обновить логику работы сигнала разрешения записи `WE`, который будет равен 0 если сейчас инструкция условного или безусловного перехода. Кроме того, при безусловном переходе в регистровый файл также ничего не пишется. А значит, необходимо обновить логику работы сигнала разрешения записи `WE`, который будет равен 0 если сейчас инструкция условного или безусловного перехода.
На _рис. 5_ приводится итоговый вариант микроархитектуры процессора `CYBERcobra 3000 Pro 2.1`. На _рис. 5_ приводится итоговый вариант микроархитектуры процессора `CYBERcobra`.
![../../.pic/Labs/lab_04_cybercobra/ppd_5.drawio.svg](../../.pic/Labs/lab_04_cybercobra/ppd_5.drawio.svg) ![../../.pic/Labs/lab_04_cybercobra/ppd_5.drawio.svg](../../.pic/Labs/lab_04_cybercobra/ppd_5.drawio.svg)
@@ -266,7 +266,7 @@ _Рисунок 5. Реализация безусловного переход
### Финальный обзор ### Финальный обзор
Итого, архитектура `CYBERcobra 3000 Pro 2.1` поддерживает 5 типов инструкций, которые кодируются следующим образом (символами `x` помечены биты, которые не задействованы в данной инструкции): Итого, архитектура `CYBERcobra` поддерживает 5 типов инструкций, которые кодируются следующим образом (символами `x` помечены биты, которые не задействованы в данной инструкции):
1. 10 вычислительных инструкций `0 0 01 alu_op RA1 RA2 xxxx xxxx WA` 1. 10 вычислительных инструкций `0 0 01 alu_op RA1 RA2 xxxx xxxx WA`
2. Инструкция загрузки константы `0 0 00 const WA` 2. Инструкция загрузки константы `0 0 00 const WA`

View File

@@ -32,7 +32,7 @@
_Рисунок 1. Микроархитектура будущего процессорного ядра._ _Рисунок 1. Микроархитектура будущего процессорного ядра._
Предложенная микроархитектура похожа на микроархитектуру процессора **CYBERcobra 3000 Pro 2.0** из ЛР№4, но с некоторыми изменениями. Предложенная микроархитектура похожа на микроархитектуру процессора `CYBERcobra` из ЛР№4, но с некоторыми изменениями.
В первую очередь изменились входы и выходы процессора: В первую очередь изменились входы и выходы процессора:
@@ -221,7 +221,7 @@ _Таблица 4. Описание типов форматов кодирова
Поля `rs1`/`rs2`/`imm` и `rd` декодеру не нужны и используются напрямую для адресации регистров / задания констант. Поля `rs1`/`rs2`/`imm` и `rd` декодеру не нужны и используются напрямую для адресации регистров / задания констант.
Существуют особые инструкции, не имеющие никаких переменных полей (к примеру инструкция ECALL в аблице 3_). Такие инструкции необходимо проверять целиком (нужно убедиться, что инструкция совпадает вплоть бита). Существуют особые инструкции, не имеющие никаких переменных полей (к примеру инструкция ECALL в аблице 3_). Такие инструкции необходимо проверять целиком (нужно убедиться, что инструкция совпадает вплоть до бита).
В _Таблице 5_ представлены все опкоды реализуемых нами инструкций. Представленные в ней коды операций 5-битные потому, что 2 младших бита полноценного 7-битного кода операции в реализуемых нами инструкциях должны всегда быть равны `11`. Если это не так, то вся инструкция уже запрещенная и не нуждается в дальнейшем декодировании. В _Таблице 5_ представлены все опкоды реализуемых нами инструкций. Представленные в ней коды операций 5-битные потому, что 2 младших бита полноценного 7-битного кода операции в реализуемых нами инструкциях должны всегда быть равны `11`. Если это не так, то вся инструкция уже запрещенная и не нуждается в дальнейшем декодировании.
@@ -298,7 +298,7 @@ _Таблица 6. Расширенное описание инструкций
Поскольку операция `sw` не является операцией перехода, сигналы `jal_o`, `jalr_o` и `branch_o` и `mret_o` должны быть равны нулю (иначе процессор совершит переход, а инструкция `sw` этого не подразумевает). Точно так же, поскольку во время записи во внешнюю память, в регистровый файл и регистры контроля и статуса ничего не должно быть записано, сигналы `gpr_we_o` и `csr_we_o` также должны быть равны нулю. Поскольку операция `sw` не является операцией перехода, сигналы `jal_o`, `jalr_o` и `branch_o` и `mret_o` должны быть равны нулю (иначе процессор совершит переход, а инструкция `sw` этого не подразумевает). Точно так же, поскольку во время записи во внешнюю память, в регистровый файл и регистры контроля и статуса ничего не должно быть записано, сигналы `gpr_we_o` и `csr_we_o` также должны быть равны нулю.
Иными словами, крайне важно следить выходными сигналами, влияющими на изменение архитектурного состояния процессора, не затрагиваемые инструкцией в явном виде. Иными словами, крайне важно следить за выходными сигналами, влияющими на изменение архитектурного состояния процессора, не затрагиваемые инструкцией в явном виде.
А вот сигнал `wb_sel` может принять любое значение (поскольку сигнал разрешения записи в регистровый файл равен нулю, не важно, каким будет источник данных для записи в регистровый файл, т.к. в него все равно ничего не будет записано). А вот сигнал `wb_sel` может принять любое значение (поскольку сигнал разрешения записи в регистровый файл равен нулю, не важно, каким будет источник данных для записи в регистровый файл, т.к. в него все равно ничего не будет записано).

View File

@@ -1,6 +1,6 @@
# Лабораторная работа 6 "Основная память" # Лабораторная работа 6 "Основная память"
Процессор CYBERcobra 2000 использовал в качестве основного хранилища данных регистровый файл, однако на практике 31-го регистра недостаточно для выполнения сложных программ. Для этих целей используется **основная память**, роль которой в нашей системе будет выполнять **память данных**. Процессор `CYBERcobra` использовал в качестве основного хранилища данных регистровый файл, однако на практике 31-го регистра недостаточно для выполнения сложных программ. Для этих целей используется **основная память**, роль которой в нашей системе будет выполнять **память данных**.
## Цель ## Цель

View File

@@ -43,7 +43,7 @@ endmodule
_Рисунок 1. Микроархитектура ядра процессора RISC-V._ _Рисунок 1. Микроархитектура ядра процессора RISC-V._
Предложенная микроархитектура имеет схожую структуру c процессором `CYBERcobra 3000 Pro 2.0` из [ЛР№4](../04.%20Primitive%20programmable%20device/), с некоторыми изменениями. Предложенная микроархитектура имеет схожую структуру c процессором `CYBERcobra` из [ЛР№4](../04.%20Primitive%20programmable%20device/), с некоторыми изменениями.
В первую очередь изменились входы и выходы процессора: В первую очередь изменились входы и выходы процессора:
@@ -172,7 +172,7 @@ _Листинг 2. Программа из Листинга 1, представ
1. Внимательно ознакомьтесь микроархитектурной реализацией процессорного ядра. В случае возникновения вопросов, проконсультируйтесь с преподавателем. 1. Внимательно ознакомьтесь микроархитектурной реализацией процессорного ядра. В случае возникновения вопросов, проконсультируйтесь с преподавателем.
2. Замените файл `program.mem` в `Design Sources` проекта новым файлом [program.mem](program.mem), приложенном в данной лабораторной работе. Данный файл содержит программу из _листинга 1_. 2. Замените файл `program.mem` в `Design Sources` проекта новым файлом [program.mem](program.mem), приложенном в данной лабораторной работе. Данный файл содержит программу из _листинга 1_.
3. Опишите модуль процессорного ядра с таким же именем и портами, как указано в задании. 3. Опишите модуль процессорного ядра с таким же именем и портами, как указано в задании.
1. Процесс реализации модуля похож на процесс описания модуля cybercobra, однако теперь появляется: 1. Процесс реализации модуля похож на процесс описания модуля CYBERcobra, однако теперь появляется:
1. декодер 1. декодер
2. дополнительные мультиплексоры и знакорасширители. 2. дополнительные мультиплексоры и знакорасширители.
2. Сперва рекомендуется создать все провода, которые будут подключены к входам и выходам каждого модуля на схеме. 2. Сперва рекомендуется создать все провода, которые будут подключены к входам и выходам каждого модуля на схеме.

View File

@@ -33,7 +33,7 @@
Важно понимать, что ни прерывание, ни исключение не являются обязательно чем-то плохим. И то и другое — это всего лишь события. Например, с помощью исключений может осуществляться системные вызовы и передача управления отладчику программы. Важно понимать, что ни прерывание, ни исключение не являются обязательно чем-то плохим. И то и другое — это всего лишь события. Например, с помощью исключений может осуществляться системные вызовы и передача управления отладчику программы.
Как и любой другой вызов функции, при возникновении прерывания или исключения необходимо сохранить адрес возврата, перейти к программе обработчика, выполнить свою работу, восстановить контекст (не оставить никаких следов работы обработчика прерывания) и вернуться к программе, которую прервали. Как и любой другой вызов функции, при возникновении прерывания или исключения необходимо сохранить адрес возврата, перейти к программе обработчика, выполнить свою работу, восстановить контекст и вернуться к программе, которую прервали.
Благодаря исключениям можно реализовать имитацию наличия каких-то аппаратных блоков программными средствами. Например, при отсутствии аппаратного умножителя, можно написать программу обработчика исключения неподдерживаемой инструкции умножения, реализующую алгоритм умножения через сложение и сдвиг. Тогда, каждый раз, когда в программе попадётся инструкция умножения, будет возникать исключение, приводящее к запуску обработчика, перемножающего числа и размещающего результат в нужные ячейки памяти. После выполнения обработчика управление возвращается программе, которая даже не поймёт, что что-то произошло и умножитель «ненастоящий». Благодаря исключениям можно реализовать имитацию наличия каких-то аппаратных блоков программными средствами. Например, при отсутствии аппаратного умножителя, можно написать программу обработчика исключения неподдерживаемой инструкции умножения, реализующую алгоритм умножения через сложение и сдвиг. Тогда, каждый раз, когда в программе попадётся инструкция умножения, будет возникать исключение, приводящее к запуску обработчика, перемножающего числа и размещающего результат в нужные ячейки памяти. После выполнения обработчика управление возвращается программе, которая даже не поймёт, что что-то произошло и умножитель «ненастоящий».

View File

@@ -138,7 +138,7 @@ https://github.com/MPSU/APS/assets/17159587/4daac01f-dc9a-4ec8-8d3f-c5dc1ef97119
## 6. Основная память ## 6. Основная память
Процессор CYBERcobra 2000 использовал в качестве основного хранилища данных регистровый файл, однако на практике 31-го регистра недостаточно для выполнения сложных программ. Для этих целей используется **основная память**. Процессор `CYBERcobra` использовал в качестве основного хранилища данных регистровый файл, однако на практике 31-го регистра недостаточно для выполнения сложных программ. Для этих целей используется **основная память**.
## 7. Тракт данных ## 7. Тракт данных

View File

@@ -6,7 +6,6 @@
- [Как работать с репозиторием](#Как-работать-с-репозиторием) - [Как работать с репозиторием](#Как-работать-с-репозиторием)
- [Мотивация](#Мотивация) - [Мотивация](#Мотивация)
- [Место АПС в Computer Science](#Место-АПС-в-computer-science) - [Место АПС в Computer Science](#Место-АПС-в-computer-science)
- [Как пользоваться репозиторием](#Как-пользоваться-репозиторием)
- [История курса и разработчики](#История-курса-и-разработчики) - [История курса и разработчики](#История-курса-и-разработчики)
- [![Печатный экземпляр](https://img.shields.io/badge/📘-Печатный_экземпляр-blue)](https://ozon.ru/t/63aAzUd) - [![Печатный экземпляр](https://img.shields.io/badge/📘-Печатный_экземпляр-blue)](https://ozon.ru/t/63aAzUd)