mirror of
https://github.com/MPSU/APS.git
synced 2026-10-27 13:18:27 +00:00
Compare commits
4 Commits
4c70d10f17
...
06da941d8a
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
06da941d8a | ||
|
|
78ff35477b | ||
|
|
e5d28642a7 | ||
|
|
5e5a4cf4ab |
@@ -139,7 +139,7 @@ _Рисунок 3. Цифровая схема модуля half_adder, сген
|
|||||||
|
|
||||||
Подаваемые на схему входные воздействия формируются верификационным окружением. Верификационное окружение (в дальнейшем будет использован термин "**тестбенч**") — это особый несинтезируемый модуль, который не имеет входных или выходных сигналов. Эти сигналы ему не нужны, потому что он сам является генератором всех своих внутренних сигналов, и данный модуль не передаёт ничего вовне — только проверяет тестируемый модуль внутри себя.
|
Подаваемые на схему входные воздействия формируются верификационным окружением. Верификационное окружение (в дальнейшем будет использован термин "**тестбенч**") — это особый несинтезируемый модуль, который не имеет входных или выходных сигналов. Эти сигналы ему не нужны, потому что он сам является генератором всех своих внутренних сигналов, и данный модуль не передаёт ничего вовне — только проверяет тестируемый модуль внутри себя.
|
||||||
|
|
||||||
Внутри тестбенча можно использовать конструкции из несинтезируемого подмножества языка SystemVerilog, в частности программный блок `initial`, в котором команды выполняются последовательно, что делает этот блок чем-то отдалённо похожим на проверяющую программу. Поскольку изменение внутренних цепей происходит с некоторой задержкой относительно изменений входных сигналов, при моделировании есть возможность делать паузы между командами. Это делается с помощью специального символа #, за которым указывается количество времени симуляции, которое нужно пропустить перед следующей командой.
|
Внутри тестбенча можно использовать конструкции из несинтезируемого подмножества языка SystemVerilog, в частности программный блок `initial`, в котором команды выполняются последовательно, что делает этот блок чем-то отдалённо похожим на проверяющую программу. Чтобы разнести подаваемые на схему тестовые воздействия по времени, при моделировании есть возможность делать паузы между командами. Это делается с помощью специального символа #, за которым указывается количество времени симуляции, которое нужно пропустить перед следующей командой.
|
||||||
|
|
||||||
Перед тем как писать верификационное окружение, необходимо составить план того, как будет проводиться проверка устройства (составить верификационный план). Ввиду предельной простоты устройства, план будет состоять из одного предложения:
|
Перед тем как писать верификационное окружение, необходимо составить план того, как будет проводиться проверка устройства (составить верификационный план). Ввиду предельной простоты устройства, план будет состоять из одного предложения:
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
See https://github.com/MPSU/APS/blob/master/LICENSE file for licensing details.
|
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 clk_i;
|
||||||
logic sysclk;
|
logic sysclk;
|
||||||
@@ -111,7 +111,7 @@ module lab_15_tb_system();
|
|||||||
.sw_i (sw_i )
|
.sw_i (sw_i )
|
||||||
);
|
);
|
||||||
|
|
||||||
assign core_reset = DUT.core_inst.rst_i;
|
assign core_reset = DUT.core.rst_i;
|
||||||
|
|
||||||
uart_rx rx(
|
uart_rx rx(
|
||||||
.clk_i (sysclk ),
|
.clk_i (sysclk ),
|
||||||
@@ -8,8 +8,7 @@
|
|||||||
See https://github.com/MPSU/APS/blob/master/LICENSE file for licensing details.
|
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 clk_i,
|
||||||
input logic mem_req_i,
|
input logic mem_req_i,
|
||||||
input logic write_enable_i,
|
input logic write_enable_i,
|
||||||
@@ -23,78 +22,22 @@ assign ready_o = 1'b1;
|
|||||||
import memory_pkg::DATA_MEM_SIZE_WORDS;
|
import memory_pkg::DATA_MEM_SIZE_WORDS;
|
||||||
logic [31:0] ram [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
|
always_ff @(posedge clk_i) begin
|
||||||
case(1)
|
if(mem_req_i & !write_enable_i) begin
|
||||||
!mem_req_i||write_enable_i: read_data_o <= read_data_o;
|
read_data_o <= ram[addr];
|
||||||
default: read_data_o <= ram[addr_i[32'ha&32'h2+:$clog2(DATA_MEM_SIZE_WORDS)]];
|
end
|
||||||
endcase
|
|
||||||
end
|
end
|
||||||
|
|
||||||
always_ff @(posedge clk_i) begin
|
always_ff @(posedge clk_i) begin
|
||||||
case({mem_req_i, write_enable_i, byte_enable_i})
|
if(mem_req_i & write_enable_i) begin
|
||||||
6'd49: begin
|
if(byte_enable_i[0]) ram[addr][ 7: 0] = write_data_i[ 7: 0];
|
||||||
ram [addr_i[32'ha&32'h2+:$clog2(DATA_MEM_SIZE_WORDS)]] [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
|
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
|
end
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
|
|||||||
Reference in New Issue
Block a user