Compare commits

...

5 Commits

Author SHA1 Message Date
Andrei Solodovnikov
4cac36212b Обновление workflows 2026-10-05 15:46:33 +03:00
Andrei Solodovnikov
06da941d8a Update lab_06.data_mem.sv 2026-09-16 16:44:51 +03:00
Andrei Solodovnikov
78ff35477b Л15. Исправление иерархического подключения core 2026-09-16 16:38:55 +03:00
Andrei Solodovnikov
e5d28642a7 Л15. Переименование тб 2026-09-16 16:36:28 +03:00
Andrei Solodovnikov
5e5a4cf4ab ЛР1. Уточнение формулировки 2026-09-16 15:32:02 +03:00
4 changed files with 22 additions and 77 deletions

View File

@@ -1,4 +1,4 @@
# Builds the Russian (master) and English (english_version) editions of the
# Builds the Russian and English editions of the
# mdBook and deploys them as one GitHub Pages site:
#
# /APS/ ← Russian
@@ -8,7 +8,7 @@ name: Deploy mdBook site to Pages
on:
push:
branches: ["master", "english_version"]
branches: ["russian_version", "english_version"]
workflow_dispatch:
permissions:
@@ -27,9 +27,11 @@ jobs:
MDBOOK_VERSION: 0.4.36
steps:
# ── 1. Checkout master (Russian) ──────────────────────────────────────
- name: Checkout master (Russian)
# ── 1. Checkout Russian version ──────────────────────────────────────
- name: Checkout Russian version
uses: actions/checkout@v4
with:
ref: russian_version
# checks out into $GITHUB_WORKSPACE (i.e. the working directory)
# ── 2. Install mdBook ─────────────────────────────────────────────────
@@ -68,7 +70,7 @@ jobs:
# Use the dedicated English book.toml (sets site-url = "/APS/en/")
cp .github/book_en.toml book.toml
# Copy language-switcher theme files from the master checkout
# Copy language-switcher theme files from the russian_version checkout
cp -r ../.github/theme ./theme
- name: Build English (mdbook → english_src/book/)

View File

@@ -139,7 +139,7 @@ _Рисунок 3. Цифровая схема модуля half_adder, сген
Подаваемые на схему входные воздействия формируются верификационным окружением. Верификационное окружение (в дальнейшем будет использован термин "**тестбенч**") — это особый несинтезируемый модуль, который не имеет входных или выходных сигналов. Эти сигналы ему не нужны, потому что он сам является генератором всех своих внутренних сигналов, и данный модуль не передаёт ничего вовне — только проверяет тестируемый модуль внутри себя.
Внутри тестбенча можно использовать конструкции из несинтезируемого подмножества языка SystemVerilog, в частности программный блок `initial`, в котором команды выполняются последовательно, что делает этот блок чем-то отдалённо похожим на проверяющую программу. Поскольку изменение внутренних цепей происходит с некоторой задержкой относительно изменений входных сигналов, при моделировании есть возможность делать паузы между командами. Это делается с помощью специального символа #, за которым указывается количество времени симуляции, которое нужно пропустить перед следующей командой.
Внутри тестбенча можно использовать конструкции из несинтезируемого подмножества языка SystemVerilog, в частности программный блок `initial`, в котором команды выполняются последовательно, что делает этот блок чем-то отдалённо похожим на проверяющую программу. Чтобы разнести подаваемые на схему тестовые воздействия по времени, при моделировании есть возможность делать паузы между командами. Это делается с помощью специального символа #, за которым указывается количество времени симуляции, которое нужно пропустить перед следующей командой.
Перед тем как писать верификационное окружение, необходимо составить план того, как будет проводиться проверка устройства (составить верификационный план). Ввиду предельной простоты устройства, план будет состоять из одного предложения:

View File

