From 429907bfd63e856930dfe832daadc4b273a8cab3 Mon Sep 17 00:00:00 2001 From: Andrei Solodovnikov Date: Thu, 5 Oct 2023 00:06:13 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9B=D0=A03.=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=83=D0=BA=D0=B0=D0=B7=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=B9=20=D0=BF=D0=BE=20=D1=80=D0=B5=D0=B0=D0=BB?= =?UTF-8?q?=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B8=20=D0=BB=D0=BE=D0=B3=D0=B8?= =?UTF-8?q?=D0=BA=D0=B8=20=D0=BF=D1=80=D0=B8=D0=BE=D1=80=D0=B8=D1=82=D0=B5?= =?UTF-8?q?=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Labs/03. Register file and memory/README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Labs/03. Register file and memory/README.md b/Labs/03. Register file and memory/README.md index 8f0c529..548ad47 100644 --- a/Labs/03. Register file and memory/README.md +++ b/Labs/03. Register file and memory/README.md @@ -268,6 +268,8 @@ mоdulе data_mеm( - В случае, если `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`. +Данные условия должны проверяться **строго** в указанном порядке (с указанным **приоритетом**) с помощью цепочки `if-else-if-else`, причем обязательно с блоками `else`. + Зачем нужны эти магические числа `32'hfa11_1eaf` и `32'hdead_beef`? У этих чисел легко узнаваемая сигнатура, позволяющая обратить на них внимание. В случае, если при чтении из памяти в регистровый файл попадут эти значения, увидев их вы сможете почувствовать что "что-то не то", и проверить: а было ли в памяти по указанному адресу действительно такое значение (в отличие от значения `32'h0000_0000`, которое не вызовет у вас никаких вопросов). Вероятность того, что такие числа возникнут в естественном ходе работы программы достаточно мала, а значит скорее всего если вы встретите эти числа — это сигнал того, что что-то в вашем процессоре работает неправильно (например, произошло обращение за пределы памяти, или неправильно формируется сигнал `mem_req_i`). Если `mem_req_i == 1` и `write_enable_i == 1` происходит запрос на запись в память. В этом случае, необходимо по положительному фронту `clk_i` записать в значение `write_data_i` в ячейку по адресу в 4 раза меньшему `addr_i`. Во всех других случаях (любой из сигналов `mem_req_i`, `write_enable_i` равен нулю), запись в память не производится. @@ -335,7 +337,8 @@ mоdulе rf_r𝚒sсv( 2. Запись в ячейки памяти описывается подобно записи данных в [регистры](../../Basic%20Verilog%20structures/Registers.md), только при этом, происходит доступ к конкретной ячейке памяти с помощью входа `addr_i` (как осуществляется доступ к ячейкам памяти сказано в разделе [описание памяти на языке SystemVerilog](#описание-памяти-на-языке-systemverilog)). 3. Необходимо помнить, что запись будет вестись в ячейку с индексом в 4 раза меньшим пришедшего адреса. 4. Обратите внимание что работа с памятью должна осуществляться только когда сигнал `mem_req_i == 1`, в противном случае запись не должна производиться, а на шину `read_data_o` должно возвращаться магическое число `32'hfall_leaf`. - 5. Как и в памяти инструкций, при чтении по адресам вне допустимого диапазона (только в этот раз старше адреса `16383`), на шине `read_data_o` должно выставляться значение `32'hdead_beaf`. + 5. При чтении по адресам вне допустимого диапазона (старше адреса `16383`), на шине `read_data_o` должно выставляться значение `32'hdead_beaf`. + 6. Проверка условий перед записью значения в `read_data_o` должно идти в указанном в задании порядке: сперва проверяются значения сигналов `mem_req_i` и `write_enable_i`, и только после этого значение адреса. Реализация логики приоритетов осуществляется в цепочке блоков `if-else-if-else`. 3. После описания памяти данных, её необходимо проверить с помощью тестового окружения. 1. Тестовое окружение находится [`здесь`](tb_data_mem.sv). 2. Для запуска симуляции воспользуйтесь [`этой инструкцией`](../../Vivado%20Basics/Run%20Simulation.md).