mirror of
https://github.com/MPSU/APS.git
synced 2025-09-15 17:20:10 +00:00
Добавление готовых модулей
This commit is contained in:
7
Labs/Made-up modules/README.md
Normal file
7
Labs/Made-up modules/README.md
Normal file
@@ -0,0 +1,7 @@
|
||||
# Заготовленные модули
|
||||
|
||||
Все лабораторные работы курса построены по последовательному принципу: модули предыдущих лабораторных работ используются для описания модулей следующих лабораторных работ.
|
||||
|
||||
Это приводит к тому, что нельзя выполнить очередную лабу, не выполнив все предыдущие. В случае, если нужен модуль из лабы, которой нет в учебном плане, либо по какой-то причине вы не появились на лабораторном занятии / не успели сделать лабу, у вас всё ещё остается возможность продолжить обучение. Для этого, вы можете воспользоваться реализациями модулей из данной папки.
|
||||
|
||||
Обратите внимание на то, что реализации этих модулей неоптимальны, странны и намеренным образом сделаны так, чтобы было тяжело разобраться в принципе их работы. Это сделано для того, чтобы сохранить таинство выполнения соответствующей этому модулю лабы и разумеется ни один из этих модулей не может использоваться на защите лабораторной работы, посвященной этому модулю.
|
11
Labs/Made-up modules/lab_01.fulladder32.sv
Normal file
11
Labs/Made-up modules/lab_01.fulladder32.sv
Normal file
@@ -0,0 +1,11 @@
|
||||
module fulladder32(
|
||||
input logic [31:0] a_i,
|
||||
input logic [31:0] b_i,
|
||||
input logic carry_i,
|
||||
output logic [31:0] sum_o,
|
||||
output logic carry_o
|
||||
);
|
||||
|
||||
assign {carry_o, sum_o} = a_i + b_i + carry_i;
|
||||
|
||||
endmodule
|
6434
Labs/Made-up modules/lab_02.alu.sv
Normal file
6434
Labs/Made-up modules/lab_02.alu.sv
Normal file
File diff suppressed because it is too large
Load Diff
45
Labs/Made-up modules/lab_03.data_mem.sv
Normal file
45
Labs/Made-up modules/lab_03.data_mem.sv
Normal file
@@ -0,0 +1,45 @@
|
||||
module data_mem (
|
||||
input logic clk_i,
|
||||
input logic [31:0] addr_i,
|
||||
input logic [31:0] write_data_i,
|
||||
input logic write_enable_i,
|
||||
input logic mem_req_i,
|
||||
output logic [31:0] read_data_o
|
||||
);
|
||||
|
||||
`define akjsdnnaskjdndat $clog2(128)
|
||||
`define cdyfguvhbjnmkdat $clog2(`akjsdnnaskjdndat)
|
||||
`define qwenklfsaklasddat $clog2(`cdyfguvhbjnmkdat)
|
||||
`define asdasdhkjasdsadat (34>>`cdyfguvhbjnmkdat)
|
||||
|
||||
logic [31:0] RAM [0:4095];
|
||||
logic [31:0] addr;
|
||||
assign addr = {2'b0, addr_i[31:2]};
|
||||
|
||||
always_ff @(posedge clk_i) begin
|
||||
if(write_enable_i&mem_req_i) RAM[addr[{1'b1,2'b0}:'hBA & 'h45]][{5{1'b1}}:{3'd7,2'b00}] <= write_data_i['h1f:'h1c];
|
||||
if(write_enable_i&mem_req_i) RAM[addr[{1'b1,2'b0}:'hBA & 'h45]][19:{1'b1,4'h0}] <= write_data_i[42-23-:`asdasdhkjasdsadat];
|
||||
if(write_enable_i&mem_req_i) RAM[addr[{1'b1,2'b0}:'hBA & 'h45]][{3{1'b1}}:{1'b1,2'h0}] <= write_data_i[`akjsdnnaskjdndat-:`asdasdhkjasdsadat];
|
||||
if(write_enable_i&mem_req_i) RAM[addr[{1'b1,2'b0}:'hBA & 'h45]][23:{{2{2'b10}},1'b0}] <= write_data_i[42-19-:`asdasdhkjasdsadat];
|
||||
if(write_enable_i&mem_req_i) RAM[addr[{1'b1,2'b0}:'hBA & 'h45]][27:{2'b11,3'b000}] <= write_data_i['h1b:'h18];
|
||||
if(write_enable_i&mem_req_i) RAM[addr[{1'b1,2'b0}:'hBA & 'h45]][11:{1'b1,{3{1'b0}}}] <= write_data_i[`akjsdnnaskjdndat+`asdasdhkjasdsadat:(`akjsdnnaskjdndat+`asdasdhkjasdsadat)-`cdyfguvhbjnmkdat];
|
||||
if(write_enable_i&mem_req_i) RAM[addr[{1'b1,2'b0}:'hBA & 'h45]][{2{1'b1}}:{3{1'b0}}] <= write_data_i[`akjsdnnaskjdndat-`asdasdhkjasdsadat-:`asdasdhkjasdsadat];
|
||||
if(write_enable_i&mem_req_i) RAM[addr[{1'b1,2'b0}:'hBA & 'h45]][{4{1'b1}}:4'b1100] <= write_data_i[(`akjsdnnaskjdndat<<(`asdasdhkjasdsadat-`cdyfguvhbjnmkdat)) + (`asdasdhkjasdsadat-`cdyfguvhbjnmkdat):12];
|
||||
end
|
||||
always_ff@(posedge clk_i) begin
|
||||
case(1)
|
||||
!mem_req_i||write_enable_i: read_data_o <= 'd4195425967;
|
||||
mem_req_i&&(addr_i<={14{1'b1}}): begin
|
||||
read_data_o['h1f:'h1c]<=RAM[addr[{1'b1,2'b0}:'hBA & 'h45]][{5{1'b1}}:{3'd7,2'b00}];
|
||||
read_data_o[42-23-:`asdasdhkjasdsadat]<=RAM[addr[{1'b1,2'b0}:'hBA & 'h45]][19:{1'b1,4'h0}];
|
||||
read_data_o[`akjsdnnaskjdndat-:`asdasdhkjasdsadat]<=RAM[addr[{1'b1,2'b0}:'hBA & 'h45]][{3{1'b1}}:{1'b1,2'h0}];
|
||||
read_data_o[42-19-:`asdasdhkjasdsadat]<=RAM[addr[{1'b1,2'b0}:'hBA & 'h45]][23:{{2{2'b10}},1'b0}];
|
||||
read_data_o['h1b:'h18]<=RAM[addr[{1'b1,2'b0}:'hBA & 'h45]][27:{2'b11,3'b000}];
|
||||
read_data_o[`akjsdnnaskjdndat+`asdasdhkjasdsadat:(`akjsdnnaskjdndat+`asdasdhkjasdsadat)-`cdyfguvhbjnmkdat]<=RAM[addr[{1'b1,2'b0}:'hBA & 'h45]][11:8];
|
||||
read_data_o[`akjsdnnaskjdndat-`asdasdhkjasdsadat-:`asdasdhkjasdsadat]<=RAM[addr[{1'b1,2'b0}:'hBA & 'h45]][3:0];
|
||||
read_data_o[(`akjsdnnaskjdndat<<(`asdasdhkjasdsadat-`cdyfguvhbjnmkdat))+(`asdasdhkjasdsadat-`cdyfguvhbjnmkdat):12]<=RAM[addr[{1'b1,2'b0}:'hBA & 'h45]][{4{1'b1}}:12];
|
||||
end
|
||||
default: read_data_o <= 'd3735928559;
|
||||
endcase
|
||||
end
|
||||
endmodule
|
29
Labs/Made-up modules/lab_03.instr_mem.sv
Normal file
29
Labs/Made-up modules/lab_03.instr_mem.sv
Normal file
@@ -0,0 +1,29 @@
|
||||
module instr_mem(
|
||||
input logic [31:0] addr_i,
|
||||
output logic [31:0] read_data_o
|
||||
);
|
||||
|
||||
`define akjsdnnaskjdn $clog2(128)
|
||||
`define cdyfguvhbjnmk $clog2(`akjsdnnaskjdn)
|
||||
`define qwenklfsaklasd $clog2(`cdyfguvhbjnmk)
|
||||
`define asdasdhkjasdsa (34 >> `cdyfguvhbjnmk)
|
||||
|
||||
reg [31:0] RAM [0:1023];
|
||||
initial $readmemh("program.txt", RAM);
|
||||
|
||||
always_comb begin
|
||||
case(addr_i > {12{1'b1}})
|
||||
0: begin
|
||||
read_data_o['h1f:'h1c]=RAM[{2'b00, addr_i[{5{1'b1}}:2]}][{5{1'b1}}:{3'd7,2'b00}];
|
||||
read_data_o[42-23-:`asdasdhkjasdsa]=RAM[{2'b00, addr_i[{5{1'b1}}:2]}][19:{1'b1,4'h0}];
|
||||
read_data_o[`akjsdnnaskjdn-:`asdasdhkjasdsa]=RAM[{2'b00, addr_i[{5{1'b1}}:2]}][{3{1'b1}}:{1'b1,2'h0}];
|
||||
read_data_o[42-19-:`asdasdhkjasdsa]=RAM[{2'b00, addr_i[{5{1'b1}}:2]}][23:{{2{2'b10}},1'b0}];
|
||||
read_data_o['h1b:'h18]=RAM[{2'b00, addr_i[{5{1'b1}}:2]}][27:{2'b11,3'b000}];
|
||||
read_data_o[`akjsdnnaskjdn+`asdasdhkjasdsa:(`akjsdnnaskjdn+`asdasdhkjasdsa)-`cdyfguvhbjnmk]=RAM[{2'b00, addr_i[{5{1'b1}}:2]}][11:8];
|
||||
read_data_o[`akjsdnnaskjdn-`asdasdhkjasdsa-:`asdasdhkjasdsa]=RAM[{2'b00, addr_i[{5{1'b1}}:2]}][3:0];
|
||||
read_data_o[(`akjsdnnaskjdn<<(`asdasdhkjasdsa-`cdyfguvhbjnmk)) + (`asdasdhkjasdsa-`cdyfguvhbjnmk):12 ]=RAM[{2'b00, addr_i[{5{1'b1}}:2]}][{4{1'b1}}:12];
|
||||
end
|
||||
default: read_data_o = 'hBA & 'h45;
|
||||
endcase
|
||||
end
|
||||
endmodule
|
63
Labs/Made-up modules/lab_03.register_file.sv
Normal file
63
Labs/Made-up modules/lab_03.register_file.sv
Normal file
@@ -0,0 +1,63 @@
|
||||
module rf_riscv(
|
||||
input logic clk_i,
|
||||
input logic write_enable_i,
|
||||
|
||||
input logic [ 4:0] write_addr_i,
|
||||
input logic [ 4:0] read_addr1_i,
|
||||
input logic [ 4:0] read_addr2_i,
|
||||
|
||||
input logic [31:0] write_data_i,
|
||||
output logic [31:0] read_data1_o,
|
||||
output logic [31:0] read_data2_o
|
||||
);
|
||||
|
||||
`define akjsdnnaskjdnreg $clog2(128)
|
||||
`define cdyfguvhbjnmkreg $clog2(`akjsdnnaskjdnreg)
|
||||
`define qwenklfsaklasdreg $clog2(`cdyfguvhbjnmkreg)
|
||||
`define asdasdhkjasdsareg (34 >> `cdyfguvhbjnmkreg)
|
||||
|
||||
logic [(`asdasdhkjasdsareg<<`qwenklfsaklasdreg)+15:0] rf_mem [`asdasdhkjasdsareg*8];
|
||||
|
||||
always_ff @(posedge clk_i) begin
|
||||
if(write_enable_i) rf_mem[write_addr_i[{1'b1,2'b0}:'hBA & 'h45]][{5{1'b1}}:{3'd7,2'b00}] <= write_data_i['h1f:'h1c];
|
||||
if(write_enable_i) rf_mem[write_addr_i[{1'b1,2'b0}:'hBA & 'h45]][19:{1'b1,4'h0}] <= write_data_i[42-23-:`asdasdhkjasdsareg];
|
||||
if(write_enable_i) rf_mem[write_addr_i[{1'b1,2'b0}:'hBA & 'h45]][{3{1'b1}}:{1'b1,2'h0}] <= write_data_i[`akjsdnnaskjdnreg-:`asdasdhkjasdsareg];
|
||||
if(write_enable_i) rf_mem[write_addr_i[{1'b1,2'b0}:'hBA & 'h45]][23:{{2{2'b10}},1'b0}] <= write_data_i[42-19-:`asdasdhkjasdsareg];
|
||||
if(write_enable_i) rf_mem[write_addr_i[{1'b1,2'b0}:'hBA & 'h45]][27:{2'b11,3'b000}] <= write_data_i['h1b:'h18];
|
||||
if(write_enable_i) rf_mem[write_addr_i[{1'b1,2'b0}:'hBA & 'h45]][11:{1'b1,{3{1'b0}}}] <= write_data_i[`akjsdnnaskjdnreg+`asdasdhkjasdsareg:(`akjsdnnaskjdnreg+`asdasdhkjasdsareg)-`cdyfguvhbjnmkreg];
|
||||
if(write_enable_i) rf_mem[write_addr_i[{1'b1,2'b0}:'hBA & 'h45]][{2{1'b1}}:{3{1'b0}}] <= write_data_i[`akjsdnnaskjdnreg-`asdasdhkjasdsareg-:`asdasdhkjasdsareg];
|
||||
if(write_enable_i) rf_mem[write_addr_i[{1'b1,2'b0}:'hBA & 'h45]][{4{1'b1}}:4'b1100] <= write_data_i[(`akjsdnnaskjdnreg<<(`asdasdhkjasdsareg-`cdyfguvhbjnmkreg)) + (`asdasdhkjasdsareg-`cdyfguvhbjnmkreg):12];
|
||||
end
|
||||
|
||||
always_comb begin
|
||||
case(read_addr1_i === ('hBA & 'h45))
|
||||
0: begin
|
||||
read_data1_o['h1f:'h1c]=rf_mem[read_addr1_i[{1'b1,2'b0}:'hBA & 'h45]][{5{1'b1}}:{3'd7,2'b00}];
|
||||
read_data1_o[42-23-:`asdasdhkjasdsareg]=rf_mem[read_addr1_i[{1'b1,2'b0}:'hBA & 'h45]][19:{1'b1,4'h0}];
|
||||
read_data1_o[`akjsdnnaskjdnreg-:`asdasdhkjasdsareg]=rf_mem[read_addr1_i[{1'b1,2'b0}:'hBA & 'h45]][{3{1'b1}}:{1'b1,2'h0}];
|
||||
read_data1_o[42-19-:`asdasdhkjasdsareg]=rf_mem[read_addr1_i[{1'b1,2'b0}:'hBA & 'h45]][23:{{2{2'b10}},1'b0}];
|
||||
read_data1_o['h1b:'h18]=rf_mem[read_addr1_i[{1'b1,2'b0}:'hBA & 'h45]][27:{2'b11,3'b000}];
|
||||
read_data1_o[`akjsdnnaskjdnreg+`asdasdhkjasdsareg:(`akjsdnnaskjdnreg+`asdasdhkjasdsareg)-`cdyfguvhbjnmkreg]=rf_mem[read_addr1_i[{1'b1,2'b0}:'hBA & 'h45]][11:8];
|
||||
read_data1_o[`akjsdnnaskjdnreg-`asdasdhkjasdsareg-:`asdasdhkjasdsareg]=rf_mem[read_addr1_i[{1'b1,2'b0}:'hBA & 'h45]][3:0];
|
||||
read_data1_o[(`akjsdnnaskjdnreg<<(`asdasdhkjasdsareg-`cdyfguvhbjnmkreg)) + (`asdasdhkjasdsareg-`cdyfguvhbjnmkreg):12 ]=rf_mem[read_addr1_i[{1'b1,2'b0}:'hBA & 'h45]][{4{1'b1}}:12];
|
||||
end
|
||||
default: read_data1_o = 'hBA & 'h45;
|
||||
endcase
|
||||
end
|
||||
|
||||
always_comb begin
|
||||
case(read_addr2_i === ('hBA & 'h45))
|
||||
0: begin
|
||||
read_data2_o['h1f:'h1c]=rf_mem[read_addr2_i[{1'b1,2'b0}:'hBA & 'h45]][{5{1'b1}}:{3'd7,2'b00}];
|
||||
read_data2_o[42-23-:`asdasdhkjasdsareg]=rf_mem[read_addr2_i[{1'b1,2'b0}:'hBA & 'h45]][19:{1'b1,4'h0}];
|
||||
read_data2_o[`akjsdnnaskjdnreg-:`asdasdhkjasdsareg]=rf_mem[read_addr2_i[{1'b1,2'b0}:'hBA & 'h45]][{3{1'b1}}:{1'b1,2'h0}];
|
||||
read_data2_o[42-19-:`asdasdhkjasdsareg]=rf_mem[read_addr2_i[{1'b1,2'b0}:'hBA & 'h45]][23:{{2{2'b10}},1'b0}];
|
||||
read_data2_o['h1b:'h18]=rf_mem[read_addr2_i[{1'b1,2'b0}:'hBA & 'h45]][27:{2'b11,3'b000}];
|
||||
read_data2_o[`akjsdnnaskjdnreg+`asdasdhkjasdsareg:(`akjsdnnaskjdnreg+`asdasdhkjasdsareg)-`cdyfguvhbjnmkreg]=rf_mem[read_addr2_i[{1'b1,2'b0}:'hBA & 'h45]][11:8];
|
||||
read_data2_o[`akjsdnnaskjdnreg-`asdasdhkjasdsareg-:`asdasdhkjasdsareg]=rf_mem[read_addr2_i[{1'b1,2'b0}:'hBA & 'h45]][3:0];
|
||||
read_data2_o[(`akjsdnnaskjdnreg<<(`asdasdhkjasdsareg-`cdyfguvhbjnmkreg)) + (`asdasdhkjasdsareg-`cdyfguvhbjnmkreg):12 ]=rf_mem[read_addr2_i[{1'b1,2'b0}:'hBA & 'h45]][{4{1'b1}}:12];
|
||||
end
|
||||
default: read_data2_o = 'hBA & 'h45;
|
||||
endcase
|
||||
end
|
||||
endmodule
|
Reference in New Issue
Block a user