@@ -3,51 +3,50 @@ package treecorel2
3
3
import chisel3 ._
4
4
import chisel3 .util ._
5
5
6
- class ALU extends Module {
6
+ import treecorel2 .common .InstConfig
7
+
8
+ class ALU extends Module with InstConfig {
7
9
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 ))
13
15
})
14
16
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
+ )
53
52
}
0 commit comments