Skip to content

Commit 769257f

Browse files
committed
Support B extension
1 parent e630b6c commit 769257f

File tree

2 files changed

+19
-11
lines changed

2 files changed

+19
-11
lines changed

src/main/scala/common/Parameters.scala

+3-3
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,9 @@ case class ShuttleCoreParams(
6969
val nPTECacheEntries: Int = 0
7070
val useHypervisor: Boolean = false
7171
val useConditionalZero = false
72-
val useZba = false
73-
val useZbb = false
74-
val useZbs = false
72+
val useZba = true
73+
val useZbb = true
74+
val useZbs = true
7575
override val useVector = vector.isDefined
7676
override def vLen = vector.map(_.vLen).getOrElse(0)
7777
override def eLen = 64

src/main/scala/exu/Core.scala

+16-8
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import freechips.rocketchip.tilelink.TLEdgeOut
88
import freechips.rocketchip.util._
99
import freechips.rocketchip.rocket._
1010
import freechips.rocketchip.rocket.Instructions._
11+
import freechips.rocketchip.rocket.ALU._
1112

1213
import shuttle.common._
1314
import shuttle.ifu._
@@ -40,8 +41,6 @@ class ShuttleCore(tile: ShuttleTile, edge: TLEdgeOut)(implicit p: Parameters) ex
4041
val vector = if (usingVector) Some(Flipped(new ShuttleVectorCoreIO)) else None
4142
})
4243

43-
val aluFn = new ALUFN
44-
4544
val debug_tsc_reg = RegInit(0.U(64.W))
4645
debug_tsc_reg := debug_tsc_reg + 1.U
4746
dontTouch(debug_tsc_reg)
@@ -162,7 +161,8 @@ class ShuttleCore(tile: ShuttleTile, edge: TLEdgeOut)(implicit p: Parameters) ex
162161
(usingDebug.option(new DebugDecode)) ++:
163162
(usingVector.option(new VCFGDecode)) ++:
164163
(usingNMI.option(new NMIDecode)) ++:
165-
Seq(new FenceIDecode(false)) ++:
164+
Seq(new FenceIDecode(false)) ++:
165+
Seq(new ZbaDecode, new Zba64Decode, new ZbbDecode, new Zbb64Decode, new ZbsDecode) ++:
166166
Seq(new IDecode)
167167
} flatMap(_.table)
168168

@@ -250,7 +250,7 @@ class ShuttleCore(tile: ShuttleTile, edge: TLEdgeOut)(implicit p: Parameters) ex
250250
rrd_uops(i).bits.xcpt_cause := cause
251251

252252
when (xcpt) {
253-
rrd_uops(i).bits.ctrl.alu_fn := aluFn.FN_ADD
253+
rrd_uops(i).bits.ctrl.alu_fn := FN_ADD
254254
rrd_uops(i).bits.ctrl.alu_dw := DW_XPR
255255
rrd_uops(i).bits.ctrl.sel_alu1 := A1_RS1
256256
rrd_uops(i).bits.ctrl.sel_alu2 := A2_ZERO
@@ -555,12 +555,16 @@ class ShuttleCore(tile: ShuttleTile, edge: TLEdgeOut)(implicit p: Parameters) ex
555555
val sel_alu2 = WireInit(ctrl.sel_alu2)
556556
val ex_op1 = MuxLookup(sel_alu1, 0.S)(Seq(
557557
A1_RS1 -> uop.rs1_data.asSInt,
558-
A1_PC -> uop.pc.asSInt
558+
A1_PC -> uop.pc.asSInt,
559+
A1_RS1SHL -> (Mux(uop.inst(3), uop.rs1_data(31,0), uop.rs1_data) << uop.inst(14,13)).asSInt
559560
))
561+
val ex_op2_oh = UIntToOH(Mux(ctrl.sel_alu2(0), (uop.inst >> 20).asUInt, uop.rs2_data)(log2Ceil(xLen)-1,0)).asSInt
560562
val ex_op2 = MuxLookup(sel_alu2, 0.S)(Seq(
561563
A2_RS2 -> uop.rs2_data.asSInt,
562564
A2_IMM -> imm,
563-
A2_SIZE -> Mux(uop.rvc, 2.S, 4.S)
565+
A2_SIZE -> Mux(uop.rvc, 2.S, 4.S),
566+
A2_RS2OH -> ex_op2_oh,
567+
A2_IMMOH -> ex_op2_oh
564568
))
565569

566570
alu.io.dw := ctrl.alu_dw
@@ -771,12 +775,16 @@ class ShuttleCore(tile: ShuttleTile, edge: TLEdgeOut)(implicit p: Parameters) ex
771775
uop.rs2_data)
772776
val ex_op1 = MuxLookup(sel_alu1, 0.S)(Seq(
773777
A1_RS1 -> rs1_data.asSInt,
774-
A1_PC -> uop.pc.asSInt
778+
A1_PC -> uop.pc.asSInt,
779+
A1_RS1SHL -> (Mux(uop.inst(3), rs1_data(31,0), rs1_data) << uop.inst(14,13)).asSInt
775780
))
781+
val ex_op2_oh = UIntToOH(Mux(ctrl.sel_alu2(0), (uop.inst >> 20).asUInt, rs2_data)(log2Ceil(xLen)-1,0)).asSInt
776782
val ex_op2 = MuxLookup(sel_alu2, 0.S)(Seq(
777783
A2_RS2 -> rs2_data.asSInt,
778784
A2_IMM -> imm,
779-
A2_SIZE -> Mux(uop.rvc, 2.S, 4.S)
785+
A2_SIZE -> Mux(uop.rvc, 2.S, 4.S),
786+
A2_RS2OH -> ex_op2_oh,
787+
A2_IMMOH -> ex_op2_oh
780788
))
781789
alu.io.dw := ctrl.alu_dw
782790
alu.io.fn := ctrl.alu_fn

0 commit comments

Comments
 (0)