Bundle.scala (7e6acce3068fd7397d644527e57588635956aa6d) Bundle.scala (579b9f28762b9000ab852a29357f1dcc0e1636a5)
1package xiangshan
2
3import chisel3._
4import chisel3.util._
5import xiangshan.backend.brq.BrqPtr
6import xiangshan.backend.fu.fpu.Fflags
7import xiangshan.backend.rename.FreeListPtr
8import xiangshan.backend.roq.RoqPtr
9import xiangshan.mem.{LqPtr, SqPtr}
10import xiangshan.frontend.PreDecodeInfo
11import xiangshan.frontend.HasBPUParameter
12import xiangshan.frontend.HasTageParameter
1package xiangshan
2
3import chisel3._
4import chisel3.util._
5import xiangshan.backend.brq.BrqPtr
6import xiangshan.backend.fu.fpu.Fflags
7import xiangshan.backend.rename.FreeListPtr
8import xiangshan.backend.roq.RoqPtr
9import xiangshan.mem.{LqPtr, SqPtr}
10import xiangshan.frontend.PreDecodeInfo
11import xiangshan.frontend.HasBPUParameter
12import xiangshan.frontend.HasTageParameter
13import xiangshan.frontend.HasIFUConst
14import utils._
15import scala.math.max
16
17// Fetch FetchWidth x 32-bit insts from Icache
18class FetchPacket extends XSBundle {
19 val instrs = Vec(PredictWidth, UInt(32.W))
20 val mask = UInt(PredictWidth.W)
21 // val pc = UInt(VAddrBits.W)
22 val pc = Vec(PredictWidth, UInt(VAddrBits.W))
23 val pnpc = Vec(PredictWidth, UInt(VAddrBits.W))
24 val brInfo = Vec(PredictWidth, new BranchInfo)
25 val pd = Vec(PredictWidth, new PreDecodeInfo)
26 val ipf = Bool()
13import scala.math.max
14
15// Fetch FetchWidth x 32-bit insts from Icache
16class FetchPacket extends XSBundle {
17 val instrs = Vec(PredictWidth, UInt(32.W))
18 val mask = UInt(PredictWidth.W)
19 // val pc = UInt(VAddrBits.W)
20 val pc = Vec(PredictWidth, UInt(VAddrBits.W))
21 val pnpc = Vec(PredictWidth, UInt(VAddrBits.W))
22 val brInfo = Vec(PredictWidth, new BranchInfo)
23 val pd = Vec(PredictWidth, new PreDecodeInfo)
24 val ipf = Bool()
27 val acf = Bool()
28 val crossPageIPFFix = Bool()
29 val predTaken = Bool()
30}
31
32class ValidUndirectioned[T <: Data](gen: T) extends Bundle {
33 val valid = Bool()
34 val bits = gen.cloneType.asInstanceOf[T]
35 override def cloneType = new ValidUndirectioned(gen).asInstanceOf[this.type]

--- 22 unchanged lines hidden (view full) ---

58 val altDiffers = Bool()
59 val providerU = UInt(2.W)
60 val providerCtr = UInt(3.W)
61 val allocate = ValidUndirectioned(UInt(log2Ceil(TageNTables).W))
62 val taken = Bool()
63 val scMeta = new SCMeta(EnableSC)
64}
65
25 val crossPageIPFFix = Bool()
26 val predTaken = Bool()
27}
28
29class ValidUndirectioned[T <: Data](gen: T) extends Bundle {
30 val valid = Bool()
31 val bits = gen.cloneType.asInstanceOf[T]
32 override def cloneType = new ValidUndirectioned(gen).asInstanceOf[this.type]

--- 22 unchanged lines hidden (view full) ---

55 val altDiffers = Bool()
56 val providerU = UInt(2.W)
57 val providerCtr = UInt(3.W)
58 val allocate = ValidUndirectioned(UInt(log2Ceil(TageNTables).W))
59 val taken = Bool()
60 val scMeta = new SCMeta(EnableSC)
61}
62
66class BranchPrediction extends XSBundle with HasIFUConst {
67 // val redirect = Bool()
68 val takens = UInt(PredictWidth.W)
69 // val jmpIdx = UInt(log2Up(PredictWidth).W)
70 val brMask = UInt(PredictWidth.W)
71 val jalMask = UInt(PredictWidth.W)
72 val targets = Vec(PredictWidth, UInt(VAddrBits.W))
73
74 // marks the last 2 bytes of this fetch packet
75 // val endsAtTheEndOfFirstBank = Bool()
76 // val endsAtTheEndOfLastBank = Bool()
77
78 // half RVI could only start at the end of a bank
79 val firstBankHasHalfRVI = Bool()
80 val lastBankHasHalfRVI = Bool()
81
82 def lastHalfRVIMask = Mux(firstBankHasHalfRVI, UIntToOH((bankWidth-1).U),
83 Mux(lastBankHasHalfRVI, UIntToOH((PredictWidth-1).U),
84 0.U(PredictWidth.W)
85 )
86 )
87
88 def lastHalfRVIClearMask = ~lastHalfRVIMask
89 // is taken from half RVI
90 def lastHalfRVITaken = (takens & lastHalfRVIMask).orR
91
92 def lastHalfRVIIdx = Mux(firstBankHasHalfRVI, (bankWidth-1).U, (PredictWidth-1).U)
93 // should not be used if not lastHalfRVITaken
94 def lastHalfRVITarget = Mux(firstBankHasHalfRVI, targets(bankWidth-1), targets(PredictWidth-1))
95
96 def realTakens = takens & lastHalfRVIClearMask
97 def realBrMask = brMask & lastHalfRVIClearMask
98 def realJalMask = jalMask & lastHalfRVIClearMask
99
100 def brNotTakens = ~realTakens & realBrMask
101 def sawNotTakenBr = VecInit((0 until PredictWidth).map(i =>
102 (if (i == 0) false.B else brNotTakens(i-1,0).orR)))
103 def hasNotTakenBrs = (brNotTakens & LowerMaskFromLowest(realTakens)).orR
104 def unmaskedJmpIdx = PriorityEncoder(takens)
105 def saveHalfRVI = (firstBankHasHalfRVI && (unmaskedJmpIdx === (bankWidth-1).U || !(takens.orR))) ||
106 (lastBankHasHalfRVI && unmaskedJmpIdx === (PredictWidth-1).U)
107 // could get PredictWidth-1 when only the first bank is valid
108 def jmpIdx = PriorityEncoder(realTakens)
109 // only used when taken
110 def target = targets(jmpIdx)
111 def taken = realTakens.orR
112 def takenOnBr = taken && realBrMask(jmpIdx)
63class BranchPrediction extends XSBundle {
64 val redirect = Bool()
65 val taken = Bool()
66 val jmpIdx = UInt(log2Up(PredictWidth).W)
67 val hasNotTakenBrs = Bool()
68 val target = UInt(VAddrBits.W)
69 val saveHalfRVI = Bool()
70 val takenOnBr = Bool()
113}
114
115class BranchInfo extends XSBundle with HasBPUParameter {
116 val ubtbWriteWay = UInt(log2Up(UBtbWays).W)
117 val ubtbHits = Bool()
118 val btbWriteWay = UInt(log2Up(BtbWays).W)
119 val btbHitJal = Bool()
120 val bimCtr = UInt(2.W)

--- 17 unchanged lines hidden (view full) ---

138 this.rasSp := rasSp
139 this.rasTopCtr := rasTopCtr
140 this.asUInt
141 }
142 def size = 0.U.asTypeOf(this).getWidth
143 def fromUInt(x: UInt) = x.asTypeOf(this)
144}
145
71}
72
73class BranchInfo extends XSBundle with HasBPUParameter {
74 val ubtbWriteWay = UInt(log2Up(UBtbWays).W)
75 val ubtbHits = Bool()
76 val btbWriteWay = UInt(log2Up(BtbWays).W)
77 val btbHitJal = Bool()
78 val bimCtr = UInt(2.W)

--- 17 unchanged lines hidden (view full) ---

96 this.rasSp := rasSp
97 this.rasTopCtr := rasTopCtr
98 this.asUInt
99 }
100 def size = 0.U.asTypeOf(this).getWidth
101 def fromUInt(x: UInt) = x.asTypeOf(this)
102}
103
146class Predecode extends XSBundle with HasIFUConst {
147 val hasLastHalfRVI = Bool()
104class Predecode extends XSBundle {
105 val isFetchpcEqualFirstpc = Bool()
148 val mask = UInt((FetchWidth*2).W)
106 val mask = UInt((FetchWidth*2).W)
149 val lastHalf = UInt(nBanksInPacket.W)
150 val pd = Vec(FetchWidth*2, (new PreDecodeInfo))
151}
152
153class BranchUpdateInfo extends XSBundle {
154 // from backend
155 val pc = UInt(VAddrBits.W)
156 val pnpc = UInt(VAddrBits.W)
157 val target = UInt(VAddrBits.W)

--- 13 unchanged lines hidden (view full) ---

171 val instr = UInt(32.W)
172 val pc = UInt(VAddrBits.W)
173 val exceptionVec = Vec(16, Bool())
174 val intrVec = Vec(12, Bool())
175 val brUpdate = new BranchUpdateInfo
176 val crossPageIPFFix = Bool()
177}
178
107 val pd = Vec(FetchWidth*2, (new PreDecodeInfo))
108}
109
110class BranchUpdateInfo extends XSBundle {
111 // from backend
112 val pc = UInt(VAddrBits.W)
113 val pnpc = UInt(VAddrBits.W)
114 val target = UInt(VAddrBits.W)

--- 13 unchanged lines hidden (view full) ---

128 val instr = UInt(32.W)
129 val pc = UInt(VAddrBits.W)
130 val exceptionVec = Vec(16, Bool())
131 val intrVec = Vec(12, Bool())
132 val brUpdate = new BranchUpdateInfo
133 val crossPageIPFFix = Bool()
134}
135
136
137class FPUCtrlSignals extends XSBundle {
138 val tagIn = UInt(2.W)
139 val tagOut = UInt(2.W)
140}
141
179// Decode DecodeWidth insts at Decode Stage
180class CtrlSignals extends XSBundle {
181 val src1Type, src2Type, src3Type = SrcType()
182 val lsrc1, lsrc2, lsrc3 = UInt(5.W)
183 val ldest = UInt(5.W)
184 val fuType = FuType()
185 val fuOpType = FuOpType()
186 val rfWen = Bool()
187 val fpWen = Bool()
188 val isXSTrap = Bool()
189 val noSpecExec = Bool() // wait forward
190 val blockBackward = Bool() // block backward
191 val flushPipe = Bool() // This inst will flush all the pipe when commit, like exception but can commit
192 val isRVF = Bool()
193 val imm = UInt(XLEN.W)
194 val commitType = CommitType()
142// Decode DecodeWidth insts at Decode Stage
143class CtrlSignals extends XSBundle {
144 val src1Type, src2Type, src3Type = SrcType()
145 val lsrc1, lsrc2, lsrc3 = UInt(5.W)
146 val ldest = UInt(5.W)
147 val fuType = FuType()
148 val fuOpType = FuOpType()
149 val rfWen = Bool()
150 val fpWen = Bool()
151 val isXSTrap = Bool()
152 val noSpecExec = Bool() // wait forward
153 val blockBackward = Bool() // block backward
154 val flushPipe = Bool() // This inst will flush all the pipe when commit, like exception but can commit
155 val isRVF = Bool()
156 val imm = UInt(XLEN.W)
157 val commitType = CommitType()
158 val fpu = new FPUCtrlSignals
195}
196
197class CfCtrl extends XSBundle {
198 val cf = new CtrlFlow
199 val ctrl = new CtrlSignals
200 val brTag = new BrqPtr
201}
202

--- 92 unchanged lines hidden (view full) ---

295 val roqIdx = new RoqPtr
296 val hit = Bool()
297}
298
299class FrontendToBackendIO extends XSBundle {
300 // to backend end
301 val cfVec = Vec(DecodeWidth, DecoupledIO(new CtrlFlow))
302 // from backend
159}
160
161class CfCtrl extends XSBundle {
162 val cf = new CtrlFlow
163 val ctrl = new CtrlSignals
164 val brTag = new BrqPtr
165}
166

