1package xiangshan.backend.datapath 2 3import org.chipsalliance.cde.config.Parameters 4import chisel3._ 5import chisel3.util._ 6import utility._ 7import xiangshan._ 8import xiangshan.backend.BackendParams 9import xiangshan.backend.Bundles._ 10import xiangshan.backend.issue.EntryBundles.{EntryDeqRespBundle, RespType} 11import xiangshan.backend.issue.VfScheduler 12 13 14class Og2ForVector(params: BackendParams)(implicit p: Parameters) extends XSModule { 15 val io = IO(new Og2ForVectorIO(params)) 16 17 private val s1_validVec2 = io.fromOg1NoReg.map(_.map(_.valid)) 18 private val s1_dataVec2 = io.fromOg1NoReg.map(_.map(_.bits)) 19 private val s1_readyVec2 = io.fromOg1NoReg.map(_.map(_.ready)) 20 private val toVfExuFire = io.toVfExu.map(_.map(_.fire)) 21 private val toVfExuReady = io.toVfExu.map(_.map(_.ready)) 22 private val vfIQNum: Int = io.fromOg1NoReg.size 23 private val vfIQPerExuNum = io.fromOg1NoReg.map(_.size).toSeq 24 25 val s2_toVfExuValid = Reg(MixedVec( 26 s1_validVec2.map(x => MixedVec(x.map(_.cloneType).toSeq)).toSeq 27 )) 28 val s2_toVfExuData = Reg(MixedVec( 29 s1_dataVec2.map(x => MixedVec(x.map(_.cloneType).toSeq)).toSeq 30 )) 31 32 for(i <- 0 until vfIQNum) { 33 for (j <- 0 until vfIQPerExuNum(i)) { 34 val s2_flush = s1_dataVec2(i)(j).robIdx.needFlush(Seq(io.flush, RegNextWithEnable(io.flush))) 35 val og2Failed = s2_toVfExuValid(i)(j) && !toVfExuFire(i)(j) 36 val s1_ldCancel = LoadShouldCancel(s1_dataVec2(i)(j).loadDependency, io.ldCancel) 37 when(s1_validVec2(i)(j) && s1_readyVec2(i)(j) && !s2_flush && !og2Failed && !s1_ldCancel) { 38 s2_toVfExuValid(i)(j) := s1_validVec2(i)(j) 39 s2_toVfExuData(i)(j) := s1_dataVec2(i)(j) 40 s2_toVfExuData(i)(j).loadDependency.foreach(_ := s1_dataVec2(i)(j).loadDependency.get.map(_ << 1)) 41 }.otherwise { 42 s2_toVfExuValid(i)(j) := false.B 43 } 44 s1_readyVec2(i)(j) := (toVfExuReady(i)(j) || !s1_validVec2(i)(j)) && !og2Failed && !s1_ldCancel 45 io.toVfExu(i)(j).valid := s2_toVfExuValid(i)(j) 46 io.toVfExu(i)(j).bits := s2_toVfExuData(i)(j) 47 } 48 } 49 io.toVfIQ.zipWithIndex.foreach { 50 case (toVfExu, iqId) => 51 toVfExu.zipWithIndex.foreach { 52 case (og2Resp, exuId) => 53 val og2Failed = s2_toVfExuValid(iqId)(exuId) && !toVfExuFire(iqId)(exuId) 54 og2Resp.valid := s2_toVfExuValid(iqId)(exuId) 55 og2Resp.bits.robIdx := s2_toVfExuData(iqId)(exuId).robIdx 56 og2Resp.bits.uopIdx.foreach(_ := s2_toVfExuData(iqId)(exuId).vpu.get.vuopIdx) 57 og2Resp.bits.resp := Mux(og2Failed, RespType.block, RespType.success) 58 og2Resp.bits.fuType := s2_toVfExuData(iqId)(exuId).fuType 59 } 60 } 61 io.toVfImmInfo := io.fromOg1ImmInfo.zip(s1_validVec2.flatten).map{ 62 case (imm, valid) => RegEnable(imm, valid) 63 } 64} 65 66class Og2ForVectorIO(params: BackendParams)(implicit p: Parameters) extends XSBundle { 67 private val vfSchdParams = params.schdParams(VfScheduler()) 68 69 val flush: ValidIO[Redirect] = Flipped(ValidIO(new Redirect)) 70 val ldCancel = Vec(backendParams.LduCnt + backendParams.HyuCnt, Flipped(new LoadCancelIO)) 71 val fromOg1NoReg: MixedVec[MixedVec[DecoupledIO[ExuInput]]] = Flipped(vfSchdParams.genExuInputBundle) 72 val fromOg1ImmInfo: Vec[ImmInfo] = Input(Vec(params.allExuParams.filter(_.isVfExeUnit).size, new ImmInfo)) 73 val toVfExu = MixedVec(vfSchdParams.genExuInputBundle) 74 val toVfIQ = MixedVec(vfSchdParams.issueBlockParams.map(_.genOG2RespBundle)) 75 val toVfImmInfo: Vec[ImmInfo] = Output(Vec(params.allExuParams.filter(_.isVfExeUnit).size, new ImmInfo)) 76}