Rework: separate each step of the pipeline in a different component

This commit is contained in:
BOISSON Brice
2023-12-04 11:34:39 +09:00
committed by GitHub
parent ffa137da41
commit ca6398d1e1
8 changed files with 179 additions and 115 deletions

22
rtl/module_alu.v Normal file
View File

@@ -0,0 +1,22 @@
module module_alu (input src,
input [3:0] func,
input [31:0] reg_in_a, reg_in_b, imm,
output [31:0] out);
wire [31:0] in_b;
mux2_1 mux2_in_b (
.in_1(reg_in_b),
.in_2(imm),
.sel(src),
.out(in_b)
);
alu alu (
.in_a(reg_in_a),
.in_b(in_b),
.func(func),
.out(out)
);
endmodule

View File

@@ -0,0 +1,35 @@
module module_program_counter (input clock, reset,
input is_jmp, alu_not,
input [1:0] is_branch,
input [31:0] alu_out, imm,
output [31:0] addr);
wire [1:0] sel_in;
wire [31:0] pc_addr, new_addr;
mux2_1 #(2) mux2_pc_sel_branch (
.in_1(is_branch),
.in_2({1'b0, (alu_not ? (alu_out == 32'b0 ? 1'b1 : 1'b0) : (alu_out != 32'b0 ? 1'b1 : 1'b0))}),
.sel(is_jmp),
.out(sel_in)
);
mux4_1 mux4_pc_sel_in (
.in_1(pc_addr + 4),
.in_2(pc_addr + imm),
.in_3(alu_out),
.in_4(0),
.sel(sel_in),
.out(new_addr)
);
program_counter program_counter (
.clock(clock),
.reset(reset),
.new_addr(new_addr),
.pc_addr(pc_addr)
);
assign addr = pc_addr;
endmodule

View File

@@ -0,0 +1,30 @@
module module_registers_bank (input clock, reset, we,
input [1:0] sel_data_in,
input [4:0] sel_in, sel_out_a, sel_out_b,
input [31:0] alu_out, mem_out, pc_addr,
output [31:0] data_out_a, data_out_b);
wire [31:0] data_in;
mux4_1 mux4_reg_sel_data_in (
.in_1(alu_out),
.in_2(mem_out),
.in_3(pc_addr + 4),
.in_4(pc_addr + alu_out),
.sel(sel_data_in),
.out(data_in)
);
registers_bank registers_bank (
.clock(clock),
.reset(reset),
.we(we),
.sel_in(sel_in),
.sel_out_a(sel_out_a),
.sel_out_b(sel_out_b),
.data_in(data_in),
.data_out_a(data_out_a),
.data_out_b(data_out_b)
);
endmodule

View File

@@ -1,12 +1,12 @@
module program_counter (input clock, reset,
input [31:0] pc_new_addr,
input [31:0] new_addr,
output reg [31:0] pc_addr);
always @ (posedge clock, posedge reset) begin
if (reset == 1'b1)
pc_addr <= 32'b0;
else
pc_addr <= pc_new_addr;
pc_addr <= new_addr;
end
endmodule

View File

@@ -8,11 +8,11 @@ module risc_v_cpu (input clock, reset,
wire reg_we;
wire [1:0] reg_sel_data_in;
wire [4:0] reg_sel_out_a, reg_sel_out_b, reg_sel_in;
wire [31:0] reg_data_out_a, reg_data_out_b, reg_data_in;
wire [31:0] reg_data_out_a, reg_data_out_b;
wire alu_src, alu_not;
wire [3:0] alu_func;
wire [31:0] alu_in_b, alu_out;
wire [31:0] alu_out;
wire mem_we;
wire [1:0] mem_func_in;
@@ -20,8 +20,8 @@ module risc_v_cpu (input clock, reset,
wire [31:0] mem_out;
wire pc_is_jmp;
wire [1:0] pc_is_branch, pc_sel_in;
wire [31:0] pc_addr, pc_new_addr;
wire [1:0] pc_is_branch;
wire [31:0] pc_addr;
decoder decoder (
.instruction(instruction),
@@ -41,53 +41,39 @@ module risc_v_cpu (input clock, reset,
.alu_not(alu_not)
);
registers_bank registers_bank (
module_registers_bank module_registers_bank (
.clock(clock),
.reset(reset),
.we(reg_we),
.sel_data_in(reg_sel_data_in),
.sel_in(reg_sel_in),
.sel_out_a(reg_sel_out_a),
.sel_out_b(reg_sel_out_b),
.data_in(reg_data_in),
.alu_out(alu_out),
.mem_out(mem_out),
.pc_addr(pc_addr),
.data_out_a(reg_data_out_a),
.data_out_b(reg_data_out_b)
);
mux2_1 mux2_alu_in_b (
.in_1(reg_data_out_b),
.in_2(imm),
.sel(alu_src),
.out(alu_in_b)
);
alu alu (
.in_a(reg_data_out_a),
.in_b(alu_in_b),
module_alu module_alu (
.src(alu_src),
.func(alu_func),
.reg_in_a(reg_data_out_a),
.reg_in_b(reg_data_out_b),
.imm(imm),
.out(alu_out)
);
mux2_1 #(2) mux2_pc_sel_branch (
.in_1(pc_is_branch),
.in_2({1'b0, (alu_not ? (alu_out == 32'b0 ? 1'b1 : 1'b0) : (alu_out != 32'b0 ? 1'b1 : 1'b0))}),
.sel(pc_is_jmp),
.out(pc_sel_in)
);
mux4_1 mux4_pc_sel_in (
.in_1(pc_addr + 4),
.in_2(pc_addr + imm),
.in_3(alu_out),
.in_4(0),
.sel(pc_sel_in),
.out(pc_new_addr)
);
program_counter program_counter (
module_program_counter module_program_counter (
.clock(clock),
.reset(reset),
.pc_new_addr(pc_new_addr),
.pc_addr(pc_addr)
.is_jmp(pc_is_jmp),
.is_branch(pc_is_branch),
.alu_not(alu_not),
.alu_out(alu_out),
.imm(imm),
.addr(pc_addr)
);
instruction uut_instruction (
@@ -106,13 +92,4 @@ module risc_v_cpu (input clock, reset,
.data_out(mem_out)
);
mux4_1 mux4_reg_sel_data_in (
.in_1(alu_out),
.in_2(mem_out),
.in_3(pc_addr + 4),
.in_4(pc_addr + alu_out),
.sel(reg_sel_data_in),
.out(reg_data_in)
);
endmodule