diff --git a/Labs/07. Datapath/README.md b/Labs/07. Datapath/README.md index f247ff1..147e2cf 100644 --- a/Labs/07. Datapath/README.md +++ b/Labs/07. Datapath/README.md @@ -44,12 +44,12 @@ endmodule _Рисунок 1. Микроархитектура ядра процессора RISC-V._ -Предложенная микроархитектура похожа на микроархитектуру процессора `CYBERcobra 3000 Pro 2.0` из прошлой лабораторной, имеет схожую структуру, с некоторыми изменениями. +Предложенная микроархитектура имеет схожую структуру c процессором `CYBERcobra 3000 Pro 2.0` из [ЛР№4](../04.%20Primitive%20programmable%20device/), с некоторыми изменениями. В первую очередь изменились входы и выходы процессора: - память инструкций вынесена наружу процессора, таким образом, у процессора появляются входы и выходы: `instr_addr_o` и `instr_i`; -- помимо прочего, у модуля появились сигналы интерфейса памяти данных: +- помимо прочего, у модуля появились сигналы интерфейса памяти данных, реализованной в [ЛР№6](../06.%20Main%20memory/): - `mem_addr_o` — адрес внешней памяти; - `mem_req_o` — запрос на обращение во внешнюю память; - `mem_size_o` — размер данных при обращении в память; @@ -63,7 +63,7 @@ _Рисунок 1. Микроархитектура ядра процессор Константы `I`, `U`, `S` используются для вычисления адресов и значений. Поэтому все эти константы должны быть подключены к АЛУ. А значит теперь, для выбора значения для операндов требуются мультиплексоры, определяющие что именно будет подаваться на АЛУ. -Обратите внимание на константу `imm_U`. В отличие от всех остальных констант, она не знакорасширяется, вместо этого к ней приклеивается справа 12 нулевых бит. +Обратите внимание на константу `imm_U`. В отличие от всех остальных констант, она не знакорасширяется, вместо этого к ней "приклеивается" справа 12 нулевых бит. Константы `B` и `J` используются для условного и безусловного перехода (в киберкобре для этого использовалась одна константа `offset`). @@ -198,14 +198,19 @@ _Листинг 2. Программа из Листинга 1, представ 1. Процесс реализации модуля очень похож на процесс описания модуля cybercobra, однако теперь появляется: 1. декодер 2. дополнительные мультиплексоры и знакорасширители. + 2. Сперва рекомендуется создать все провода, которые будут подключены к входам и выходам каждого модуля на схеме. + 3. Затем необходимо создать экземпляры модулей. + 4. Также необходимо создать 32-разрядные константы I, U, S, B и J-типа и программный счетчик. + 5. После необходимо описать логику, управляющую созданными в п. 2.1 проводами. + 6. В конце останется описать логику работы программного счетчика. 3. Создайте в проекте новый `SystemVerilog`-файл `riscv_unit.sv` и опишите в нем модуль `riscv_unit`, объединяющий ядро процессора (`riscv_core`) с памятями инструкция и данных. - 1. **При создании объекта модуля `riscv_core` в модуле `riscv_unit` вы должны использовать имя сущности `core` (т.е. создать объект в виде: `riscv_core core(...`)** + 1. **При создании объекта модуля `riscv_core` в модуле `riscv_unit` вы должны использовать имя сущности `core` (т.е. создать объект в виде: `riscv_core core(...`)**. 3. После описания модуля, его необходимо проверить с помощью тестового окружения. 1. Тестовое окружение находится [`здесь`](tb_riscv_unit.sv). 2. Программа, которой необходимо проинициализировать память инструкций находится в файле [`program.mem`](program.mem). 3. Для запуска симуляции воспользуйтесь [`этой инструкцией`](../../Vivado%20Basics/Run%20Simulation.md). 4. Перед запуском симуляции убедитесь, что выбран правильный модуль верхнего уровня. - 5. **Во время симуляции убедитесь, что в логе есть сообщение о завершении теста!** + 5. **По завершению симуляции убедитесь, что в логе есть сообщение о завершении теста!** 6. Как и в случае с проверкой процессора архитектуры CYBERcobra, вам не будет сказано пройден тест или нет. Вы должны сами, такт за тактом проверить что процессор правильно выполняет описанные в _Листинге 1_ инструкции. Для этого, необходимо сперва самостоятельно рассчитать что именно должна сделать данная инструкция, а потом проверить что процессор сделал именно это. 7. Вполне возможно, что после первого запуска вы столкнетесь с сообщениями о множестве ошибок. Вам необходимо [исследовать](../../Vivado%20Basics/Debug%20manual.md) эти ошибки на временной диаграмме и исправить их в вашем модуле. 4. Проверьте работоспособность вашей цифровой схемы в ПЛИС. Для этого: @@ -215,6 +220,7 @@ _Листинг 2. Программа из Листинга 1, представ 2. Выберите `nexys_riscv_unit` в качестве модуля верхнего уровня (`top-level`). 3. Выполните генерацию битстрима и сконфигурируйте ПЛИС. Для этого воспользуйтесь [следующей инструкцией](../../Vivado%20Basics/How%20to%20program%20an%20fpga%20board.md). 4. Описание логики работы модуля верхнего уровня и связи периферии ПЛИС с реализованным модулем находится в папке [`board files`](https://github.com/MPSU/APS/tree/master/Labs/07.%20Datapath/board%20files). + 5. После всех проверок вы можете загрузить ваше индивидуальное задание, написанное на языке ассемблера RISC-V чтобы проверить, что ваш процессор вычисляет корректный результат. ---