|
| 1 | +package treecorel3 |
| 2 | + |
| 3 | +import chisel._ |
| 4 | +import chisel.uitl._ |
| 5 | + |
| 6 | +object Control { |
| 7 | + val Y = true.B |
| 8 | + val F = false.B |
| 9 | + |
| 10 | + val PCTypeLen = 2 |
| 11 | + val PC_0 = 0.U(PCTypeLen.W) |
| 12 | + val PC_4 = 1.U(PCTypeLen.W) |
| 13 | + val PC_ALU = 2.U(PCTypeLen.W) |
| 14 | + val PC_EPC = 3.U(PCTypeLen.W) |
| 15 | + |
| 16 | + val OprandTypeLen = 1 |
| 17 | + val A_XXX = 0.U(OprandTypeLen.W) |
| 18 | + val A_PC = 1.U(OprandTypeLen.W) |
| 19 | + val A_RS1 = 2.U(OprandTypeLen.W) |
| 20 | + val B_XXX = 0.U(OprandTypeLen.W) |
| 21 | + val B_PC = 1.U(OprandTypeLen.W) |
| 22 | + val B_RS1 = 2.U(OprandTypeLen.W) |
| 23 | + |
| 24 | + val IMMTypeLen = 3 |
| 25 | + val IMM_X = 0.U(IMMTypeLen.W) |
| 26 | + val IMM_I = 1.U(IMMTypeLen.W) |
| 27 | + val IMM_S = 2.U(IMMTypeLen.W) |
| 28 | + val IMM_U = 3.U(IMMTypeLen.W) |
| 29 | + val IMM_J = 4.U(IMMTypeLen.W) |
| 30 | + val IMM_B = 5.U(IMMTypeLen.W) |
| 31 | + val IMM_Z = 6.U(IMMTypeLen.W) |
| 32 | + |
| 33 | + val BranchTypeLen = 3 |
| 34 | + val BR_XXX = 0.U(BranchTypeLen.W) |
| 35 | + val BR_LTU = 1.U(BranchTypeLen.W) |
| 36 | + val BR_LT = 2.U(BranchTypeLen.W) |
| 37 | + val BR_EQ = 3.U(BranchTypeLen.W) |
| 38 | + val BR_GEU = 4.U(BranchTypeLen.W) |
| 39 | + val BR_GE = 5.U(BranchTypeLen.W) |
| 40 | + val BR_NE = 6.U(BranchTypeLen.W) |
| 41 | + |
| 42 | + val StoreTypeLen = 2 |
| 43 | + val ST_XXX = 0.U(StoreTypeLen.W) |
| 44 | + val ST_SW = 1.U(StoreTypeLen.W) |
| 45 | + val ST_SH = 2.U(StoreTypeLen.W) |
| 46 | + val ST_SB = 3.U(StoreTypeLen.W) |
| 47 | + |
| 48 | + val LoadTypeLen = 3 |
| 49 | + val LD_XXX = 0.U(LoadTypeLen.W) |
| 50 | + val LD_LW = 1.U(LoadTypeLen.W) |
| 51 | + val LD_LH = 2.U(LoadTypeLen.W) |
| 52 | + val LD_LB = 3.U(LoadTypeLen.W) |
| 53 | + val LD_LHU = 4.U(LoadTypeLen.W) |
| 54 | + val LD_LBU = 5.U(LoadTypeLen.W) |
| 55 | + |
| 56 | + val WbTypeLen = 2 |
| 57 | + val WB_ALU = 0.U(WbTypeLen.W) |
| 58 | + val WB_MEM = 1.U(WbTypeLen.W) |
| 59 | + val WB_PC4 = 2.U(WbTypeLen.W) |
| 60 | + val WB_CSR = 3.U(WbTypeLen.W) |
| 61 | + |
| 62 | + // kill wb_en illegal? |
| 63 | + // pc_sel a_sel b_sel imm_sel alu_op br_type | st_type ld_type wb_sel | csr_cmd | |
| 64 | + // | | | | | | | | | | | | | |
| 65 | + val defRes = List(PC_4, A_XXX, B_XXX, IMM_X, ALU_XXX, BR_XXX, N, ST_XXX, LD_XXX, WB_ALU, N, CSR.N, Y) |
| 66 | + |
| 67 | + val map = Array( |
| 68 | + LUI -> List(PC_4, A_PC, B_IMM, IMM_U, ALU_COPY_B, BR_XXX, N, ST_XXX, LD_XXX, WB_ALU, Y, CSR.N, N), |
| 69 | + AUIPC -> List(PC_4, A_PC, B_IMM, IMM_U, ALU_ADD, BR_XXX, N, ST_XXX, LD_XXX, WB_ALU, Y, CSR.N, N), |
| 70 | + JAL -> List(PC_ALU, A_PC, B_IMM, IMM_J, ALU_ADD, BR_XXX, Y, ST_XXX, LD_XXX, WB_PC4, Y, CSR.N, N), |
| 71 | + JALR -> List(PC_ALU, A_RS1, B_IMM, IMM_I, ALU_ADD, BR_XXX, Y, ST_XXX, LD_XXX, WB_PC4, Y, CSR.N, N), |
| 72 | + BEQ -> List(PC_4, A_PC, B_IMM, IMM_B, ALU_ADD, BR_EQ, N, ST_XXX, LD_XXX, WB_ALU, N, CSR.N, N), |
| 73 | + BNE -> List(PC_4, A_PC, B_IMM, IMM_B, ALU_ADD, BR_NE, N, ST_XXX, LD_XXX, WB_ALU, N, CSR.N, N), |
| 74 | + BLT -> List(PC_4, A_PC, B_IMM, IMM_B, ALU_ADD, BR_LT, N, ST_XXX, LD_XXX, WB_ALU, N, CSR.N, N), |
| 75 | + BGE -> List(PC_4, A_PC, B_IMM, IMM_B, ALU_ADD, BR_GE, N, ST_XXX, LD_XXX, WB_ALU, N, CSR.N, N), |
| 76 | + BLTU -> List(PC_4, A_PC, B_IMM, IMM_B, ALU_ADD, BR_LTU, N, ST_XXX, LD_XXX, WB_ALU, N, CSR.N, N), |
| 77 | + BGEU -> List(PC_4, A_PC, B_IMM, IMM_B, ALU_ADD, BR_GEU, N, ST_XXX, LD_XXX, WB_ALU, N, CSR.N, N), |
| 78 | + LB -> List(PC_0, A_RS1, B_IMM, IMM_I, ALU_ADD, BR_XXX, Y, ST_XXX, LD_LB, WB_MEM, Y, CSR.N, N), |
| 79 | + LH -> List(PC_0, A_RS1, B_IMM, IMM_I, ALU_ADD, BR_XXX, Y, ST_XXX, LD_LH, WB_MEM, Y, CSR.N, N), |
| 80 | + LW -> List(PC_0, A_RS1, B_IMM, IMM_I, ALU_ADD, BR_XXX, Y, ST_XXX, LD_LW, WB_MEM, Y, CSR.N, N), |
| 81 | + LBU -> List(PC_0, A_RS1, B_IMM, IMM_I, ALU_ADD, BR_XXX, Y, ST_XXX, LD_LBU, WB_MEM, Y, CSR.N, N), |
| 82 | + LHU -> List(PC_0, A_RS1, B_IMM, IMM_I, ALU_ADD, BR_XXX, Y, ST_XXX, LD_LHU, WB_MEM, Y, CSR.N, N), |
| 83 | + SB -> List(PC_4, A_RS1, B_IMM, IMM_S, ALU_ADD, BR_XXX, N, ST_SB, LD_XXX, WB_ALU, N, CSR.N, N), |
| 84 | + SH -> List(PC_4, A_RS1, B_IMM, IMM_S, ALU_ADD, BR_XXX, N, ST_SH, LD_XXX, WB_ALU, N, CSR.N, N), |
| 85 | + SW -> List(PC_4, A_RS1, B_IMM, IMM_S, ALU_ADD, BR_XXX, N, ST_SW, LD_XXX, WB_ALU, N, CSR.N, N), |
| 86 | + ADDI -> List(PC_4, A_RS1, B_IMM, IMM_I, ALU_ADD, BR_XXX, N, ST_XXX, LD_XXX, WB_ALU, Y, CSR.N, N), |
| 87 | + SLTI -> List(PC_4, A_RS1, B_IMM, IMM_I, ALU_SLT, BR_XXX, N, ST_XXX, LD_XXX, WB_ALU, Y, CSR.N, N), |
| 88 | + SLTIU -> List(PC_4, A_RS1, B_IMM, IMM_I, ALU_SLTU, BR_XXX, N, ST_XXX, LD_XXX, WB_ALU, Y, CSR.N, N), |
| 89 | + XORI -> List(PC_4, A_RS1, B_IMM, IMM_I, ALU_XOR, BR_XXX, N, ST_XXX, LD_XXX, WB_ALU, Y, CSR.N, N), |
| 90 | + ORI -> List(PC_4, A_RS1, B_IMM, IMM_I, ALU_OR, BR_XXX, N, ST_XXX, LD_XXX, WB_ALU, Y, CSR.N, N), |
| 91 | + ANDI -> List(PC_4, A_RS1, B_IMM, IMM_I, ALU_AND, BR_XXX, N, ST_XXX, LD_XXX, WB_ALU, Y, CSR.N, N), |
| 92 | + SLLI -> List(PC_4, A_RS1, B_IMM, IMM_I, ALU_SLL, BR_XXX, N, ST_XXX, LD_XXX, WB_ALU, Y, CSR.N, N), |
| 93 | + SRLI -> List(PC_4, A_RS1, B_IMM, IMM_I, ALU_SRL, BR_XXX, N, ST_XXX, LD_XXX, WB_ALU, Y, CSR.N, N), |
| 94 | + SRAI -> List(PC_4, A_RS1, B_IMM, IMM_I, ALU_SRA, BR_XXX, N, ST_XXX, LD_XXX, WB_ALU, Y, CSR.N, N), |
| 95 | + ADD -> List(PC_4, A_RS1, B_RS2, IMM_X, ALU_ADD, BR_XXX, N, ST_XXX, LD_XXX, WB_ALU, Y, CSR.N, N), |
| 96 | + SUB -> List(PC_4, A_RS1, B_RS2, IMM_X, ALU_SUB, BR_XXX, N, ST_XXX, LD_XXX, WB_ALU, Y, CSR.N, N), |
| 97 | + SLL -> List(PC_4, A_RS1, B_RS2, IMM_X, ALU_SLL, BR_XXX, N, ST_XXX, LD_XXX, WB_ALU, Y, CSR.N, N), |
| 98 | + SLT -> List(PC_4, A_RS1, B_RS2, IMM_X, ALU_SLT, BR_XXX, N, ST_XXX, LD_XXX, WB_ALU, Y, CSR.N, N), |
| 99 | + SLTU -> List(PC_4, A_RS1, B_RS2, IMM_X, ALU_SLTU, BR_XXX, N, ST_XXX, LD_XXX, WB_ALU, Y, CSR.N, N), |
| 100 | + XOR -> List(PC_4, A_RS1, B_RS2, IMM_X, ALU_XOR, BR_XXX, N, ST_XXX, LD_XXX, WB_ALU, Y, CSR.N, N), |
| 101 | + SRL -> List(PC_4, A_RS1, B_RS2, IMM_X, ALU_SRL, BR_XXX, N, ST_XXX, LD_XXX, WB_ALU, Y, CSR.N, N), |
| 102 | + SRA -> List(PC_4, A_RS1, B_RS2, IMM_X, ALU_SRA, BR_XXX, N, ST_XXX, LD_XXX, WB_ALU, Y, CSR.N, N), |
| 103 | + OR -> List(PC_4, A_RS1, B_RS2, IMM_X, ALU_OR, BR_XXX, N, ST_XXX, LD_XXX, WB_ALU, Y, CSR.N, N), |
| 104 | + AND -> List(PC_4, A_RS1, B_RS2, IMM_X, ALU_AND, BR_XXX, N, ST_XXX, LD_XXX, WB_ALU, Y, CSR.N, N), |
| 105 | + FENCE -> List(PC_4, A_XXX, B_XXX, IMM_X, ALU_XXX, BR_XXX, N, ST_XXX, LD_XXX, WB_ALU, N, CSR.N, N), |
| 106 | + FENCEI -> List(PC_0, A_XXX, B_XXX, IMM_X, ALU_XXX, BR_XXX, Y, ST_XXX, LD_XXX, WB_ALU, N, CSR.N, N), |
| 107 | + CSRRW -> List(PC_0, A_RS1, B_XXX, IMM_X, ALU_COPY_A, BR_XXX, Y, ST_XXX, LD_XXX, WB_CSR, Y, CSR.W, N), |
| 108 | + CSRRS -> List(PC_0, A_RS1, B_XXX, IMM_X, ALU_COPY_A, BR_XXX, Y, ST_XXX, LD_XXX, WB_CSR, Y, CSR.S, N), |
| 109 | + CSRRC -> List(PC_0, A_RS1, B_XXX, IMM_X, ALU_COPY_A, BR_XXX, Y, ST_XXX, LD_XXX, WB_CSR, Y, CSR.C, N), |
| 110 | + CSRRWI -> List(PC_0, A_XXX, B_XXX, IMM_Z, ALU_XXX, BR_XXX, Y, ST_XXX, LD_XXX, WB_CSR, Y, CSR.W, N), |
| 111 | + CSRRSI -> List(PC_0, A_XXX, B_XXX, IMM_Z, ALU_XXX, BR_XXX, Y, ST_XXX, LD_XXX, WB_CSR, Y, CSR.S, N), |
| 112 | + CSRRCI -> List(PC_0, A_XXX, B_XXX, IMM_Z, ALU_XXX, BR_XXX, Y, ST_XXX, LD_XXX, WB_CSR, Y, CSR.C, N), |
| 113 | + ECALL -> List(PC_4, A_XXX, B_XXX, IMM_X, ALU_XXX, BR_XXX, N, ST_XXX, LD_XXX, WB_CSR, N, CSR.P, N), |
| 114 | + EBREAK -> List(PC_4, A_XXX, B_XXX, IMM_X, ALU_XXX, BR_XXX, N, ST_XXX, LD_XXX, WB_CSR, N, CSR.P, N), |
| 115 | + ERET -> List(PC_EPC, A_XXX, B_XXX, IMM_X, ALU_XXX, BR_XXX, Y, ST_XXX, LD_XXX, WB_CSR, N, CSR.P, N), |
| 116 | + WFI -> List(PC_4, A_XXX, B_XXX, IMM_X, ALU_XXX, BR_XXX, N, ST_XXX, LD_XXX, WB_ALU, N, CSR.N, N) |
| 117 | + ) |
| 118 | +} |
| 119 | + |
| 120 | +class ControlIO(implicit p: Parameters) extends Bundle { |
| 121 | + val inst = Input(UInt(xlen.W)) |
| 122 | + val pc_sel = Output(UInt(2.W)) |
| 123 | + val inst_kill = Output(Bool()) |
| 124 | + val a_sel = Output(UInt(1.W)) |
| 125 | + val b_sel = Output(UInt(1.W)) |
| 126 | + val imm_sel = Output(UInt(3.W)) |
| 127 | + val alu_op = Output(UInt(4.W)) |
| 128 | + val br_type = Output(UInt(3.W)) |
| 129 | + val st_type = Output(UInt(2.W)) |
| 130 | + val ld_type = Output(UInt(3.W)) |
| 131 | + val wb_sel = Output(UInt(2.W)) |
| 132 | + val wb_en = Output(Bool()) |
| 133 | + val csr_cmd = Output(UInt(3.W)) |
| 134 | + val illegal = Output(Bool()) |
| 135 | +} |
| 136 | + |
| 137 | +class Control(implicit p: Parameters) extends Module { |
| 138 | + val io = IO(new ControlIO) |
| 139 | + val decRes = ListLookup(io.inst, Control.defRes, Control.map) |
| 140 | + |
| 141 | + // Control signals for Fetch |
| 142 | + io.pc_sel := decRes(0) |
| 143 | + io.inst_kill := decRes(6) |
| 144 | + |
| 145 | + // Control signals for Execute |
| 146 | + io.a_sel := decRes(1) |
| 147 | + io.b_sel := decRes(2) |
| 148 | + io.imm_sel := decRes(3) |
| 149 | + io.alu_op := decRes(4) |
| 150 | + io.br_type := decRes(5) |
| 151 | + io.st_type := decRes(7) |
| 152 | + |
| 153 | + // Control signals for Write Back |
| 154 | + io.ld_type := decRes(8) |
| 155 | + io.wb_sel := decRes(9) |
| 156 | + io.wb_en := decRes(10) |
| 157 | + io.csr_cmd := decRes(11) |
| 158 | + io.illegal := decRes(12) |
| 159 | +} |
0 commit comments