1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| module pipeline_cpu(clock,reset); input clock,reset; wire [31:0] pc; wire [31:0] npc; wire [4:0] num_write,n1_num_write,n2_num_write,n3_num_write; wire [31:0] data_write; wire [31:0] instruction,n_instruction;
wire [3:0] aluop,n_aluop; wire extop; wire regwrite, n1_regwrite,n2_regwrite,n3_regwrite; wire s_b, n_s_b; wire mem_write, n1_mem_write, n2_mem_write; wire s_num_write,n_s_num_write; wire s_data_write, n1_s_data_write, n2_s_data_write, n3_s_data_write; wire [15:0] imm; wire [31:0] ext_imm,n_ext_imm; wire [4:0] rs,rt,rd,n_rs,n_rt,n_rd; wire [31:0] a, n_a,f_a, b,f_b,n1_b,n2_b, n1_c, n2_c, c, bb, n_data_out, data_out; wire [1:0] forwardA,forwardB; assign npc = pc + 4; wire pc_write,if_id_write,id_exe_flash;
pc PC(.pc(pc),.clock(clock),.reset(reset),.npc(npc),.pc_write(pc_write)); im IM(.instruction(n_instruction),.pc(pc)); if_id IF_ID(.instruction(instruction),.clock(clock),.reset(reset),.n_instruction(n_instruction),.if_id_write(if_id_write));
assign n_rs = instruction[25:21]; assign n_rt = instruction[20:16]; assign n_rd = instruction[15:11]; assign imm = instruction[15:0];
ctrl CTRL(.op(instruction[31:26]),.funct(instruction[5:0]),.reg_write(n1_regwrite),.aluop(n_aluop), .s_ext(extop),.mem_write(n1_mem_write),.s_data_write(n1_s_data_write),.s_b(n_s_b),.s_num_write(n_s_num_write));
ext EXT(.immediate(imm),.extop(extop),.extimmediate(n_ext_imm)); gpr GPR(.a(n_a),.b(n1_b),.clock(clock),.reg_write(regwrite),.num_write(num_write),.rs(n_rs),.rt(n_rt), .data_write(data_write)); id_exe ID_EXE(.n_b(n1_b),.b(n2_b),.n_a(n_a),.a(a),.ext_imm(ext_imm),.n_ext_imm(n_ext_imm),.n_aluop(n_aluop), .aluop(aluop),.n_s_b(n_s_b),.s_b(s_b),.n_rd(n_rd),.rd(rd),.n_s_num_write(n_s_num_write), .s_num_write(s_num_write),.n_mem_write(n1_mem_write),.mem_write(n2_mem_write), .n_s_data_write(n1_s_data_write),.s_data_write(n2_s_data_write),.n_regwrite(n1_regwrite), .regwrite(n2_regwrite), .n_rs(n_rs),.n_rt(n_rt),.rs(rs),.rt(rt),.id_exe_flash(id_exe_flash), .clock(clock),.reset(reset));
assign n2_num_write = s_num_write ? rt : rd; stall STALL(.pc_write(pc_write),.if_id_write(if_id_write),.id_exe_flash(id_exe_flash),.mem_read(n2_s_data_write), .rt_f(rt),.rt(n_rt),.rs(n_rs)); bypass BYPASS(.forwardA(forwardA),.forwardB(forwardB),.rs(rs),.rt(rt),.num_write_1(n3_num_write), .num_write_2(num_write),.regwrite_1(n3_regwrite),.regwrite_2(regwrite));
mux3 MUX_A(.out(f_a),.data1(a),.data2(data_write),.data3(n2_c),.s_flag(forwardA)); mux3 MUX_B(.out(f_b),.data1(n2_b),.data2(data_write),.data3(n2_c),.s_flag(forwardB)); mux2 MUX_BB(.out(bb),.data1(ext_imm),.data2(f_b),.s_flag(s_b)); alu ALU(.c(n1_c),.a(f_a),.b(bb),.aluop(aluop)); exe_mem EXE_MEM(.n_c(n1_c), .n_b(f_b),.n_num_write(n2_num_write), .n_mem_write(n2_mem_write), .n_s_data_write(n2_s_data_write), .c(n2_c), .b(b), .num_write(n3_num_write), .mem_write(mem_write), .s_data_write(n3_s_data_write),.n_regwrite(n2_regwrite), .regwrite(n3_regwrite), .clock(clock),.reset(reset));
wire [31:0] data_in;
dm DM(.data_out(n_data_out),.clock(clock),.mem_write(mem_write),.address(n2_c),.data_in(b)); mem_wb MEM_WB(.n_c(n2_c), .c(c), .n_data_out(n_data_out), .data_out(data_out), .n_s_data_write(n3_s_data_write), .s_data_write(s_data_write), .n_num_write(n3_num_write),.num_write(num_write),.n_regwrite(n3_regwrite),.regwrite(regwrite),.clock(clock),.reset(reset));
mux2 MUX_DATA_WRITE(.out(data_write),.data1(data_out),.data2(c),.s_flag(s_data_write));
endmodule
|