11e3fad10SLinJiaweipackage xiangshan 21e3fad10SLinJiawei 31e3fad10SLinJiaweiimport chisel3._ 45844fcf0SLinJiaweiimport chisel3.util._ 5e402d94eSWilliam Wangimport bus.simplebus._ 6bfa4b2b4SLinJiaweiimport xiangshan.backend.brq.BrqPtr 70851457fSLinJiaweiimport xiangshan.backend.rename.FreeListPtr 81e3fad10SLinJiawei 95844fcf0SLinJiawei// Fetch FetchWidth x 32-bit insts from Icache 101e3fad10SLinJiaweiclass FetchPacket extends XSBundle { 111e3fad10SLinJiawei val instrs = Vec(FetchWidth, UInt(32.W)) 12e4698824Szoujr val mask = UInt((FetchWidth*2).W) 131e3fad10SLinJiawei val pc = UInt(VAddrBits.W) // the pc of first inst in the fetch group 14fda42022Szhanglinjuan val pnpc = Vec(FetchWidth, UInt(VAddrBits.W)) 151e3fad10SLinJiawei} 161e3fad10SLinJiawei 17e983e862Szhanglinjuan// Branch prediction result from BPU Stage1 & 3 186fb61704Szhanglinjuanclass BranchPrediction extends XSBundle { 19e983e862Szhanglinjuan val redirect = Bool() 20e983e862Szhanglinjuan 216fb61704Szhanglinjuan // mask off all the instrs after the first redirect instr 226fb61704Szhanglinjuan val instrValid = Vec(FetchWidth, Bool()) 23*dff546ecSzhanglinjuan // target of the first redirect instr in a fetch package 246fb61704Szhanglinjuan val target = UInt(VAddrBits.W) 25*dff546ecSzhanglinjuan // val _type = UInt(2.W) 26e983e862Szhanglinjuan 27e983e862Szhanglinjuan // save these info in brq! 28e983e862Szhanglinjuan // global history of each valid(or uncancelled) instruction, excluding branch's own prediction result 29140dcc2eSzhanglinjuan val hist = Vec(FetchWidth, UInt(HistoryLength.W)) 30e983e862Szhanglinjuan // ras checkpoint, only used in Stage3 31*dff546ecSzhanglinjuan val rasSp = UInt(log2Up(RasSize).W) 32*dff546ecSzhanglinjuan val rasTopCtr = UInt(8.W) 336fb61704Szhanglinjuan} 346fb61704Szhanglinjuan 356fb61704Szhanglinjuan// Save predecode info in icache 366fb61704Szhanglinjuanclass Predecode extends XSBundle { 3794947342Szhanglinjuan val mask = UInt(FetchWidth.W) 386fb61704Szhanglinjuan val fuTypes = Vec(FetchWidth, FuType()) 396fb61704Szhanglinjuan val fuOpTypes = Vec(FetchWidth, FuOpType()) 406fb61704Szhanglinjuan} 416fb61704Szhanglinjuan 425844fcf0SLinJiawei// Dequeue DecodeWidth insts from Ibuffer 435844fcf0SLinJiaweiclass CtrlFlow extends XSBundle { 445844fcf0SLinJiawei val instr = UInt(32.W) 455844fcf0SLinJiawei val pc = UInt(VAddrBits.W) 46fda42022Szhanglinjuan val pnpc = UInt(VAddrBits.W) 475844fcf0SLinJiawei val exceptionVec = Vec(16, Bool()) 485844fcf0SLinJiawei val intrVec = Vec(12, Bool()) 499a2e6b8aSLinJiawei val isRVC = Bool() 509a2e6b8aSLinJiawei val isBr = Bool() 515844fcf0SLinJiawei} 525844fcf0SLinJiawei 535844fcf0SLinJiawei// Decode DecodeWidth insts at Decode Stage 545844fcf0SLinJiaweiclass CtrlSignals extends XSBundle { 559a2e6b8aSLinJiawei val src1Type, src2Type, src3Type = SrcType() 569a2e6b8aSLinJiawei val lsrc1, lsrc2, lsrc3 = UInt(5.W) 579a2e6b8aSLinJiawei val ldest = UInt(5.W) 589a2e6b8aSLinJiawei val fuType = FuType() 599a2e6b8aSLinJiawei val fuOpType = FuOpType() 609a2e6b8aSLinJiawei val rfWen = Bool() 619a2e6b8aSLinJiawei val fpWen = Bool() 629a2e6b8aSLinJiawei val isXSTrap = Bool() 639a2e6b8aSLinJiawei val noSpecExec = Bool() // This inst can not be speculated 649a2e6b8aSLinJiawei val isBlocked = Bool() // This inst requires pipeline to be blocked 65db34a189SLinJiawei val isRVF = Bool() 66db34a189SLinJiawei val imm = UInt(XLEN.W) 675844fcf0SLinJiawei} 685844fcf0SLinJiawei 695844fcf0SLinJiaweiclass CfCtrl extends XSBundle { 705844fcf0SLinJiawei val cf = new CtrlFlow 715844fcf0SLinJiawei val ctrl = new CtrlSignals 72bfa4b2b4SLinJiawei val brTag = new BrqPtr 735844fcf0SLinJiawei} 745844fcf0SLinJiawei 755844fcf0SLinJiawei// CfCtrl -> MicroOp at Rename Stage 765844fcf0SLinJiaweiclass MicroOp extends CfCtrl { 775844fcf0SLinJiawei 789a2e6b8aSLinJiawei val psrc1, psrc2, psrc3, pdest, old_pdest = UInt(PhyRegIdxWidth.W) 799a2e6b8aSLinJiawei val src1State, src2State, src3State = SrcState() 800851457fSLinJiawei val freelistAllocPtr = new FreeListPtr 815844fcf0SLinJiawei val roqIdx = UInt(RoqIdxWidth.W) 825844fcf0SLinJiawei} 835844fcf0SLinJiawei 841e3fad10SLinJiaweiclass Redirect extends XSBundle { 85fda42022Szhanglinjuan val pc = UInt(VAddrBits.W) // wrongly predicted pc 861e3fad10SLinJiawei val target = UInt(VAddrBits.W) 8743c072e7Szhanglinjuan val brTarget = UInt(VAddrBits.W) 88bfa4b2b4SLinJiawei val brTag = new BrqPtr 89fda42022Szhanglinjuan val _type = UInt(2.W) 906fb61704Szhanglinjuan val isCall = Bool() 91fda42022Szhanglinjuan val taken = Bool() 926fb61704Szhanglinjuan val hist = UInt(HistoryLength.W) 9337fcf7fbSLinJiawei val isException = Bool() 94ab7d3e5fSWilliam Wang val roqIdx = UInt(RoqIdxWidth.W) 950851457fSLinJiawei val freelistAllocPtr = new FreeListPtr 965844fcf0SLinJiawei} 975844fcf0SLinJiawei 98a25b1bceSLinJiaweiclass RedirectInfo extends XSBundle { 99a25b1bceSLinJiawei 100a25b1bceSLinJiawei val valid = Bool() // a valid commit form brq/roq 101a25b1bceSLinJiawei val misPred = Bool() // a branch miss prediction ? 102a25b1bceSLinJiawei val redirect = new Redirect 103a25b1bceSLinJiawei 104a25b1bceSLinJiawei def flush():Bool = valid && (redirect.isException || misPred) 105a25b1bceSLinJiawei} 106a25b1bceSLinJiawei 1075844fcf0SLinJiaweiclass Dp1ToDp2IO extends XSBundle { 1085844fcf0SLinJiawei val intDqToDp2 = Vec(IntDqDeqWidth, DecoupledIO(new MicroOp)) 1095844fcf0SLinJiawei val fpDqToDp2 = Vec(FpDqDeqWidth, DecoupledIO(new MicroOp)) 1105844fcf0SLinJiawei val lsDqToDp2 = Vec(LsDqDeqWidth, DecoupledIO(new MicroOp)) 1115844fcf0SLinJiawei} 1125844fcf0SLinJiawei 113e402d94eSWilliam Wangclass DebugBundle extends XSBundle{ 11472235fa4SWilliam Wang val isMMIO = Bool() 115e402d94eSWilliam Wang} 1165844fcf0SLinJiawei 1175844fcf0SLinJiaweiclass ExuInput extends XSBundle { 1185844fcf0SLinJiawei val uop = new MicroOp 1195844fcf0SLinJiawei val src1, src2, src3 = UInt(XLEN.W) 1205844fcf0SLinJiawei} 1215844fcf0SLinJiawei 1225844fcf0SLinJiaweiclass ExuOutput extends XSBundle { 1235844fcf0SLinJiawei val uop = new MicroOp 1245844fcf0SLinJiawei val data = UInt(XLEN.W) 12597cfa7f8SLinJiawei val redirectValid = Bool() 12697cfa7f8SLinJiawei val redirect = new Redirect 127e402d94eSWilliam Wang val debug = new DebugBundle 1285844fcf0SLinJiawei} 1295844fcf0SLinJiawei 1305844fcf0SLinJiaweiclass ExuIO extends XSBundle { 1315844fcf0SLinJiawei val in = Flipped(DecoupledIO(new ExuInput)) 132c3174e61SZhangZifei val redirect = Flipped(ValidIO(new Redirect)) 1335844fcf0SLinJiawei val out = DecoupledIO(new ExuOutput) 134e402d94eSWilliam Wang 135e402d94eSWilliam Wang // for Lsu 136e402d94eSWilliam Wang val dmem = new SimpleBusUC 1374e1a70f6SWilliam Wang val scommit = Input(UInt(3.W)) 1385844fcf0SLinJiawei} 1395844fcf0SLinJiawei 1405844fcf0SLinJiaweiclass RoqCommit extends XSBundle { 1415844fcf0SLinJiawei val uop = new MicroOp 142296e7422SLinJiawei val isWalk = Bool() 1435844fcf0SLinJiawei} 1445844fcf0SLinJiawei 1455844fcf0SLinJiaweiclass FrontendToBackendIO extends XSBundle { 1465844fcf0SLinJiawei // to backend end 1475844fcf0SLinJiawei val cfVec = Vec(DecodeWidth, DecoupledIO(new CtrlFlow)) 1485844fcf0SLinJiawei // from backend 149a25b1bceSLinJiawei val redirectInfo = Input(new RedirectInfo) 1505844fcf0SLinJiawei val commits = Vec(CommitWidth, Flipped(ValidIO(new RoqCommit))) // update branch pred 1511e3fad10SLinJiawei} 152