From edb6b5a7d0b60b28ea51a4501c422a180eb8c69d Mon Sep 17 00:00:00 2001 From: Andrei Solodovnikov Date: Sat, 9 Sep 2023 20:38:52 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9B=D0=A03.=20=D0=9F=D0=B5=D1=80=D0=B5=D0=B4?= =?UTF-8?q?=D0=B5=D0=BB=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Возврат к истокам: 32-разрядные ячейки памяти. --- .pic/Labs/lab_03_memory/fig_03.drawio.png | Bin 51886 -> 48203 bytes .pic/Labs/lab_03_memory/fig_04.drawio.png | Bin 83528 -> 0 bytes Labs/03. Register file and memory/README.md | 54 +++++++------------- 3 files changed, 18 insertions(+), 36 deletions(-) delete mode 100644 .pic/Labs/lab_03_memory/fig_04.drawio.png diff --git a/.pic/Labs/lab_03_memory/fig_03.drawio.png b/.pic/Labs/lab_03_memory/fig_03.drawio.png index 03fccc4e0d36187b7fa53f59186ee83815ca9089..7090b81a7987356ac48996106bad81e642836cb4 100644 GIT binary patch literal 48203 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 literal 51886 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 B57Ynv diff --git a/.pic/Labs/lab_03_memory/fig_04.drawio.png b/.pic/Labs/lab_03_memory/fig_04.drawio.png deleted file mode 100644 index d67f2bc17c34d37c0c30240818e0bc9b41d11cd0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83528 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≠i^#rm^;2Q-MJ3V^I@0@H+Q}$XSF? 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 можно осуществить отбросив `n` младших бит числа. Таким образом на выход память инструкций должна выдавать данные, расположенные по адресу addr_i[31:2]; -Однако в то же время, инструкции процессора будут 32-битными (состоящими из 4 подряд идущих байт), поэтому выходной сигнал данной памяти будет 32-разрядным. -Как сделать так, чтобы подавать на выход 4 подряд идущих байта? С помощью [конкатенации](../../Basic%20Verilog%20structures/Concatenation.md). - -На вход реализуемого вами модуля приходит адрес младшего байта инструкции, которую вы должны вернуть (этот адрес всегда будет кратен четырем, поскольку в наших лабах инструкции всегда будут состоять из 4 байт). - -На выход необходимо подать 32-разрядную склейку: - -![../../.pic/Labs/lab_03_memory/fig_03.drawio.png](../../.pic/Labs/lab_03_memory/fig_03.drawio.png) - -*Рисунок 3. Пример склейки для чтения* - -Обращение в эту память по адресам, превышающим `1020` должны выдавать значение `32'd0`. Почему именно `1020`? Если обратиться по адресу `1021` (чего произойти не может, т.к. адрес всегда будет кратен четырем, но предположим что такое обращение все-таки произошло), то вы должны будете вернуть данные из ячеек памяти по адресам: `1021`, `1022`, `1023` и `1024`. При этом ячейки по адресу 1024 уже не будет (ведь 1024 ячейки расположатся по адресам `[0:1023]`). +Обращение в память по адресам, превышающим `4095` должно выдавать значение `32'd0`. Почему именно `4095`? `4095 / 4 = 1023` — индекс последней ячейки памяти. Как реализовать подобный функционал? Разумеется, с помощью [мультиплексора](../../Basic%20Verilog%20structures/Multiplexors.md). @@ -252,7 +240,7 @@ mоdulе instr_mеm( ### 2. Память данных -У данной памяти будет 6 портов: +У данной памяти будет 8 портов: - вход тактового синхроимпульса - вход запроса на работу с памятью @@ -273,21 +261,21 @@ mоdulе data_mеm( ``` -Идея этой памяти повторяет идею памяти инструкций: несмотря на разрядность адреса и данных, внутри будет память, состоящая из 4096-и 8-битных ячеек. +Как и память инструкций, память данных будет состоять из 32-разрядных ячеек (только теперь их будет 4096), и при обращении к этим ячейкам будет необходимо делить адрес на 4. Однако в отличие от памяти инструкций, в память данных добавлено два управляющих сигнала (`mem_req_i`и `write_enable_i`). Сигнал `mem_req_i` является сигналом запроса на работу с памятью. Без этого сигнала память не должна выполнять операции чтения/записи (вне зависимости от сигнала `write_enable`, определяющего происходит сейчас запись или чтение). Как сделать так, чтобы не происходило чтение без запроса? Например возвращать на шину чтения специальное "магическое число". - В случае `mem_req_i == 0` или `write_enable_i == 1` (т.е. когда не выполняется операция чтения), на выходе `read_data_o` должно оказаться значение `32'hfa11_1eaf` (поскольку `1` схожа с латинским символом `l`, это выражение можно прочесть как `fall_leaf`). -- В случае, если `mem_req_i == 1` и значение `addr_i` **попадает** в диапазон [0:4095], на выходе `read_data_o` должна оказаться склейка из 4 значений ячеек памяти, начиная ячейки, размещенной по пришедшему адресу (обратите внимание, что в отличие от памяти инструкций, мы **не уменьшаем** диапазон допустимых значений до `[0:4092]`, поскольку архитектура RISC-V допускает обращение в одну отдельную ячейку памяти). -- В случае, если `mem_req_i == 1` и значение `addr_i` **не попадает** в диапазон [0:4095], на выходе `read_data_o` должно оказаться магическое число `32'hdead_beef`. +- В случае, если `mem_req_i == 1` и значение `addr_i` **попадает** в диапазон `[0:16383]` (4096*4-1), на выходе `read_data_o` должно оказаться значение ячейки по адресу в 4 раза меньше пришедшего. +- В случае, если `mem_req_i == 1` и значение `addr_i` **не попадает** в диапазон `[0:16383]`, на выходе `read_data_o` должно оказаться магическое число `32'hdead_beef`. Зачем нужны эти магические числа `32'hfa11_1eaf` и `32'hdead_beef`? У этих чисел легко узнаваемая сигнатура, позволяющая обратить на них внимание. В случае, если при чтении из памяти в регистровый файл попадут эти значения, увидев их вы сможете почувствовать что "что-то не то", и проверить: а было ли в памяти по указанному адресу действительно такое значение (в отличие от значения `32'h0000_0000`, которое не вызовет у вас никаких вопросов). Вероятность того, что такие числа возникнут в естественном ходе работы программы достаточно мала, а значит скорее всего если вы встретите эти числа — это сигнал того, что что-то в вашем процессоре работает неправильно (например, произошло обращение за пределы памяти, или неправильно формируется сигнал `mem_req_i`). -Если `mem_req_i == 1` и `write_enable_i == 1` происходит запрос на запись в память. В этом случае, необходимо по положительному фронту `clk_i` записать в четыре подряд идущие ячейки, начиная с той, что расположена по адресу `addr_i` соответствующие байты с шины `write_data_i`. Во всех других случаях (любой из сигналов `mem_req_i`, `write_enable_i` равен нулю), запись в память не производится. +Если `mem_req_i == 1` и `write_enable_i == 1` происходит запрос на запись в память. В этом случае, необходимо по положительному фронту `clk_i` записать в значение `write_data_i` в ячейку по адресу в 4 раза меньшему `addr_i`. Во всех других случаях (любой из сигналов `mem_req_i`, `write_enable_i` равен нулю), запись в память не производится. -![../../.pic/Labs/lab_03_memory/fig_04.drawio.png](../../.pic/Labs/lab_03_memory/fig_04.drawio.png) +Поскольку мы описываем память с синхронным чтением, было бы неплохо, чтобы в результате мы получили блочную память (см. [теорию про память](#теория-про-память)). Однако блочная память — это заранее созданный аппаратный блок памяти, в котором нет места придуманным нами магическим числам, поэтому описывая порт на чтение, сперва лучше описать регистр, в который по запросу на работу с памятью всегда будет записываться значение из соответствующей ячейки. А уже после можно описать выход `rеаd_dаtа_o` перед которым будет стоять мультиплексор с тремя входами: константами `32'hfa11_1eaf`, `32'hdead_beaf` и значением с выхода описанного вами регистра: -*Рисунок 4. Пример склейки для записи* +![../../.pic/Labs/lab_03_memory/fig_03.drawio.png](../../.pic/Labs/lab_03_memory/fig_03.drawio.png) ### 3. Регистровый файл @@ -326,22 +314,16 @@ mоdulе rf_r𝚒sсv( Либо же можно проинициализировать нулевую ячейку памяти нулем с запретом записи в неё каких-либо значений. В этом случае в ячейке всегда будет ноль, а значит и считываться с нулевого адреса будет только он. -### 4. Проверка в ПЛИС - -Последним этапом будет проверка работоспособности вашего регистрового файла в ПЛИС (файлы для прошивки как обычно расположены в папке [board files](board%20files)). - -Разработанные блоки будут использованы при реализации процессора `CYBERcobra 3000 Pro 2.0` и последующих лабораторных для реализации системы с процессором с архитектурой RISC-V. - ## Порядок выполнения работы 1. Внимательно ознакомьтесь с заданием. В случае возникновения вопросов, проконсультируйтесь с преподавателем. 2. Реализуйте память инструкций. Для этого: 1. В `Design Sources` проекта с предыдущих лаб, создайте `SystemVerilog`-файл `instr_mem.sv`. 2. Опишите в нем модуль памяти инструкций с таким же именем и портами, как указано в задании. - 1. Сперва необходимо создать память (массив регистров). Как это сделать, сказано в разделе [описание памяти на языке SystemVerilog](#описание-памяти-на-языке-systemverilog). Разрядность ячеек памяти должна быть 8 бит, количество ячеек — 1024. + 1. Сперва необходимо создать память (массив регистров). Как это сделать, сказано в разделе [описание памяти на языке SystemVerilog](#описание-памяти-на-языке-systemverilog). Разрядность ячеек памяти должна быть 32 бита, количество ячеек — 1024. 2. Добавить в проект [`файл с содержимым памяти инструкций`](program.txt)([`как добавить файл, инициализирующий память`](../../Vivado%20Basics/How%20to%20add%20a%20mem-file.md)). Данный файл будет использоваться при вызове системной функции `$readmemh` в описании памяти инструкций. - 3. К созданной памяти необходимо подключить выход модуля `read_data_o`. При подключении должен быть использован вход модуля `addr_i` и оператор [конкатенации](../../Basic%20Verilog%20structures/Concatenation.md). - 4. При подключении выхода `read_data_o` помните, что чтение по адресам, превышающим `1020` должно возвращать `0`. + 3. К созданной памяти необходимо подключить выход модуля `read_data_o`. При подключении должен быть использован вход модуля `addr_i`, значение которого должно быть уменьшено в 4 раза (побайтовая адресация). + 4. При подключении выхода `read_data_o` помните, что чтение по адресам, превышающим `4095` должно возвращать `0`. 3. После описания памяти инструкций, её необходимо проверить с помощью тестового окружения. 1. Тестовое окружение находится [`здесь`](tb_instr_mem.sv). 2. Для запуска симуляции воспользуйтесь [`этой инструкцией`](../../Vivado%20Basics/Run%20Simulation.md). @@ -352,9 +334,9 @@ mоdulе rf_r𝚒sсv( 2. Опишите в нем модуль памяти данных с таким же именем и портами, как указано в задании. 1. Описание модуля будет схожим с описанием модуля памяти инструкций, однако порт чтения в этот раз будет **синхронным** (запись в него будет происходить в блоке `always_ff`). Кроме того необходимо будет описать логику записи данных в память. 2. Запись в ячейки памяти описывается подобно записи данных в [регистры](../../Basic%20Verilog%20structures/Registers.md), только при этом, происходит доступ к конкретной ячейке памяти с помощью входа `addr_i` (как осуществляется доступ к ячейкам памяти сказано в разделе [описание памяти на языке SystemVerilog](#описание-памяти-на-языке-systemverilog)). - 3. Необходимо помнить, что запись будет вестись в 4 ячейки памяти одновременно: ту, на которую указывает адрес и следующие за ней три ячейки. + 3. Необходимо помнить, что запись будет вестись в ячейку с индексом в 4 раза меньшим пришедшего адреса. 4. Обратите внимание что работа с памятью должна осуществляться только когда сигнал `mem_req_i == 1`, в противном случае запись не должна производиться, а на шину `read_data_o` должно возвращаться магическое число `32'hfall_leaf`. - 5. Как и в памяти инструкций, при чтении по адресам вне допустимого диапазона (только в этот раз старше адреса `1023`), на шине `read_data_o` должно выставляться значение `32'hdead_beaf`. + 5. Как и в памяти инструкций, при чтении по адресам вне допустимого диапазона (только в этот раз старше адреса `16383`), на шине `read_data_o` должно выставляться значение `32'hdead_beaf`. 3. После описания памяти данных, её необходимо проверить с помощью тестового окружения. 1. Тестовое окружение находится [`здесь`](tb_data_mem.sv). 2. Для запуска симуляции воспользуйтесь [`этой инструкцией`](../../Vivado%20Basics/Run%20Simulation.md). @@ -363,7 +345,7 @@ mоdulе rf_r𝚒sсv( 4. Реализуйте регистровый файл. Для этого: 1. В `Design Sources` проекта создайте `SystemVerilog`-файл `rf_riscv.sv`. 2. Опишите в нем модуль регистрового файла с таким же именем и портами, как указано в задании. - 1. Обратите внимание, что имя памяти (не название модуля, а имя объекта памяти внутри модуля) должно быть `rf_mem`. Такое имя необходимо для корректной работы верификационного окружения. + 1. Обратите внимание, что имя памяти (не название модуля, а имя объекта памяти внутри модуля) должно быть `rf_mem`. Такое имя необходимо для корректной работы верификационного окружения. 2. В отличии от памяти инструкций и данных, ячейки памяти регистрового файла должны быть 32-битными (а на 8-битными). Это означает, что реализация портов чтения и записи будет проще. 3. Не забывайте, что у вас 2 порта на чтение и 1 порт на запись, при этом каждый порт не зависит от остальных (в модуле 3 независимых входа адреса). 4. Чтение из нулевого регистра (чтение по адресу 0) всегда должно возвращать нулевое значение. Этого можно добиться двумя путями: