From 512595c9791978991a782904a07fc133765cbd63 Mon Sep 17 00:00:00 2001 From: Andrei Solodovnikov Date: Wed, 3 Jul 2024 16:41:35 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9B=D0=A07.=20=D0=9D=D0=B5=D0=B1=D0=BE=D0=BB?= =?UTF-8?q?=D1=8C=D1=88=D0=B8=D0=B5=20=D0=B4=D0=BE=D0=BF=D0=BE=D0=BB=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Labs/07. Datapath/README.md | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/Labs/07. Datapath/README.md b/Labs/07. Datapath/README.md index 7eeb875..43a6d1a 100644 --- a/Labs/07. Datapath/README.md +++ b/Labs/07. Datapath/README.md @@ -1,6 +1,6 @@ # Лабораторная работа 6 "Тракт данных" -Микроархитектуру можно разделить на две части: тракт данных и устройство управления. По тракту данных перемещаются данные (из памяти инструкций, регистрового файла, АЛУ, памяти данных, мультиплексоров), а устройство управления (основной дешифратор команд) получает текущую инструкцию из тракта и в ответ говорит ему как именно выполнить эту инструкцию, то есть управляет тем, как эти данные будут через тракт данных проходить. +Микроархитектуру можно разделить на две части: тракт данных и устройство управления. По тракту данных перемещаются данные (из памяти инструкций, регистрового файла, АЛУ, памяти данных, мультиплексоров), а устройство управления (в нашем случае — декодер инструкций) получает текущую инструкцию из тракта и в ответ говорит ему как именно её выполнить, то есть управляет тем, как эти данные будут через проходить тракт данных. ## Цель @@ -44,17 +44,32 @@ endmodule _Рисунок 1. Микроархитектура ядра процессора RISC-V._ -В отличие от реализованного ранее процессора с архитектурой CYBERcobra, в данном модуле отсутствует память (она подключается извне, а значит у этого модуля должны быть сигналы интерфейса памяти). +Предложенная микроархитектура похожа на микроархитектуру процессора `CYBERcobra 3000 Pro 2.0` из прошлой лабораторной, имеет схожую структуру, с некоторыми изменениями. + +В первую очередь изменились входы и выходы процессора: + +- память инструкций вынесена наружу процессора, таким образом, у процессора появляются входы и выходы: `instr_addr_o` и `instr_i`; +- помимо прочего, у модуля появились сигналы интерфейса памяти данных: + - `mem_addr_o` — адрес внешней памяти; + - `mem_req_o` — запрос на обращение во внешнюю память; + - `mem_size_o` — размер данных при обращении в память; + - `mem_we_o` — сигнал разрешения записи во внешнюю память; + - `mem_wd_o` — данные для записи во внешнюю память; + - `mem_rd_i` — считанные из внешней памяти данные; + Эти сигналы используются при выполнении инструкций загрузки (сохранения) информации из (в) памяти данных. +- еще у процессора появился вход `stall_i`, приостанавливающий обновление программного счётчика. Кроме того, в данной микроархитектуре используется пять различных видов констант (соответствующих определенным типам инструкций). -Константы `I`,`U`,`S` используются для вычисления адресов и значений. Поэтому все эти константы должны быть подключены к АЛУ. А значит теперь, для выбора значения для операндов требуются мультиплексоры, определяющие что именно будет подаваться на АЛУ. +Константы `I`, `U`, `S` используются для вычисления адресов и значений. Поэтому все эти константы должны быть подключены к АЛУ. А значит теперь, для выбора значения для операндов требуются мультиплексоры, определяющие что именно будет подаваться на АЛУ. Обратите внимание на константу `imm_U`. В отличие от всех остальных констант, она не знакорасширяется, вместо этого к ней приклеивается справа 12 нулевых бит. +Константы `B` и `J` используются для условного и безусловного перехода (в киберкобре для этого использовалась одна константа `offset`). + Программный счетчик (`PC`) теперь также изменяется более сложным образом. Поскольку появился еще один вид безусловного перехода (`jalr`), программный счетчик может не просто увеличиться на значение константы из инструкции, но и получить совершенно новое значение в виде суммы константы и значения из регистрового файла (см. на самый левый мультиплексор схемы). Обратите внимание, что младший бит этой суммы должен быть обнулен — таково требование спецификации. -Поскольку обращение во внешнюю память требует времени, необходимо останавливать программный счетчик, чтобы до конца обращения в память не начались исполняться последующие инструкции. Для этого у программного счетчика появился управляющий сигнал `stall_i`. Программный счетчик может меняться только когда этот сигнал равен нулю (иными словами, инверсия этого сигнала является сигналом `enable` для регистра `PC`). +Поскольку обращение во внешнюю память требует времени, необходимо приостанавливать программный счетчик, чтобы до конца обращения в память не начались исполняться последующие инструкции. Для этого у программного счетчика появился управляющий сигнал `stall_i`. Программный счетчик может меняться только когда этот сигнал равен нулю (иными словами, инверсия этого сигнала является сигналом `enable` для регистра `PC`). ### riscv_unit @@ -136,6 +151,8 @@ _Рисунок 2. Микроархитектура процессора._ 68: jalr x18, 0x4(x15) ``` +_Листинг 1. Пример программы на ассемблере._ + Теперь в соответствии с кодировкой инструкций переведем программу в машинные коды: ```text @@ -168,6 +185,8 @@ _Рисунок 2. Микроархитектура процессора._ 68: 000000000100 01111 000 10010 1100111 (0x00478967) ``` +_Листинг 2. Программа из Листинга 1, представленная в машинных кодах._ + Данная программа, представленная в шестнадцатеричном формате находится в файле [program.mem](program.mem). ## Порядок выполнения задания @@ -187,7 +206,8 @@ _Рисунок 2. Микроархитектура процессора._ 3. Для запуска симуляции воспользуйтесь [`этой инструкцией`](../../Vivado%20Basics/Run%20Simulation.md). 4. Перед запуском симуляции убедитесь, что выбран правильный модуль верхнего уровня. 5. **Во время симуляции убедитесь, что в логе есть сообщение о завершении теста!** - 6. Вполне возможно, что после первого запуска вы столкнетесь с сообщениями о множестве ошибок. Вам необходимо [исследовать](../../Vivado%20Basics/Debug%20manual.md) эти ошибки на временной диаграмме и исправить их в вашем модуле. + 6. Как и в случае с проверкой процессора архитектуры CYBERcobra, вам не будет сказано пройден тест или нет. Вы должны сами, такт за тактом проверить что процессор правильно выполняет описанные в _Листинге 1_ инструкции. Для этого, необходимо сперва самостоятельно рассчитать что именно должна сделать данная инструкция, а потом проверить что процессор сделал именно это. + 7. Вполне возможно, что после первого запуска вы столкнетесь с сообщениями о множестве ошибок. Вам необходимо [исследовать](../../Vivado%20Basics/Debug%20manual.md) эти ошибки на временной диаграмме и исправить их в вашем модуле. 4. Проверьте работоспособность вашей цифровой схемы в ПЛИС. Для этого: 1. Добавьте файлы из папки [`board files`](https://github.com/MPSU/APS/tree/master/Labs/07.%20Datapath/board%20files) в проект. 1. Файл [nexys_riscv_unit.sv](https://github.com/MPSU/APS/tree/master/Labs/07.%20Datapath/board%20files/nexys_riscv_unit.sv) необходимо добавить в `Design Sources` проекта.