@@ -8,7 +8,7 @@
See https://github.com/MPSU/APS/blob/master/LICENSE file for licensing details.
* ------------------------------------------------------------------------------
*/
module lab_15_tb_system();
module lab_15_tb_processor_system();
logic clk_i;
logic sysclk;
@@ -111,7 +111,7 @@ module lab_15_tb_system();
.sw_i (sw_i )
);
assign core_reset = DUT.core_inst.rst_i;
assign core_reset = DUT.core.rst_i;
uart_rx rx(
.clk_i (sysclk ),

View File

@@ -8,8 +8,7 @@
See https://github.com/MPSU/APS/blob/master/LICENSE file for licensing details.
* ------------------------------------------------------------------------------
*/
module data_mem(
module data_mem (
input logic clk_i,
input logic mem_req_i,
input logic write_enable_i,
@@ -23,78 +22,22 @@ assign ready_o = 1'b1;
import memory_pkg::DATA_MEM_SIZE_WORDS;
logic [31:0] ram [DATA_MEM_SIZE_WORDS];
logic [31:0] addr;
assign addr = addr_i[2+:$clog2(DATA_MEM_SIZE_WORDS)];
always_ff @(posedge clk_i) begin
case(1)
!mem_req_i||write_enable_i: read_data_o <= read_data_o;
default: read_data_o <= ram[addr_i[32'ha&32'h2+:$clog2(DATA_MEM_SIZE_WORDS)]];
endcase
if(mem_req_i & !write_enable_i) begin
read_data_o <= ram[addr];
end
end
always_ff @(posedge clk_i) begin
case({mem_req_i, write_enable_i, byte_enable_i})
6'd49: begin
ram [addr_i[32'ha&32'h2+:$clog2(DATA_MEM_SIZE_WORDS)]] [7:0] <= write_data_i[7:0];
if(mem_req_i & write_enable_i) begin
if(byte_enable_i[0]) ram[addr][ 7: 0] = write_data_i[ 7: 0];
if(byte_enable_i[1]) ram[addr][15: 8] = write_data_i[15: 8];
if(byte_enable_i[2]) ram[addr][23:16] = write_data_i[23:16];
if(byte_enable_i[3]) ram[addr][31:24] = write_data_i[31:24];
end
6'd50: begin
ram [addr_i[32'ha&32'h2+:$clog2(DATA_MEM_SIZE_WORDS)]] [15:8] <= write_data_i[15:8];
end
6'd51: begin
ram [addr_i[32'ha&32'h2+:$clog2(DATA_MEM_SIZE_WORDS)]] [7:0] <= write_data_i[7:0];
ram [addr_i[32'ha&32'h2+:$clog2(DATA_MEM_SIZE_WORDS)]] [15:8] <= write_data_i[15:8];
end
6'd52: begin
ram [addr_i[32'ha&32'h2+:$clog2(DATA_MEM_SIZE_WORDS)]] [23:16] <= write_data_i[23:16];
end
6'd53: begin
ram [addr_i[32'ha&32'h2+:$clog2(DATA_MEM_SIZE_WORDS)]] [7:0] <= write_data_i[7:0];
ram [addr_i[32'ha&32'h2+:$clog2(DATA_MEM_SIZE_WORDS)]] [23:16] <= write_data_i[23:16];
end
6'd54: begin
ram [addr_i[32'ha&32'h2+:$clog2(DATA_MEM_SIZE_WORDS)]] [15:8] <= write_data_i[15:8];
ram [addr_i[32'ha&32'h2+:$clog2(DATA_MEM_SIZE_WORDS)]] [23:16] <= write_data_i[23:16];
end
6'd55: begin
ram [addr_i[32'ha&32'h2+:$clog2(DATA_MEM_SIZE_WORDS)]] [7:0] <= write_data_i[7:0];
ram [addr_i[32'ha&32'h2+:$clog2(DATA_MEM_SIZE_WORDS)]] [15:8] <= write_data_i[15:8];
ram [addr_i[32'ha&32'h2+:$clog2(DATA_MEM_SIZE_WORDS)]] [23:16] <= write_data_i[23:16];
end
6'd56: begin
ram [addr_i[32'ha&32'h2+:$clog2(DATA_MEM_SIZE_WORDS)]] [31:24] <= write_data_i[31:24];
end
6'd57: begin
ram [addr_i[32'ha&32'h2+:$clog2(DATA_MEM_SIZE_WORDS)]] [7:0] <= write_data_i[7:0];
ram [addr_i[32'ha&32'h2+:$clog2(DATA_MEM_SIZE_WORDS)]] [31:24] <= write_data_i[31:24];
end
6'd58: begin
ram [addr_i[32'ha&32'h2+:$clog2(DATA_MEM_SIZE_WORDS)]] [15:8] <= write_data_i[15:8];
ram [addr_i[32'ha&32'h2+:$clog2(DATA_MEM_SIZE_WORDS)]] [31:24] <= write_data_i[31:24];
end
6'd59: begin
ram [addr_i[32'ha&32'h2+:$clog2(DATA_MEM_SIZE_WORDS)]] [7:0] <= write_data_i[7:0];
ram [addr_i[32'ha&32'h2+:$clog2(DATA_MEM_SIZE_WORDS)]] [15:8] <= write_data_i[15:8];
ram [addr_i[32'ha&32'h2+:$clog2(DATA_MEM_SIZE_WORDS)]] [31:24] <= write_data_i[31:24];
end
6'd60: begin
ram [addr_i[32'ha&32'h2+:$clog2(DATA_MEM_SIZE_WORDS)]] [23:16] <= write_data_i[23:16];
ram [addr_i[32'ha&32'h2+:$clog2(DATA_MEM_SIZE_WORDS)]] [31:24] <= write_data_i[31:24];
end
6'd61: begin
ram [addr_i[32'ha&32'h2+:$clog2(DATA_MEM_SIZE_WORDS)]] [7:0] <= write_data_i[7:0];
ram [addr_i[32'ha&32'h2+:$clog2(DATA_MEM_SIZE_WORDS)]] [23:16] <= write_data_i[23:16];
ram [addr_i[32'ha&32'h2+:$clog2(DATA_MEM_SIZE_WORDS)]] [31:24] <= write_data_i[31:24];
end
6'd62: begin
ram [addr_i[32'ha&32'h2+:$clog2(DATA_MEM_SIZE_WORDS)]] [15:8] <= write_data_i[15:8];
ram [addr_i[32'ha&32'h2+:$clog2(DATA_MEM_SIZE_WORDS)]] [23:16] <= write_data_i[23:16];
ram [addr_i[32'ha&32'h2+:$clog2(DATA_MEM_SIZE_WORDS)]] [31:24] <= write_data_i[31:24];
end
6'd63: begin
ram [addr_i[32'ha&32'h2+:$clog2(DATA_MEM_SIZE_WORDS)]] [7:0] <= write_data_i[7:0];
ram [addr_i[32'ha&32'h2+:$clog2(DATA_MEM_SIZE_WORDS)]] [15:8] <= write_data_i[15:8];
ram [addr_i[32'ha&32'h2+:$clog2(DATA_MEM_SIZE_WORDS)]] [23:16] <= write_data_i[23:16];
ram [addr_i[32'ha&32'h2+:$clog2(DATA_MEM_SIZE_WORDS)]] [31:24] <= write_data_i[31:24];
end
endcase
end
endmodule