11e3fad10SLinJiaweipackage xiangshan 21e3fad10SLinJiawei 31e3fad10SLinJiaweiimport chisel3._ 45844fcf0SLinJiaweiimport chisel3.util._ 5e402d94eSWilliam Wangimport bus.simplebus._ 6bfa4b2b4SLinJiaweiimport xiangshan.backend.brq.BrqPtr 70851457fSLinJiaweiimport xiangshan.backend.rename.FreeListPtr 842707b3bSYinan Xuimport xiangshan.backend.roq.RoqPtr 966b0d0c3Szhanglinjuanimport xiangshan.frontend.PreDecodeInfo 10f00290d7SLingrui98import xiangshan.frontend.HasBPUParameter 11f3501106SGouLingruiimport xiangshan.frontend.HasTageParameter 121e3fad10SLinJiawei 135844fcf0SLinJiawei// Fetch FetchWidth x 32-bit insts from Icache 141e3fad10SLinJiaweiclass FetchPacket extends XSBundle { 1528958354Szhanglinjuan val instrs = Vec(PredictWidth, UInt(32.W)) 1628958354Szhanglinjuan val mask = UInt(PredictWidth.W) 1742696a74Szhanglinjuan // val pc = UInt(VAddrBits.W) 1842696a74Szhanglinjuan val pc = Vec(PredictWidth, UInt(VAddrBits.W)) 1928958354Szhanglinjuan val pnpc = Vec(PredictWidth, UInt(VAddrBits.W)) 20a428082bSLinJiawei val brInfo = Vec(PredictWidth, new BranchInfo) 21a428082bSLinJiawei val pd = Vec(PredictWidth, new PreDecodeInfo) 225a67e465Szhanglinjuan val ipf = Bool() 235a67e465Szhanglinjuan val crossPageIPFFix = Bool() 241e3fad10SLinJiawei} 251e3fad10SLinJiawei 26627c0a19Szhanglinjuanclass ValidUndirectioned[T <: Data](gen: T) extends Bundle { 273803411bSzhanglinjuan val valid = Bool() 2835fe60e8SLingrui98 val bits = gen.cloneType.asInstanceOf[T] 29627c0a19Szhanglinjuan override def cloneType = new ValidUndirectioned(gen).asInstanceOf[this.type] 303803411bSzhanglinjuan} 313803411bSzhanglinjuan 32627c0a19Szhanglinjuanobject ValidUndirectioned { 33627c0a19Szhanglinjuan def apply[T <: Data](gen: T) = { 34627c0a19Szhanglinjuan new ValidUndirectioned[T](gen) 353803411bSzhanglinjuan } 363803411bSzhanglinjuan} 373803411bSzhanglinjuan 38f3501106SGouLingruiclass TageMeta extends XSBundle with HasTageParameter { 39627c0a19Szhanglinjuan val provider = ValidUndirectioned(UInt(log2Ceil(TageNTables).W)) 401e7d14a8Szhanglinjuan val altDiffers = Bool() 411e7d14a8Szhanglinjuan val providerU = UInt(2.W) 421e7d14a8Szhanglinjuan val providerCtr = UInt(3.W) 43627c0a19Szhanglinjuan val allocate = ValidUndirectioned(UInt(log2Ceil(TageNTables).W)) 441e7d14a8Szhanglinjuan} 451e7d14a8Szhanglinjuan 4666b0d0c3Szhanglinjuanclass BranchPrediction extends XSBundle { 4766b0d0c3Szhanglinjuan val redirect = Bool() 48e3aeae54SLingrui98 val taken = Bool() 4966b0d0c3Szhanglinjuan val jmpIdx = UInt(log2Up(PredictWidth).W) 50e3aeae54SLingrui98 val hasNotTakenBrs = Bool() 5166b0d0c3Szhanglinjuan val target = UInt(VAddrBits.W) 5266b0d0c3Szhanglinjuan val saveHalfRVI = Bool() 534a5c1190SGouLingrui val takenOnBr = Bool() 5466b0d0c3Szhanglinjuan} 5566b0d0c3Szhanglinjuan 56f00290d7SLingrui98class BranchInfo extends XSBundle with HasBPUParameter { 5753bf6077SLingrui98 val ubtbWriteWay = UInt(log2Up(UBtbWays).W) 58e3aeae54SLingrui98 val ubtbHits = Bool() 5953bf6077SLingrui98 val btbWriteWay = UInt(log2Up(BtbWays).W) 60035fad39SGouLingrui val btbHitJal = Bool() 61e3aeae54SLingrui98 val bimCtr = UInt(2.W) 6266b0d0c3Szhanglinjuan val histPtr = UInt(log2Up(ExtHistoryLength).W) 634a9bbf04SGouLingrui val predHistPtr = UInt(log2Up(ExtHistoryLength).W) 64f226232fSzhanglinjuan val tageMeta = new TageMeta 6566b0d0c3Szhanglinjuan val rasSp = UInt(log2Up(RasSize).W) 6666b0d0c3Szhanglinjuan val rasTopCtr = UInt(8.W) 67ed809609Sjinyue110 val rasToqAddr = UInt(VAddrBits.W) 68c5ed092cSLingrui98 val fetchIdx = UInt(log2Up(PredictWidth).W) 697d053a60Szhanglinjuan val specCnt = UInt(10.W) 704a5c1190SGouLingrui val sawNotTakenBranch = Bool() 71f226232fSzhanglinjuan 723a48285bSGouLingrui val debug_ubtb_cycle = if (EnableBPUTimeRecord) UInt(64.W) else UInt(0.W) 733a48285bSGouLingrui val debug_btb_cycle = if (EnableBPUTimeRecord) UInt(64.W) else UInt(0.W) 743a48285bSGouLingrui val debug_tage_cycle = if (EnableBPUTimeRecord) UInt(64.W) else UInt(0.W) 75ec776fa0SLingrui98 76f226232fSzhanglinjuan def apply(histPtr: UInt, tageMeta: TageMeta, rasSp: UInt, rasTopCtr: UInt) = { 77f226232fSzhanglinjuan this.histPtr := histPtr 78f226232fSzhanglinjuan this.tageMeta := tageMeta 79f226232fSzhanglinjuan this.rasSp := rasSp 8080d2974bSLingrui98 this.rasTopCtr := rasTopCtr 81f226232fSzhanglinjuan this.asUInt 82f226232fSzhanglinjuan } 83f226232fSzhanglinjuan def size = 0.U.asTypeOf(this).getWidth 84f226232fSzhanglinjuan def fromUInt(x: UInt) = x.asTypeOf(this) 8566b0d0c3Szhanglinjuan} 8666b0d0c3Szhanglinjuan 876fb61704Szhanglinjuanclass Predecode extends XSBundle { 88e9199ec7Szhanglinjuan val isFetchpcEqualFirstpc = Bool() 892f931f37Szhanglinjuan val mask = UInt((FetchWidth*2).W) 9066b0d0c3Szhanglinjuan val pd = Vec(FetchWidth*2, (new PreDecodeInfo)) 916fb61704Szhanglinjuan} 926fb61704Szhanglinjuan 93b2e6921eSLinJiaweiclass BranchUpdateInfo extends XSBundle { 94f226232fSzhanglinjuan // from backend 9569cafcc9SLingrui98 val pc = UInt(VAddrBits.W) 96608ba82cSzhanglinjuan val pnpc = UInt(VAddrBits.W) 9769cafcc9SLingrui98 val target = UInt(VAddrBits.W) 98b2e6921eSLinJiawei val brTarget = UInt(VAddrBits.W) 99b2e6921eSLinJiawei val taken = Bool() 100b2e6921eSLinJiawei val fetchIdx = UInt(log2Up(FetchWidth*2).W) 101b2e6921eSLinJiawei val isMisPred = Bool() 102e965d004Szhanglinjuan val brTag = new BrqPtr 103f226232fSzhanglinjuan 104f226232fSzhanglinjuan // frontend -> backend -> frontend 105f226232fSzhanglinjuan val pd = new PreDecodeInfo 106f226232fSzhanglinjuan val brInfo = new BranchInfo 107b2e6921eSLinJiawei} 108b2e6921eSLinJiawei 1095844fcf0SLinJiawei// Dequeue DecodeWidth insts from Ibuffer 1105844fcf0SLinJiaweiclass CtrlFlow extends XSBundle { 1115844fcf0SLinJiawei val instr = UInt(32.W) 1125844fcf0SLinJiawei val pc = UInt(VAddrBits.W) 1135844fcf0SLinJiawei val exceptionVec = Vec(16, Bool()) 1145844fcf0SLinJiawei val intrVec = Vec(12, Bool()) 115b2e6921eSLinJiawei val brUpdate = new BranchUpdateInfo 116c84054caSLinJiawei val crossPageIPFFix = Bool() 1175844fcf0SLinJiawei} 1185844fcf0SLinJiawei 1195844fcf0SLinJiawei// Decode DecodeWidth insts at Decode Stage 1205844fcf0SLinJiaweiclass CtrlSignals extends XSBundle { 1219a2e6b8aSLinJiawei val src1Type, src2Type, src3Type = SrcType() 1229a2e6b8aSLinJiawei val lsrc1, lsrc2, lsrc3 = UInt(5.W) 1239a2e6b8aSLinJiawei val ldest = UInt(5.W) 1249a2e6b8aSLinJiawei val fuType = FuType() 1259a2e6b8aSLinJiawei val fuOpType = FuOpType() 1269a2e6b8aSLinJiawei val rfWen = Bool() 1279a2e6b8aSLinJiawei val fpWen = Bool() 1289a2e6b8aSLinJiawei val isXSTrap = Bool() 1299a2e6b8aSLinJiawei val noSpecExec = Bool() // This inst can not be speculated 1309a2e6b8aSLinJiawei val isBlocked = Bool() // This inst requires pipeline to be blocked 13145a56a29SZhangZifei val flushPipe = Bool() // This inst will flush all the pipe when commit, like exception but can commit 132db34a189SLinJiawei val isRVF = Bool() 133db34a189SLinJiawei val imm = UInt(XLEN.W) 134a3edac52SYinan Xu val commitType = CommitType() 1355844fcf0SLinJiawei} 1365844fcf0SLinJiawei 1375844fcf0SLinJiaweiclass CfCtrl extends XSBundle { 1385844fcf0SLinJiawei val cf = new CtrlFlow 1395844fcf0SLinJiawei val ctrl = new CtrlSignals 140bfa4b2b4SLinJiawei val brTag = new BrqPtr 1415844fcf0SLinJiawei} 1425844fcf0SLinJiawei 143b2e6921eSLinJiawei// CfCtrl -> MicroOp at Rename Stage 144*4d8e0a7fSYinan Xuclass MicroOp extends CfCtrl { 1459a2e6b8aSLinJiawei val psrc1, psrc2, psrc3, pdest, old_pdest = UInt(PhyRegIdxWidth.W) 1469a2e6b8aSLinJiawei val src1State, src2State, src3State = SrcState() 14742707b3bSYinan Xu val roqIdx = new RoqPtr 148c105c2d3SYinan Xu val lsroqIdx = UInt(LsroqIdxWidth.W) 149355fcd20SAllen val diffTestDebugLrScValid = Bool() 1505844fcf0SLinJiawei} 1515844fcf0SLinJiawei 152*4d8e0a7fSYinan Xuclass Redirect extends XSBundle { 15342707b3bSYinan Xu val roqIdx = new RoqPtr 15437fcf7fbSLinJiawei val isException = Bool() 155b2e6921eSLinJiawei val isMisPred = Bool() 156b2e6921eSLinJiawei val isReplay = Bool() 15745a56a29SZhangZifei val isFlushPipe = Bool() 158b2e6921eSLinJiawei val pc = UInt(VAddrBits.W) 159b2e6921eSLinJiawei val target = UInt(VAddrBits.W) 160b2e6921eSLinJiawei val brTag = new BrqPtr 161a25b1bceSLinJiawei} 162a25b1bceSLinJiawei 1635844fcf0SLinJiaweiclass Dp1ToDp2IO extends XSBundle { 1645c7b21d5SYinan Xu val intDqToDp2 = Vec(dpParams.IntDqDeqWidth, DecoupledIO(new MicroOp)) 1655c7b21d5SYinan Xu val fpDqToDp2 = Vec(dpParams.FpDqDeqWidth, DecoupledIO(new MicroOp)) 1665c7b21d5SYinan Xu val lsDqToDp2 = Vec(dpParams.LsDqDeqWidth, DecoupledIO(new MicroOp)) 1675844fcf0SLinJiawei} 1685844fcf0SLinJiawei 16960deaca2SLinJiaweiclass ReplayPregReq extends XSBundle { 17060deaca2SLinJiawei // NOTE: set isInt and isFp both to 'false' when invalid 17160deaca2SLinJiawei val isInt = Bool() 17260deaca2SLinJiawei val isFp = Bool() 17360deaca2SLinJiawei val preg = UInt(PhyRegIdxWidth.W) 1745844fcf0SLinJiawei} 1755844fcf0SLinJiawei 176e402d94eSWilliam Wangclass DebugBundle extends XSBundle{ 17772235fa4SWilliam Wang val isMMIO = Bool() 178e402d94eSWilliam Wang} 1795844fcf0SLinJiawei 1805844fcf0SLinJiaweiclass ExuInput extends XSBundle { 1815844fcf0SLinJiawei val uop = new MicroOp 1825844fcf0SLinJiawei val src1, src2, src3 = UInt(XLEN.W) 1835844fcf0SLinJiawei} 1845844fcf0SLinJiawei 1855844fcf0SLinJiaweiclass ExuOutput extends XSBundle { 1865844fcf0SLinJiawei val uop = new MicroOp 1875844fcf0SLinJiawei val data = UInt(XLEN.W) 18897cfa7f8SLinJiawei val redirectValid = Bool() 18997cfa7f8SLinJiawei val redirect = new Redirect 190b2e6921eSLinJiawei val brUpdate = new BranchUpdateInfo 191e402d94eSWilliam Wang val debug = new DebugBundle 1925844fcf0SLinJiawei} 1935844fcf0SLinJiawei 1945844fcf0SLinJiaweiclass ExuIO extends XSBundle { 1955844fcf0SLinJiawei val in = Flipped(DecoupledIO(new ExuInput)) 196c3174e61SZhangZifei val redirect = Flipped(ValidIO(new Redirect)) 1975844fcf0SLinJiawei val out = DecoupledIO(new ExuOutput) 198bf9968b2SYinan Xu // for csr 199bf9968b2SYinan Xu val exception = Flipped(ValidIO(new MicroOp)) 200e402d94eSWilliam Wang // for Lsu 201e402d94eSWilliam Wang val dmem = new SimpleBusUC 20211915f69SWilliam Wang val mcommit = Input(UInt(3.W)) 2035844fcf0SLinJiawei} 2045844fcf0SLinJiawei 2055844fcf0SLinJiaweiclass RoqCommit extends XSBundle { 2065844fcf0SLinJiawei val uop = new MicroOp 207296e7422SLinJiawei val isWalk = Bool() 2085844fcf0SLinJiawei} 2095844fcf0SLinJiawei 21042707b3bSYinan Xuclass TlbFeedback extends XSBundle { 21142707b3bSYinan Xu val roqIdx = new RoqPtr 212037a131fSWilliam Wang val hit = Bool() 213037a131fSWilliam Wang} 214037a131fSWilliam Wang 2155844fcf0SLinJiaweiclass FrontendToBackendIO extends XSBundle { 2165844fcf0SLinJiawei // to backend end 2175844fcf0SLinJiawei val cfVec = Vec(DecodeWidth, DecoupledIO(new CtrlFlow)) 2185844fcf0SLinJiawei // from backend 219b2e6921eSLinJiawei val redirect = Flipped(ValidIO(new Redirect)) 220b2e6921eSLinJiawei val outOfOrderBrInfo = Flipped(ValidIO(new BranchUpdateInfo)) 221b2e6921eSLinJiawei val inOrderBrInfo = Flipped(ValidIO(new BranchUpdateInfo)) 2221e3fad10SLinJiawei} 223fcff7e94SZhangZifei 224fcff7e94SZhangZifeiclass TlbCsrBundle extends XSBundle { 225fcff7e94SZhangZifei val satp = new Bundle { 226fcff7e94SZhangZifei val mode = UInt(4.W) // TODO: may change number to parameter 227fcff7e94SZhangZifei val asid = UInt(16.W) 228fcff7e94SZhangZifei val ppn = UInt(44.W) // just use PAddrBits - 3 - vpnnLen 229fcff7e94SZhangZifei } 230fcff7e94SZhangZifei val priv = new Bundle { 231fcff7e94SZhangZifei val mxr = Bool() 232fcff7e94SZhangZifei val sum = Bool() 233fcff7e94SZhangZifei val imode = UInt(2.W) 234fcff7e94SZhangZifei val dmode = UInt(2.W) 235fcff7e94SZhangZifei } 2368fc4e859SZhangZifei 2378fc4e859SZhangZifei override def toPrintable: Printable = { 2388fc4e859SZhangZifei p"Satp mode:0x${Hexadecimal(satp.mode)} asid:0x${Hexadecimal(satp.asid)} ppn:0x${Hexadecimal(satp.ppn)} " + 2398fc4e859SZhangZifei p"Priv mxr:${priv.mxr} sum:${priv.sum} imode:${priv.imode} dmode:${priv.dmode}" 2408fc4e859SZhangZifei } 241fcff7e94SZhangZifei} 242fcff7e94SZhangZifei 243fcff7e94SZhangZifeiclass SfenceBundle extends XSBundle { 244fcff7e94SZhangZifei val valid = Bool() 245fcff7e94SZhangZifei val bits = new Bundle { 246fcff7e94SZhangZifei val rs1 = Bool() 247fcff7e94SZhangZifei val rs2 = Bool() 248fcff7e94SZhangZifei val addr = UInt(VAddrBits.W) 249fcff7e94SZhangZifei } 2508fc4e859SZhangZifei 2518fc4e859SZhangZifei override def toPrintable: Printable = { 2528fc4e859SZhangZifei p"valid:0x${Hexadecimal(valid)} rs1:${bits.rs1} rs2:${bits.rs2} addr:${Hexadecimal(bits.addr)}" 2538fc4e859SZhangZifei } 254fcff7e94SZhangZifei} 255