@@ -3,51 +3,50 @@ package treecorel2
33import chisel3 ._
44import chisel3 .util ._
55
6- class ALU extends Module {
6+ import treecorel2 .common .InstConfig
7+
8+ class ALU extends Module with InstConfig {
79 val io = IO (new Bundle {
8- val isa = Input (new ISAIO )
9- val src1 = Input (UInt (64 .W ))
10- val src2 = Input (UInt (64 .W ))
11- val imm = Input (new IMMIO )
12- val res = Output (UInt (64 .W ))
10+ val isa = Input (UInt ( InstValLen . W ) )
11+ val src1 = Input (UInt (XLen .W ))
12+ val src2 = Input (UInt (XLen .W ))
13+ val imm = Input (UInt ( XLen . W ) )
14+ val res = Output (UInt (XLen .W ))
1315 })
1416
15- protected val addi = SignExt (io.isa.ADDI .asUInt, 64 ) & (io.src1 + io.imm.I )
16- protected val add = SignExt (io.isa.ADD .asUInt, 64 ) & (io.src1 + io.src2)
17- protected val lui = SignExt (io.isa.LUI .asUInt, 64 ) & (io.imm.U )
18- protected val sub = SignExt (io.isa.SUB .asUInt, 64 ) & (io.src1 - io.src2)
19- protected val addiw = SignExt (io.isa.ADDIW .asUInt, 64 ) & SignExt ((io.src1 + io.imm.I )(31 , 0 ), 64 )
20- protected val addw = SignExt (io.isa.ADDW .asUInt, 64 ) & SignExt ((io.src1 + io.src2)(31 , 0 ), 64 )
21- protected val subw = SignExt (io.isa.SUBW .asUInt, 64 ) & SignExt ((io.src1 - io.src2)(31 , 0 ), 64 )
22- protected val arith = addi | add | lui | sub | addiw | addw | subw
23-
24- protected val andi = SignExt (io.isa.ANDI .asUInt, 64 ) & (io.src1 & io.imm.I )
25- protected val and = SignExt (io.isa.AND .asUInt, 64 ) & (io.src1 & io.src2)
26- protected val ori = SignExt (io.isa.ORI .asUInt, 64 ) & (io.src1 | io.imm.I )
27- protected val or = SignExt (io.isa.OR .asUInt, 64 ) & (io.src1 | io.src2)
28- protected val xori = SignExt (io.isa.XORI .asUInt, 64 ) & (io.src1 ^ io.imm.I )
29- protected val xor = SignExt (io.isa.XOR .asUInt, 64 ) & (io.src1 ^ io.src2)
30- protected val logc = andi | and | ori | or | xori | xor
31-
32- protected val slt = Mux ((io.isa.SLT && (io.src1.asSInt < io.src2.asSInt)), 1 .U (64 .W ), 0 .U (64 .W ))
33- protected val slti = Mux ((io.isa.SLTI && (io.src1.asSInt < io.imm.I .asSInt)), 1 .U (64 .W ), 0 .U (64 .W ))
34- protected val sltu = Mux ((io.isa.SLTU && (io.src1.asUInt < io.src2.asUInt)), 1 .U (64 .W ), 0 .U (64 .W ))
35- protected val sltiu = Mux ((io.isa.SLTIU && (io.src1.asUInt < io.imm.I .asUInt)), 1 .U (64 .W ), 0 .U (64 .W ))
36- protected val comp = slt | slti | sltu | sltiu
37-
38- protected val sll = SignExt (io.isa.SLL .asUInt, 64 ) & (io.src1 << io.src2(5 , 0 ))(63 , 0 )
39- protected val srl = SignExt (io.isa.SRL .asUInt, 64 ) & (io.src1 >> io.src2(5 , 0 ))
40- protected val sra = SignExt (io.isa.SRA .asUInt, 64 ) & (io.src1.asSInt >> io.src2(5 , 0 )).asUInt
41- protected val slli = SignExt (io.isa.SLLI .asUInt, 64 ) & (io.src1 << io.imm.I (5 , 0 ))(63 , 0 )
42- protected val srli = SignExt (io.isa.SRLI .asUInt, 64 ) & (io.src1 >> io.imm.I (5 , 0 ))
43- protected val srai = SignExt (io.isa.SRAI .asUInt, 64 ) & (io.src1.asSInt >> io.imm.I (5 , 0 )).asUInt
44- protected val sllw = SignExt (io.isa.SLLW .asUInt, 64 ) & SignExt ((io.src1 << io.src2(4 , 0 ))(31 , 0 ), 64 )
45- protected val srlw = SignExt (io.isa.SRLW .asUInt, 64 ) & SignExt ((io.src1(31 , 0 ) >> io.src2(4 , 0 )), 64 )
46- protected val sraw = SignExt (io.isa.SRAW .asUInt, 64 ) & SignExt ((io.src1(31 , 0 ).asSInt >> io.src2(4 , 0 )).asUInt, 64 )
47- protected val slliw = SignExt (io.isa.SLLIW .asUInt, 64 ) & SignExt ((io.src1 << io.imm.I (4 , 0 ))(31 , 0 ), 64 )
48- protected val srliw = SignExt (io.isa.SRLIW .asUInt, 64 ) & SignExt ((io.src1(31 , 0 ) >> io.imm.I (4 , 0 )), 64 )
49- protected val sraiw = SignExt (io.isa.SRAIW .asUInt, 64 ) & SignExt ((io.src1(31 , 0 ).asSInt >> io.imm.I (4 , 0 )).asUInt, 64 )
50- protected val shift = sll | srl | sra | slli | srli | srai | sllw | srlw | sraw | slliw | srliw | sraiw
51-
52- io.res := arith | logc | comp | shift
17+ io.res := MuxLookup (
18+ io.isa,
19+ 0 .U (XLen .W ),
20+ Seq (
21+ instADDI -> (io.src1 + io.imm),
22+ instADD -> (io.src1 + io.src2),
23+ instLUI -> (io.imm),
24+ instSUB -> (io.src1 - io.src2),
25+ instADDIW -> SignExt ((io.src1 + io.imm)(31 , 0 ), 64 ),
26+ instADDW -> SignExt ((io.src1 + io.src2)(31 , 0 ), 64 ),
27+ instSUBW -> SignExt ((io.src1 - io.src2)(31 , 0 ), 64 ),
28+ instANDI -> (io.src1 & io.imm),
29+ instAND -> (io.src1 & io.src2),
30+ instORI -> (io.src1 | io.imm),
31+ instOR -> (io.src1 | io.src2),
32+ instXORI -> (io.src1 ^ io.imm),
33+ instXOR -> (io.src1 ^ io.src2),
34+ instSLT -> Mux (io.src1.asSInt < io.src2.asSInt, 1 .U (XLen .W ), 0 .U (XLen .W )),
35+ instSLTI -> Mux (io.src1.asSInt < io.imm.asSInt, 1 .U (XLen .W ), 0 .U (XLen .W )),
36+ instSLTU -> Mux (io.src1.asUInt < io.src2.asUInt, 1 .U (XLen .W ), 0 .U (XLen .W )),
37+ instSLTIU -> Mux (io.src1.asUInt < io.imm.asUInt, 1 .U (XLen .W ), 0 .U (XLen .W )),
38+ instSLL -> (io.src1 << io.src2(5 , 0 ))(63 , 0 ),
39+ instSRL -> (io.src1 >> io.src2(5 , 0 )),
40+ instSRA -> (io.src1.asSInt >> io.src2(5 , 0 )).asUInt,
41+ instSLLI -> (io.src1 << io.imm(5 , 0 ))(63 , 0 ),
42+ instSRLI -> (io.src1 >> io.imm(5 , 0 )),
43+ instSRAI -> (io.src1.asSInt >> io.imm(5 , 0 )).asUInt,
44+ instSLLW -> SignExt ((io.src1 << io.src2(4 , 0 ))(31 , 0 ), 64 ),
45+ instSRLW -> SignExt ((io.src1(31 , 0 ) >> io.src2(4 , 0 )), 64 ),
46+ instSRAW -> SignExt ((io.src1(31 , 0 ).asSInt >> io.src2(4 , 0 )).asUInt, 64 ),
47+ instSLLIW -> SignExt ((io.src1 << io.imm(4 , 0 ))(31 , 0 ), 64 ),
48+ instSRLIW -> SignExt ((io.src1(31 , 0 ) >> io.imm(4 , 0 )), 64 ),
49+ instSRAIW -> SignExt ((io.src1(31 , 0 ).asSInt >> io.imm(4 , 0 )).asUInt, 64 )
50+ )
51+ )
5352}
0 commit comments