| //gpc改一下backend哈,参照着core_empty改 |
| `ifndef BACKEND_V |
| `define BACKEND_V |
| |
| `include "../params.vh" |
| |
| module backend ( |
| // global |
| input clk, |
| input rstn, |
| |
| //related to excp.v |
| input wfi_ctrl_in, //rcu里缺逻辑20220825 |
| input trapped, |
| input mret_ctrl, |
| output [PC_WIDTH - 1 : 0] csr_pc_o, |
| output commit_valid_o, |
| output mret_o, |
| output wfi_o, |
| output [EXCEPTION_CODE_WIDTH - 1 : 0] ecause_o, |
| output exception_valid_o, |
| |
| // decode |
| output rob_ready_out, // to decode |
| input valid_i, |
| input [3:0] ecause_i, |
| input exception_i, |
| input wfi_i, |
| input mret_i, |
| // rs valid |
| input uses_rs1_i, |
| input uses_rs2_i, |
| input uses_csr_i, |
| // rd valid |
| input uses_rd_i,// remaining input uses_rd, |
| //rob op |
| input [PC_WIDTH-1:0] pc_i, //PC_WIDTH = 32 |
| input [PC_WIDTH-1:0] next_pc_i, |
| input is_alu_i, //to choose which pipe of function unit |
| //alu |
| input [1:0] deco_alu_select_a_i, |
| input [1:0] deco_alu_select_b_i, |
| input [2:0] cmp_function_i, |
| input [IMM_LEN - 1:0] imm_data_i, |
| input half_i, |
| input is_fence_i, |
| input [2:0] alu_function_i, |
| input alu_function_modifier_i, |
| input branch_i, |
| input jump_i, |
| //lsu |
| input load_i, |
| input store_i, |
| input [1:0] load_store_size_i, |
| input load_signed_i, |
| // rs address |
| input [VIR_REG_ADDR_WIDTH - 1:0] rs1_address_i, |
| input [VIR_REG_ADDR_WIDTH - 1:0] rs2_address_i, |
| input [VIR_REG_ADDR_WIDTH - 1:0] rd_address_i, |
| // <decode> csr |
| input is_csr_i, |
| input [CSR_ADDR_LEN - 1:0] csr_address_i, |
| input [XLEN - 1:0] csr_data_i, |
| input csr_read_i, |
| input csr_write_i, |
| input csr_readable_i, |
| input csr_writeable_i, |
| |
| // related to csr.v |
| output csr_wb_valid_o, |
| output [CSR_ADDR_LEN - 1:0] csr_wb_addr_o, |
| output [XLEN - 1 : 0] csr_wb_data_o, |
| |
| // btb |
| output btb_valid_o, |
| output [VIRTUAL_ADDR_LEN - 1 : 0] btb_pc_o, |
| output [VIRTUAL_ADDR_LEN - 1 : 0] btb_next_pc_o, |
| // gshare |
| output gshare_pred_valid_o, |
| output gshare_pred_taken_o, |
| output [VIRTUAL_ADDR_LEN - 1 : 0] gshare_pred_pc_o, // 当前这条指令的pc |
| // pc_gen |
| output pc_valid_o, |
| output [VIRTUAL_ADDR_LEN - 1 : 0]pc_o, |
| // // instr_buff |
| // output instr_buff_nxt_pc_valid_o, |
| // output [VIRTUAL_ADDR_LEN - 1 : 0] instr_buff_nxt_pc_o, |
| // <> decode |
| output branch_done, |
| // <> dcache |
| output req_valid_o, |
| output req_opcode_o, // 0 for load, 1 for store |
| output req_sign_o, |
| // output [ROB_INDEX_WIDTH - 1 : 0] req_rob_index_o, |
| output [LSU_LSQ_SIZE_WIDTH - 1: 0] req_lsq_index_o, |
| output [1:0] req_size_o, |
| output [VIRTUAL_ADDR_LEN - 1 : 0] req_addr_o, |
| output [XLEN - 1 : 0] req_data_o, |
| input req_ready_i, |
| input resp_valid_i, |
| input [LSU_LSQ_SIZE_WIDTH - 1: 0] resp_lsq_index_i, |
| input [XLEN - 1 : 0]resp_data_i, |
| output resp_ready_o, |
| |
| |
| output wb_cyc_o, |
| output wb_stb_o, |
| output wb_we_o, |
| output [VIRTUAL_ADDR_LEN - 1 : 0] wb_adr_o, |
| output [WB_DATA_LEN-1:0] wb_dat_o, |
| output [WB_DATA_LEN/8-1:0] wb_sel_o, |
| input wb_ack_i, |
| input [WB_DATA_LEN -1:0] wb_dat_i |
| |
| ); |
| // wire func_wrb_valid; //may both alu and lsu finish their work and write back simultanously |
| // wire [63:0] func_wrb_rd_data; |
| // wire [PHY_REG_ADDR_WIDTH-1:0] func_wrb_rd_address; |
| // wire [ROB_INDEX_WIDTH-1:0] func_wrb_rob_line; |
| |
| /*verilator lint_off UNUSED */ |
| wire func_load_store_ready; |
| wire func_alu_ready; |
| |
| wire [67:0] iss_rob_op_basic; |
| wire [4:0] iss_rob_op_lsu; |
| wire [44:0] iss_rob_op_alu; |
| wire [79:0] iss_rob_op_csr; |
| wire [3:0] iss_rob_op_bran_exp; |
| wire rob_iss_valid; |
| wire [ROB_INDEX_WIDTH - 1 : 0] iss_rob_line; |
| wire [63:0] phyreg_rs1_data_out; |
| wire [63:0] phyreg_rs2_data_out; |
| |
| wire [PHY_REG_ADDR_WIDTH - 1 : 0] prd_address_out; |
| |
| // lsu => rob |
| wire lsu_ready_o; |
| wire lsu_done_o; |
| wire [ROB_INDEX_WIDTH-1:0] lsu_wb_rob_index_o; |
| wire lsu_exception_valid_o; |
| wire alu_exception_valid_o; |
| wire [EXCEPTION_CODE_WIDTH - 1 : 0] lsu_ecause_o; |
| wire [EXCEPTION_CODE_WIDTH - 1 : 0] alu_ecause_o; |
| // lsu => prf |
| wire lsu_wb_valid_o; |
| wire [PHY_REG_ADDR_WIDTH-1:0] lsu_wb_rd_addr_o; |
| wire [XLEN - 1 : 0] lsu_wb_data_o; |
| // lsu/alu => rob/prf |
| wire alu_ready_o; |
| wire alu_done_o; |
| wire [ROB_INDEX_WIDTH-1:0] alu_wb_rob_index_o; |
| wire alu_wb_valid_o; |
| wire [PHY_REG_ADDR_WIDTH-1:0] alu_wb_rd_addr_o; |
| wire [XLEN - 1 : 0] alu_wb_data_o; |
| |
| wire uses_rs1; |
| wire uses_rs2; |
| wire uses_csr; |
| wire uses_rd;// remaining wire uses_rd, |
| wire [PC_WIDTH-1:0] pc_in; |
| wire [PC_WIDTH-1:0] next_pc_in; |
| wire is_alu; //to choose which pipe of function unit |
| wire [1:0] deco_alu_select_a_in; |
| wire [1:0] deco_alu_select_b_in; |
| wire [2:0] cmp_function_in; |
| wire [31:0] imm_data_in; |
| wire half; |
| wire [2:0] alu_function_in; |
| wire alu_function_modifier_in; |
| wire branch_in; |
| wire jump_in; |
| wire load_in; |
| wire store_in; |
| wire [1:0] load_store_size_in; |
| wire load_signed_in; |
| wire [4:0] rs1_address; |
| wire [4:0] rs2_address; |
| wire [4:0] rd_address; |
| wire [11:0] csr_address_in; |
| wire [63:0] csr_data_in; |
| wire csr_read_in; |
| wire csr_write_in; |
| wire csr_readable_in; |
| wire csr_writeable_in; |
| wire [3:0] ecause_in; |
| wire exception_in; |
| wire wfi_in; |
| wire mret_in; |
| |
| assign {pc_in, next_pc_in, uses_rs1, uses_rs2, uses_rd, uses_csr} = iss_rob_op_basic; |
| assign {load_in, store_in, load_store_size_in, load_signed_in} = iss_rob_op_lsu; |
| assign {imm_data_in, is_alu, deco_alu_select_a_in, deco_alu_select_b_in, cmp_function_in, |
| alu_function_in, alu_function_modifier_in, half} = iss_rob_op_alu; |
| assign {csr_data_in, csr_address_in, csr_read_in, csr_write_in, |
| csr_readable_in, csr_writeable_in} = iss_rob_op_csr; |
| assign {branch_in, jump_in, wfi_in, mret_in} = iss_rob_op_bran_exp; |
| |
| rcu backend_rcu( |
| //input |
| .clk(clk), |
| .reset(rstn), |
| .wfi_ctrl_in(wfi_ctrl_in), |
| .trapped(trapped), |
| .mret_ctrl(mret_ctrl), |
| //from decode |
| .valid_in(valid_i), |
| .ecause_in(ecause_i), |
| .exception_in(exception_i), |
| // rs valid |
| .uses_rs1(uses_rs1_i), |
| .uses_rs2(uses_rs2_i), |
| .uses_csr(uses_csr_i), |
| // rd valid |
| .uses_rd(uses_rd_i),// remaining input uses_rd, |
| //rob op |
| .pc_in(pc_i), |
| .next_pc_in(next_pc_i), |
| .is_alu(is_alu_i), //to choose which pipe of function unit |
| //alu |
| .deco_alu_select_a_in(deco_alu_select_a_i), |
| .deco_alu_select_b_in(deco_alu_select_b_i), |
| .cmp_function_in(cmp_function_i), |
| .imm_data_in(imm_data_i), |
| .half(half_i), |
| .is_fence(is_fence_i), |
| //input [63:0] csr_data_in, |
| .alu_function_in(alu_function_i), |
| .alu_function_modifier_in(alu_function_modifier_i), |
| .branch_in(branch_i), |
| .jump_in(jump_i), |
| //lsu |
| .load_in(load_i), |
| .store_in(store_i), |
| .load_store_size_in(load_store_size_i), |
| .load_signed_in(load_signed_i), |
| // rs address |
| .rs1_address_in(rs1_address_i), |
| .rs2_address_in(rs2_address_i), |
| .rd_address_in(rd_address_i), |
| // to csr |
| .csr_address_in(csr_address_i), |
| .csr_data_in(csr_data_i), |
| .csr_read_in(csr_read_i), |
| .csr_write_in(csr_write_i), |
| .csr_readable_in(csr_readable_i), |
| .csr_writeable_in(csr_writeable_i), |
| |
| .wfi_in(wfi_i), |
| .mret_in(mret_i), |
| //from FU |
| //function unit finish signal |
| .func_wrb_alu_done(alu_done_o), |
| .func_wrb_lsu_done(lsu_done_o), |
| .func_wrb_valid_alu(alu_wb_valid_o), //may both alu and lsu finish their work and write back simultanously |
| .func_wrb_valid_lsu(lsu_wb_valid_o), |
| .func_wrb_rd_data_alu(alu_wb_data_o), |
| .func_wrb_rd_data_lsu(lsu_wb_data_o), |
| .func_wrb_rd_address_lsu(lsu_wb_rd_addr_o), |
| .func_wrb_rd_address_alu(alu_wb_rd_addr_o), |
| .func_wrb_rob_line_alu(alu_wb_rob_index_o), |
| .func_wrb_rob_line_lsu(lsu_wb_rob_index_o), |
| .func_wrb_rob_alu_exp(alu_exception_valid_o), //exception hanlder |
| .func_wrb_rob_lsu_exp(lsu_exception_valid_o), |
| .func_wrb_rob_alu_ecause(alu_ecause_o), |
| .func_wrb_rob_lsu_ecause(lsu_ecause_o), |
| .func_load_store_ready(lsu_ready_o), |
| .func_alu_ready(alu_ready_o), |
| //output |
| //to decode for handshake |
| .rob_ready_out(rob_ready_out), |
| //output |
| //when issue |
| .iss_rob_op_basic(iss_rob_op_basic), |
| .iss_rob_op_lsu(iss_rob_op_lsu), |
| .iss_rob_op_alu(iss_rob_op_alu), |
| .iss_rob_op_csr(iss_rob_op_csr), |
| .iss_rob_op_bran_exp(iss_rob_op_bran_exp), |
| .rob_iss_valid(rob_iss_valid), |
| .iss_rob_line(iss_rob_line), |
| //to FU |
| .phyreg_rs1_data_out(phyreg_rs1_data_out), |
| .phyreg_rs2_data_out(phyreg_rs2_data_out), |
| .prd_address_out(prd_address_out), |
| //for exception |
| .rob_commit_valid(commit_valid_o), |
| .rob_cm_mret(mret_o), |
| .rob_cm_wfi(wfi_o), |
| .rob_cm_exp(exception_valid_o), |
| .rob_cm_ecause(ecause_o), |
| .rob_cm_exp_pc(csr_pc_o) |
| ); |
| |
| new_fu backend_new_fu( |
| // global |
| .clk(clk), |
| .rstn(rstn), |
| .stall(wfi_ctrl_in), |
| .flush(trapped), |
| |
| // <> RCU |
| .rs1_data_i(phyreg_rs1_data_out), |
| .rs2_data_i(phyreg_rs2_data_out), |
| .rob_index_i(iss_rob_line), |
| .rd_addr_i(prd_address_out), |
| .branch_i(branch_in), // if branch or jump, set 1 |
| .jump_i(jump_in), // if jump, set 1 |
| .issue_valid_i(rob_iss_valid), |
| // alu & cmp |
| .is_alu_i(is_alu), |
| // .is_cmp_i, //no need because cmp_out is used by branch instr |
| .half_i(half), |
| .pc_i(pc_in), |
| .next_pc_i(next_pc_in), // for jal to wb |
| .alu_select_a_i(deco_alu_select_a_in), |
| .alu_select_b_i(deco_alu_select_b_in), |
| .imm_data_i(imm_data_in), |
| .alu_function_i(alu_function_in), |
| .cmp_function_i(cmp_function_in), |
| .alu_function_modifier_i(alu_function_modifier_in), |
| // csr |
| .is_csr_i(is_csr_i), |
| .csr_address_i(csr_address_in), |
| .csr_data_i(csr_data_in), |
| .csr_read_i(csr_read_in), |
| .csr_write_i(csr_write_in), |
| .csr_readable_i(csr_readable_in), |
| .csr_writeable_i(csr_writeable_in), |
| .csr_wb_valid_o(csr_wb_valid_o), |
| .csr_wb_addr_o(csr_wb_addr_o), |
| .csr_wb_data_o(csr_wb_data_o), |
| // lsu |
| .load_i(load_in), |
| .store_i(store_in), |
| .load_store_size_i(load_store_size_in), |
| .load_signed_i(load_signed_in), |
| .is_load_store_i(load_in | store_in), //FIXME: redundance |
| // lsu => rob |
| .lsu_ready_o(lsu_ready_o), |
| .lsu_done_o(lsu_done_o), |
| .lsu_wb_rob_index_o(lsu_wb_rob_index_o), |
| .lsu_exception_valid_o(lsu_exception_valid_o), |
| .lsu_ecause_o(lsu_ecause_o), |
| .lsu_wb_valid_o(lsu_wb_valid_o), |
| .lsu_wb_rd_addr_o(lsu_wb_rd_addr_o), |
| .lsu_wb_data_o(lsu_wb_data_o), |
| // alu => rob/prf |
| .alu_ready_o(alu_ready_o), |
| .alu_done_o(alu_done_o), |
| .alu_wb_rob_index_o(alu_wb_rob_index_o), |
| .alu_wb_valid_o(alu_wb_valid_o), |
| .alu_wb_rd_addr_o(alu_wb_rd_addr_o), |
| .alu_wb_data_o(alu_wb_data_o), |
| .alu_exception_valid_o(alu_exception_valid_o), |
| .alu_ecause_o(alu_ecause_o), |
| |
| // <> btb |
| .btb_valid_o(btb_valid_o), |
| .btb_pc_o(btb_pc_o), |
| .btb_next_pc_o(btb_next_pc_o), |
| |
| // <> gshare |
| .gshare_pred_valid_o(gshare_pred_valid_o), |
| .gshare_pred_taken_o(gshare_pred_taken_o), |
| .gshare_pred_pc_o(gshare_pred_pc_o), |
| |
| // <> pc_gen |
| .pc_valid_o(pc_valid_o), |
| .pc_o(pc_o), |
| |
| // // <> instr_buff |
| // .instr_buff_nxt_pc_valid_o(instr_buff_nxt_pc_valid_o), |
| // .instr_buff_nxt_pc_o(instr_buff_nxt_pc_o), |
| |
| // decode |
| .branch_done(branch_done), |
| |
| |
| // <> dcache |
| .req_valid_o(req_valid_o), |
| .req_opcode_o(req_opcode_o), // 0 for load, 1 for store |
| .req_size_o(req_size_o), |
| .req_sign_o(req_sign_o), |
| .req_addr_o(req_addr_o), |
| // .req_rob_index_o(req_rob_index_o), |
| .req_lsq_index_o(req_lsq_index_o), |
| .req_data_o(req_data_o), |
| .req_ready_i(req_ready_i), |
| .resp_valid_i(resp_valid_i), |
| .resp_lsq_index_i(resp_lsq_index_i), |
| .resp_data_i(resp_data_i), |
| .resp_ready_o(resp_ready_o), |
| |
| // <> bus |
| .wb_cyc_o(wb_cyc_o), |
| .wb_stb_o(wb_stb_o), |
| .wb_we_o(wb_we_o), |
| .wb_adr_o(wb_adr_o), |
| .wb_dat_o(wb_dat_o), |
| .wb_sel_o(wb_sel_o), |
| .wb_ack_i(wb_ack_i), |
| .wb_dat_i(wb_dat_i) |
| ); |
| |
| endmodule |
| /*verilator lint_on UNUSED */ |
| `endif // BACKEND_V |