--- 92 unchanged lines hidden (view full) ---

259 val roqIdx = new RoqPtr
260 val hit = Bool()
261}
262
263class FrontendToBackendIO extends XSBundle {
264 // to backend end
265 val cfVec = Vec(DecodeWidth, DecoupledIO(new CtrlFlow))
266 // from backend
303 val redirect = Flipped(ValidIO(UInt(VAddrBits.W)))
267 val redirect = Flipped(ValidIO(new Redirect))
304 val outOfOrderBrInfo = Flipped(ValidIO(new BranchUpdateInfo))
305 val inOrderBrInfo = Flipped(ValidIO(new BranchUpdateInfo))
306}
307
308class TlbCsrBundle extends XSBundle {
309 val satp = new Bundle {
310 val mode = UInt(4.W) // TODO: may change number to parameter
311 val asid = UInt(16.W)

--- 27 unchanged lines hidden ---
268 val outOfOrderBrInfo = Flipped(ValidIO(new BranchUpdateInfo))
269 val inOrderBrInfo = Flipped(ValidIO(new BranchUpdateInfo))
270}
271
272class TlbCsrBundle extends XSBundle {
273 val satp = new Bundle {
274 val mode = UInt(4.W) // TODO: may change number to parameter
275 val asid = UInt(16.W)

--- 27 unchanged lines hidden ---