mirror of
https://github.com/MPSU/APS.git
synced 2025-11-20 15:00:39 +00:00
Compare commits
8 Commits
ef64adf60b
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8497d91ffb | ||
|
|
736a4d283b | ||
|
|
9bd2e6665c | ||
|
|
c1b37042a7 | ||
|
|
9516b4714e | ||
|
|
b765e14cb2 | ||
|
|
a51d46faae | ||
|
|
11720db8e8 |
2
.github/SUMMARY.md
vendored
2
.github/SUMMARY.md
vendored
@@ -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)
|
||||||
|
|||||||
@@ -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`.
|
||||||
|
|||||||
@@ -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 @@
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
В качестве первого разрабатываемого программируемого устройства предлагается использовать архитектуру специального назначения `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. Размещение на схеме основных бло
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
_Таблица 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`.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@@ -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`
|
||||||
|
|||||||
@@ -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` может принять любое значение (поскольку сигнал разрешения записи в регистровый файл равен нулю, не важно, каким будет источник данных для записи в регистровый файл, т.к. в него все равно ничего не будет записано).
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Лабораторная работа 6 "Основная память"
|
# Лабораторная работа 6 "Основная память"
|
||||||
|
|
||||||
Процессор CYBERcobra 2000 использовал в качестве основного хранилища данных регистровый файл, однако на практике 31-го регистра недостаточно для выполнения сложных программ. Для этих целей используется **основная память**, роль которой в нашей системе будет выполнять **память данных**.
|
Процессор `CYBERcobra` использовал в качестве основного хранилища данных регистровый файл, однако на практике 31-го регистра недостаточно для выполнения сложных программ. Для этих целей используется **основная память**, роль которой в нашей системе будет выполнять **память данных**.
|
||||||
|
|
||||||
## Цель
|
## Цель
|
||||||
|
|
||||||
|
|||||||
@@ -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. Сперва рекомендуется создать все провода, которые будут подключены к входам и выходам каждого модуля на схеме.
|
||||||
|
|||||||
@@ -33,7 +33,7 @@
|
|||||||
|
|
||||||
Важно понимать, что ни прерывание, ни исключение не являются обязательно чем-то плохим. И то и другое — это всего лишь события. Например, с помощью исключений может осуществляться системные вызовы и передача управления отладчику программы.
|
Важно понимать, что ни прерывание, ни исключение не являются обязательно чем-то плохим. И то и другое — это всего лишь события. Например, с помощью исключений может осуществляться системные вызовы и передача управления отладчику программы.
|
||||||
|
|
||||||
Как и любой другой вызов функции, при возникновении прерывания или исключения необходимо сохранить адрес возврата, перейти к программе обработчика, выполнить свою работу, восстановить контекст (не оставить никаких следов работы обработчика прерывания) и вернуться к программе, которую прервали.
|
Как и любой другой вызов функции, при возникновении прерывания или исключения необходимо сохранить адрес возврата, перейти к программе обработчика, выполнить свою работу, восстановить контекст и вернуться к программе, которую прервали.
|
||||||
|
|
||||||
Благодаря исключениям можно реализовать имитацию наличия каких-то аппаратных блоков программными средствами. Например, при отсутствии аппаратного умножителя, можно написать программу обработчика исключения неподдерживаемой инструкции умножения, реализующую алгоритм умножения через сложение и сдвиг. Тогда, каждый раз, когда в программе попадётся инструкция умножения, будет возникать исключение, приводящее к запуску обработчика, перемножающего числа и размещающего результат в нужные ячейки памяти. После выполнения обработчика управление возвращается программе, которая даже не поймёт, что что-то произошло и умножитель «ненастоящий».
|
Благодаря исключениям можно реализовать имитацию наличия каких-то аппаратных блоков программными средствами. Например, при отсутствии аппаратного умножителя, можно написать программу обработчика исключения неподдерживаемой инструкции умножения, реализующую алгоритм умножения через сложение и сдвиг. Тогда, каждый раз, когда в программе попадётся инструкция умножения, будет возникать исключение, приводящее к запуску обработчика, перемножающего числа и размещающего результат в нужные ячейки памяти. После выполнения обработчика управление возвращается программе, которая даже не поймёт, что что-то произошло и умножитель «ненастоящий».
|
||||||
|
|
||||||
|
|||||||
@@ -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. Тракт данных
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,6 @@
|
|||||||
- [Как работать с репозиторием](#Как-работать-с-репозиторием)
|
- [Как работать с репозиторием](#Как-работать-с-репозиторием)
|
||||||
- [Мотивация](#Мотивация)
|
- [Мотивация](#Мотивация)
|
||||||
- [Место АПС в Computer Science](#Место-АПС-в-computer-science)
|
- [Место АПС в Computer Science](#Место-АПС-в-computer-science)
|
||||||
- [Как пользоваться репозиторием](#Как-пользоваться-репозиторием)
|
|
||||||
- [История курса и разработчики](#История-курса-и-разработчики)
|
- [История курса и разработчики](#История-курса-и-разработчики)
|
||||||
- [](https://ozon.ru/t/63aAzUd)
|
- [](https://ozon.ru/t/63aAzUd)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user