1024ee227SWilliam Wangpackage xiangshan.mem 2024ee227SWilliam Wang 3024ee227SWilliam Wangimport chisel3._ 4024ee227SWilliam Wangimport chisel3.util._ 5024ee227SWilliam Wangimport utils._ 6024ee227SWilliam Wangimport xiangshan._ 71279060fSWilliam Wangimport xiangshan.cache._ 81279060fSWilliam Wang// import xiangshan.cache.{DCacheWordIO, TlbRequestIO, TlbCmd, MemoryOpConstants, TlbReq, DCacheLoadReq, DCacheWordResp} 9024ee227SWilliam Wangimport xiangshan.backend.LSUOpType 10024ee227SWilliam Wang 110bd67ba5SYinan Xuclass LoadToLsqIO extends XSBundle { 12024ee227SWilliam Wang val loadIn = ValidIO(new LsPipelineBundle) 13024ee227SWilliam Wang val ldout = Flipped(DecoupledIO(new ExuOutput)) 14024ee227SWilliam Wang val forward = new LoadForwardQueryIO 15024ee227SWilliam Wang} 16024ee227SWilliam Wang 177962cc88SWilliam Wang// Load Pipeline Stage 0 187962cc88SWilliam Wang// Generate addr, use addr to query DCache and DTLB 197962cc88SWilliam Wangclass LoadUnit_S0 extends XSModule { 20024ee227SWilliam Wang val io = IO(new Bundle() { 217962cc88SWilliam Wang val in = Flipped(Decoupled(new ExuInput)) 227962cc88SWilliam Wang val out = Decoupled(new LsPipelineBundle) 230cab60cbSZhangZifei val dtlbReq = DecoupledIO(new TlbReq) 246e9ed841SAllen val dcacheReq = DecoupledIO(new DCacheWordReq) 25024ee227SWilliam Wang }) 26024ee227SWilliam Wang 277962cc88SWilliam Wang val s0_uop = io.in.bits.uop 287962cc88SWilliam Wang val s0_vaddr = io.in.bits.src1 + s0_uop.ctrl.imm 297962cc88SWilliam Wang val s0_mask = genWmask(s0_vaddr, s0_uop.ctrl.fuOpType(1,0)) 30024ee227SWilliam Wang 317962cc88SWilliam Wang // query DTLB 32d0f66e88SYinan Xu io.dtlbReq.valid := io.in.valid 331279060fSWilliam Wang io.dtlbReq.bits.vaddr := s0_vaddr 341279060fSWilliam Wang io.dtlbReq.bits.cmd := TlbCmd.read 351279060fSWilliam Wang io.dtlbReq.bits.roqIdx := s0_uop.roqIdx 361279060fSWilliam Wang io.dtlbReq.bits.debug.pc := s0_uop.cf.pc 37024ee227SWilliam Wang 387962cc88SWilliam Wang // query DCache 39d0f66e88SYinan Xu io.dcacheReq.valid := io.in.valid 401279060fSWilliam Wang io.dcacheReq.bits.cmd := MemoryOpConstants.M_XRD 411279060fSWilliam Wang io.dcacheReq.bits.addr := s0_vaddr 421279060fSWilliam Wang io.dcacheReq.bits.mask := s0_mask 4359a40467SWilliam Wang io.dcacheReq.bits.data := DontCare 44024ee227SWilliam Wang 4559a40467SWilliam Wang // TODO: update cache meta 4659a40467SWilliam Wang io.dcacheReq.bits.meta.id := DontCare 4759a40467SWilliam Wang io.dcacheReq.bits.meta.vaddr := s0_vaddr 4859a40467SWilliam Wang io.dcacheReq.bits.meta.paddr := DontCare 4959a40467SWilliam Wang io.dcacheReq.bits.meta.uop := s0_uop 5059a40467SWilliam Wang io.dcacheReq.bits.meta.mmio := false.B 5159a40467SWilliam Wang io.dcacheReq.bits.meta.tlb_miss := false.B 5259a40467SWilliam Wang io.dcacheReq.bits.meta.mask := s0_mask 5359a40467SWilliam Wang io.dcacheReq.bits.meta.replay := false.B 54024ee227SWilliam Wang 557962cc88SWilliam Wang val addrAligned = LookupTree(s0_uop.ctrl.fuOpType(1, 0), List( 56024ee227SWilliam Wang "b00".U -> true.B, //b 577962cc88SWilliam Wang "b01".U -> (s0_vaddr(0) === 0.U), //h 587962cc88SWilliam Wang "b10".U -> (s0_vaddr(1, 0) === 0.U), //w 597962cc88SWilliam Wang "b11".U -> (s0_vaddr(2, 0) === 0.U) //d 60024ee227SWilliam Wang )) 61024ee227SWilliam Wang 621a51d1d9SYinan Xu io.out.valid := io.in.valid && io.dcacheReq.ready 63d0f66e88SYinan Xu 647962cc88SWilliam Wang io.out.bits := DontCare 657962cc88SWilliam Wang io.out.bits.vaddr := s0_vaddr 667962cc88SWilliam Wang io.out.bits.mask := s0_mask 677962cc88SWilliam Wang io.out.bits.uop := s0_uop 687962cc88SWilliam Wang io.out.bits.uop.cf.exceptionVec(loadAddrMisaligned) := !addrAligned 69024ee227SWilliam Wang 70d0f66e88SYinan Xu io.in.ready := !io.in.valid || (io.out.ready && io.dcacheReq.ready) 71024ee227SWilliam Wang 72d0f66e88SYinan Xu XSDebug(io.dcacheReq.fire(), 73bcc55f84SYinan Xu p"[DCACHE LOAD REQ] pc ${Hexadecimal(s0_uop.cf.pc)}, vaddr ${Hexadecimal(s0_vaddr)}\n" 743dbae6f8SYinan Xu ) 757962cc88SWilliam Wang} 76024ee227SWilliam Wang 777962cc88SWilliam Wang 787962cc88SWilliam Wang// Load Pipeline Stage 1 797962cc88SWilliam Wang// TLB resp (send paddr to dcache) 807962cc88SWilliam Wangclass LoadUnit_S1 extends XSModule { 817962cc88SWilliam Wang val io = IO(new Bundle() { 827962cc88SWilliam Wang val in = Flipped(Decoupled(new LsPipelineBundle)) 837962cc88SWilliam Wang val out = Decoupled(new LsPipelineBundle) 84bcc55f84SYinan Xu val dtlbResp = Flipped(DecoupledIO(new TlbResp)) 85bcc55f84SYinan Xu val dcachePAddr = Output(UInt(PAddrBits.W)) 86d21b1759SYinan Xu val dcacheKill = Output(Bool()) 872e36e3b7SWilliam Wang val sbuffer = new LoadForwardQueryIO 880bd67ba5SYinan Xu val lsq = new LoadForwardQueryIO 897962cc88SWilliam Wang }) 907962cc88SWilliam Wang 917962cc88SWilliam Wang val s1_uop = io.in.bits.uop 92bcc55f84SYinan Xu val s1_paddr = io.dtlbResp.bits.paddr 938005392cSYinan Xu val s1_exception = io.out.bits.uop.cf.exceptionVec.asUInt.orR 94bcc55f84SYinan Xu val s1_tlb_miss = io.dtlbResp.bits.miss 958005392cSYinan Xu val s1_mmio = !s1_tlb_miss && AddressSpace.isMMIO(s1_paddr) 962e36e3b7SWilliam Wang val s1_mask = io.in.bits.mask 977962cc88SWilliam Wang 982e36e3b7SWilliam Wang io.out.bits := io.in.bits // forwardXX field will be updated in s1 99bcc55f84SYinan Xu 100bcc55f84SYinan Xu io.dtlbResp.ready := true.B 101bcc55f84SYinan Xu 1028005392cSYinan Xu // TOOD: PMA check 103bcc55f84SYinan Xu io.dcachePAddr := s1_paddr 1048005392cSYinan Xu io.dcacheKill := s1_tlb_miss || s1_exception || s1_mmio 1057962cc88SWilliam Wang 1062e36e3b7SWilliam Wang // load forward query datapath 1072e36e3b7SWilliam Wang io.sbuffer.valid := io.in.valid 1082e36e3b7SWilliam Wang io.sbuffer.paddr := s1_paddr 1092e36e3b7SWilliam Wang io.sbuffer.uop := s1_uop 1102e36e3b7SWilliam Wang io.sbuffer.sqIdx := s1_uop.sqIdx 1112e36e3b7SWilliam Wang io.sbuffer.mask := s1_mask 1122e36e3b7SWilliam Wang io.sbuffer.pc := s1_uop.cf.pc // FIXME: remove it 1132e36e3b7SWilliam Wang 1140bd67ba5SYinan Xu io.lsq.valid := io.in.valid 1150bd67ba5SYinan Xu io.lsq.paddr := s1_paddr 1160bd67ba5SYinan Xu io.lsq.uop := s1_uop 1170bd67ba5SYinan Xu io.lsq.sqIdx := s1_uop.sqIdx 1180bd67ba5SYinan Xu io.lsq.mask := s1_mask 1190bd67ba5SYinan Xu io.lsq.pc := s1_uop.cf.pc // FIXME: remove it 1202e36e3b7SWilliam Wang 121d21b1759SYinan Xu io.out.valid := io.in.valid// && !s1_tlb_miss 1227962cc88SWilliam Wang io.out.bits.paddr := s1_paddr 1238005392cSYinan Xu io.out.bits.mmio := s1_mmio && !s1_exception 12459a40467SWilliam Wang io.out.bits.tlbMiss := s1_tlb_miss 125bcc55f84SYinan Xu io.out.bits.uop.cf.exceptionVec(loadPageFault) := io.dtlbResp.bits.excp.pf.ld 1267962cc88SWilliam Wang 127d0f66e88SYinan Xu io.in.ready := !io.in.valid || io.out.ready 1287962cc88SWilliam Wang 1297962cc88SWilliam Wang} 1307962cc88SWilliam Wang 1317962cc88SWilliam Wang 1327962cc88SWilliam Wang// Load Pipeline Stage 2 1337962cc88SWilliam Wang// DCache resp 134579b9f28SLinJiaweiclass LoadUnit_S2 extends XSModule with HasLoadHelper { 1357962cc88SWilliam Wang val io = IO(new Bundle() { 1367962cc88SWilliam Wang val in = Flipped(Decoupled(new LsPipelineBundle)) 1377962cc88SWilliam Wang val out = Decoupled(new LsPipelineBundle) 138d21b1759SYinan Xu val tlbFeedback = ValidIO(new TlbFeedback) 1391279060fSWilliam Wang val dcacheResp = Flipped(DecoupledIO(new DCacheWordResp)) 140b3084e27SWilliam Wang val lsq = new LoadForwardQueryIO 141995f167cSYinan Xu val sbuffer = new LoadForwardQueryIO 1427962cc88SWilliam Wang }) 1437962cc88SWilliam Wang 1447962cc88SWilliam Wang val s2_uop = io.in.bits.uop 1457962cc88SWilliam Wang val s2_mask = io.in.bits.mask 1467962cc88SWilliam Wang val s2_paddr = io.in.bits.paddr 147d21b1759SYinan Xu val s2_tlb_miss = io.in.bits.tlbMiss 1488005392cSYinan Xu val s2_mmio = io.in.bits.mmio 1498005392cSYinan Xu val s2_exception = io.in.bits.uop.cf.exceptionVec.asUInt.orR 1501279060fSWilliam Wang val s2_cache_miss = io.dcacheResp.bits.miss 1516e9ed841SAllen val s2_cache_replay = io.dcacheResp.bits.replay 1527962cc88SWilliam Wang 1531279060fSWilliam Wang io.dcacheResp.ready := true.B 1548005392cSYinan Xu val dcacheShouldResp = !(s2_tlb_miss || s2_exception || s2_mmio) 1558005392cSYinan Xu assert(!(io.in.valid && dcacheShouldResp && !io.dcacheResp.valid), "DCache response got lost") 1567962cc88SWilliam Wang 157d21b1759SYinan Xu // feedback tlb result to RS 158d21b1759SYinan Xu io.tlbFeedback.valid := io.in.valid 159*c98c0043SYinan Xu io.tlbFeedback.bits.hit := !s2_tlb_miss && (!s2_cache_replay || s2_mmio) 160d21b1759SYinan Xu io.tlbFeedback.bits.roqIdx := s2_uop.roqIdx 161d21b1759SYinan Xu 162b3084e27SWilliam Wang val forwardMask = io.out.bits.forwardMask 163b3084e27SWilliam Wang val forwardData = io.out.bits.forwardData 1647962cc88SWilliam Wang val fullForward = (~forwardMask.asUInt & s2_mask) === 0.U 165024ee227SWilliam Wang 166b3084e27SWilliam Wang XSDebug(io.out.fire(), "[FWD LOAD RESP] pc %x fwd %x(%b) + %x(%b)\n", 167b3084e27SWilliam Wang s2_uop.cf.pc, 168b3084e27SWilliam Wang io.lsq.forwardData.asUInt, io.lsq.forwardMask.asUInt, 169b3084e27SWilliam Wang io.in.bits.forwardData.asUInt, io.in.bits.forwardMask.asUInt 170b3084e27SWilliam Wang ) 171b3084e27SWilliam Wang 172024ee227SWilliam Wang // data merge 1737962cc88SWilliam Wang val rdata = VecInit((0 until XLEN / 8).map(j => 1741279060fSWilliam Wang Mux(forwardMask(j), forwardData(j), io.dcacheResp.bits.data(8*(j+1)-1, 8*j)))).asUInt 1757962cc88SWilliam Wang val rdataSel = LookupTree(s2_paddr(2, 0), List( 176024ee227SWilliam Wang "b000".U -> rdata(63, 0), 177024ee227SWilliam Wang "b001".U -> rdata(63, 8), 178024ee227SWilliam Wang "b010".U -> rdata(63, 16), 179024ee227SWilliam Wang "b011".U -> rdata(63, 24), 180024ee227SWilliam Wang "b100".U -> rdata(63, 32), 181024ee227SWilliam Wang "b101".U -> rdata(63, 40), 182024ee227SWilliam Wang "b110".U -> rdata(63, 48), 183024ee227SWilliam Wang "b111".U -> rdata(63, 56) 184024ee227SWilliam Wang )) 185579b9f28SLinJiawei val rdataPartialLoad = rdataHelper(s2_uop, rdataSel) 186024ee227SWilliam Wang 1877962cc88SWilliam Wang // TODO: ECC check 188024ee227SWilliam Wang 1898005392cSYinan Xu io.out.valid := io.in.valid && !s2_tlb_miss && (!s2_cache_replay || s2_mmio) 1900bd67ba5SYinan Xu // Inst will be canceled in store queue / lsq, 191dd1ffd4dSWilliam Wang // so we do not need to care about flush in load / store unit's out.valid 1927962cc88SWilliam Wang io.out.bits := io.in.bits 1937962cc88SWilliam Wang io.out.bits.data := rdataPartialLoad 194d21b1759SYinan Xu io.out.bits.miss := s2_cache_miss && !fullForward 1952c671545SYinan Xu io.out.bits.mmio := s2_mmio 1967962cc88SWilliam Wang 1977962cc88SWilliam Wang io.in.ready := io.out.ready || !io.in.valid 1987962cc88SWilliam Wang 199b3084e27SWilliam Wang // merge forward result 200995f167cSYinan Xu // lsq has higher priority than sbuffer 201b3084e27SWilliam Wang io.lsq := DontCare 202995f167cSYinan Xu io.sbuffer := DontCare 203b3084e27SWilliam Wang // generate XLEN/8 Muxs 204b3084e27SWilliam Wang for (i <- 0 until XLEN / 8) { 205995f167cSYinan Xu when (io.sbuffer.forwardMask(i)) { 206995f167cSYinan Xu io.out.bits.forwardMask(i) := true.B 207995f167cSYinan Xu io.out.bits.forwardData(i) := io.sbuffer.forwardData(i) 208995f167cSYinan Xu } 209b3084e27SWilliam Wang when (io.lsq.forwardMask(i)) { 210b3084e27SWilliam Wang io.out.bits.forwardMask(i) := true.B 211b3084e27SWilliam Wang io.out.bits.forwardData(i) := io.lsq.forwardData(i) 212b3084e27SWilliam Wang } 213b3084e27SWilliam Wang } 214b3084e27SWilliam Wang 2152e36e3b7SWilliam Wang XSDebug(io.out.fire(), "[DCACHE LOAD RESP] pc %x rdata %x <- D$ %x + fwd %x(%b)\n", 216d5ea289eSWilliam Wang s2_uop.cf.pc, rdataPartialLoad, io.dcacheResp.bits.data, 217b3084e27SWilliam Wang io.out.bits.forwardData.asUInt, io.out.bits.forwardMask.asUInt 218024ee227SWilliam Wang ) 2197962cc88SWilliam Wang} 2207962cc88SWilliam Wang 22103a91a79SWilliam Wangclass LoadUnit extends XSModule with HasLoadHelper { 222024ee227SWilliam Wang val io = IO(new Bundle() { 223024ee227SWilliam Wang val ldin = Flipped(Decoupled(new ExuInput)) 224024ee227SWilliam Wang val ldout = Decoupled(new ExuOutput) 225c5c06e78SWilliam Wang val fpout = Decoupled(new ExuOutput) 226024ee227SWilliam Wang val redirect = Flipped(ValidIO(new Redirect)) 227024ee227SWilliam Wang val tlbFeedback = ValidIO(new TlbFeedback) 2281279060fSWilliam Wang val dcache = new DCacheLoadIO 229024ee227SWilliam Wang val dtlb = new TlbRequestIO() 230024ee227SWilliam Wang val sbuffer = new LoadForwardQueryIO 2310bd67ba5SYinan Xu val lsq = new LoadToLsqIO 232024ee227SWilliam Wang }) 233024ee227SWilliam Wang 2347962cc88SWilliam Wang val load_s0 = Module(new LoadUnit_S0) 2357962cc88SWilliam Wang val load_s1 = Module(new LoadUnit_S1) 2367962cc88SWilliam Wang val load_s2 = Module(new LoadUnit_S2) 237024ee227SWilliam Wang 2387962cc88SWilliam Wang load_s0.io.in <> io.ldin 2391279060fSWilliam Wang load_s0.io.dtlbReq <> io.dtlb.req 2401279060fSWilliam Wang load_s0.io.dcacheReq <> io.dcache.req 241024ee227SWilliam Wang 2421a51d1d9SYinan Xu PipelineConnect(load_s0.io.out, load_s1.io.in, true.B, load_s0.io.out.bits.uop.roqIdx.needFlush(io.redirect)) 243024ee227SWilliam Wang 244bcc55f84SYinan Xu load_s1.io.dtlbResp <> io.dtlb.resp 245bcc55f84SYinan Xu io.dcache.s1_paddr <> load_s1.io.dcachePAddr 246d21b1759SYinan Xu io.dcache.s1_kill <> load_s1.io.dcacheKill 247d0f66e88SYinan Xu load_s1.io.sbuffer <> io.sbuffer 248d0f66e88SYinan Xu load_s1.io.lsq <> io.lsq.forward 249024ee227SWilliam Wang 2501a51d1d9SYinan Xu PipelineConnect(load_s1.io.out, load_s2.io.in, true.B, load_s1.io.out.bits.uop.roqIdx.needFlush(io.redirect)) 251024ee227SWilliam Wang 252d21b1759SYinan Xu load_s2.io.tlbFeedback <> io.tlbFeedback 2531279060fSWilliam Wang load_s2.io.dcacheResp <> io.dcache.resp 254b3084e27SWilliam Wang load_s2.io.lsq.forwardData <> io.lsq.forward.forwardData 255b3084e27SWilliam Wang load_s2.io.lsq.forwardMask <> io.lsq.forward.forwardMask 256995f167cSYinan Xu load_s2.io.sbuffer.forwardData <> io.sbuffer.forwardData 257995f167cSYinan Xu load_s2.io.sbuffer.forwardMask <> io.sbuffer.forwardMask 258024ee227SWilliam Wang 2597962cc88SWilliam Wang XSDebug(load_s0.io.out.valid, 26048ae2f92SWilliam Wang p"S0: pc ${Hexadecimal(load_s0.io.out.bits.uop.cf.pc)}, lId ${Hexadecimal(load_s0.io.out.bits.uop.lqIdx.asUInt)}, " + 2617962cc88SWilliam Wang p"vaddr ${Hexadecimal(load_s0.io.out.bits.vaddr)}, mask ${Hexadecimal(load_s0.io.out.bits.mask)}\n") 2627962cc88SWilliam Wang XSDebug(load_s1.io.out.valid, 26348ae2f92SWilliam Wang p"S1: pc ${Hexadecimal(load_s1.io.out.bits.uop.cf.pc)}, lId ${Hexadecimal(load_s1.io.out.bits.uop.lqIdx.asUInt)}, tlb_miss ${io.dtlb.resp.bits.miss}, " + 26406c91a3dSWilliam Wang p"paddr ${Hexadecimal(load_s1.io.out.bits.paddr)}, mmio ${load_s1.io.out.bits.mmio}\n") 265024ee227SWilliam Wang 2660bd67ba5SYinan Xu // writeback to LSQ 267024ee227SWilliam Wang // Current dcache use MSHR 268c5c06e78SWilliam Wang // Load queue will be updated at s2 for both hit/miss int/fp load 2690bd67ba5SYinan Xu io.lsq.loadIn.valid := load_s2.io.out.valid 2700bd67ba5SYinan Xu io.lsq.loadIn.bits := load_s2.io.out.bits 27103a91a79SWilliam Wang val s2Valid = load_s2.io.out.valid && (!load_s2.io.out.bits.miss || load_s2.io.out.bits.uop.cf.exceptionVec.asUInt.orR) 27203a91a79SWilliam Wang val refillFpLoad = io.lsq.ldout.bits.uop.ctrl.fpWen 273024ee227SWilliam Wang 274c5c06e78SWilliam Wang // Int load, if hit, will be writebacked at s2 27503a91a79SWilliam Wang val intHitLoadOut = Wire(Valid(new ExuOutput)) 27603a91a79SWilliam Wang intHitLoadOut.valid := s2Valid && !load_s2.io.out.bits.uop.ctrl.fpWen 27703a91a79SWilliam Wang intHitLoadOut.bits.uop := load_s2.io.out.bits.uop 27803a91a79SWilliam Wang intHitLoadOut.bits.data := load_s2.io.out.bits.data 27903a91a79SWilliam Wang intHitLoadOut.bits.redirectValid := false.B 28003a91a79SWilliam Wang intHitLoadOut.bits.redirect := DontCare 28103a91a79SWilliam Wang intHitLoadOut.bits.brUpdate := DontCare 28203a91a79SWilliam Wang intHitLoadOut.bits.debug.isMMIO := load_s2.io.out.bits.mmio 28303a91a79SWilliam Wang intHitLoadOut.bits.fflags := DontCare 284024ee227SWilliam Wang 2857962cc88SWilliam Wang load_s2.io.out.ready := true.B 286c5c06e78SWilliam Wang 28703a91a79SWilliam Wang io.ldout.bits := Mux(intHitLoadOut.valid, intHitLoadOut.bits, io.lsq.ldout.bits) 28803a91a79SWilliam Wang io.ldout.valid := intHitLoadOut.valid || io.lsq.ldout.valid && !refillFpLoad 289c5c06e78SWilliam Wang 29003a91a79SWilliam Wang // Fp load, if hit, will be send to recoder at s2, then it will be recoded & writebacked at s3 29103a91a79SWilliam Wang val fpHitLoadOut = Wire(Valid(new ExuOutput)) 29203a91a79SWilliam Wang fpHitLoadOut.valid := s2Valid && load_s2.io.out.bits.uop.ctrl.fpWen 29303a91a79SWilliam Wang fpHitLoadOut.bits := intHitLoadOut.bits 29403a91a79SWilliam Wang 29503a91a79SWilliam Wang val fpLoadOut = Wire(Valid(new ExuOutput)) 29603a91a79SWilliam Wang fpLoadOut.bits := Mux(fpHitLoadOut.valid, fpHitLoadOut.bits, io.lsq.ldout.bits) 29703a91a79SWilliam Wang fpLoadOut.valid := fpHitLoadOut.valid || io.lsq.ldout.valid && refillFpLoad 29803a91a79SWilliam Wang 29903a91a79SWilliam Wang val fpLoadOutReg = RegNext(fpLoadOut) 30003a91a79SWilliam Wang io.fpout.bits := fpLoadOutReg.bits 30103a91a79SWilliam Wang io.fpout.bits.data := fpRdataHelper(fpLoadOutReg.bits.uop, fpLoadOutReg.bits.data) // recode 30203a91a79SWilliam Wang io.fpout.valid := RegNext(fpLoadOut.valid && !load_s2.io.out.bits.uop.roqIdx.needFlush(io.redirect)) 30303a91a79SWilliam Wang 304c3d4d93eSZhangfw io.lsq.ldout.ready := Mux(refillFpLoad, !fpHitLoadOut.valid, !intHitLoadOut.valid) 305024ee227SWilliam Wang 306024ee227SWilliam Wang when(io.ldout.fire()){ 307c5c06e78SWilliam Wang XSDebug("ldout %x\n", io.ldout.bits.uop.cf.pc) 308c5c06e78SWilliam Wang } 309c5c06e78SWilliam Wang 310c5c06e78SWilliam Wang when(io.fpout.fire()){ 311c5c06e78SWilliam Wang XSDebug("fpout %x\n", io.fpout.bits.uop.cf.pc) 312024ee227SWilliam Wang } 313024ee227SWilliam Wang} 314