1e43bb916SXuan Hupackage xiangshan.backend 2e43bb916SXuan Hu 3e43bb916SXuan Huimport chisel3.util._ 4e43bb916SXuan Huimport chisel3._ 5e43bb916SXuan Huimport org.chipsalliance.cde.config.Parameters 6e43bb916SXuan Huimport utility._ 7e43bb916SXuan Huimport xiangshan._ 8e43bb916SXuan Huimport xiangshan.backend.fu.vector.Bundles._ 9e43bb916SXuan Hu 10e43bb916SXuan Huclass VecExcpDataMergeModule(implicit p: Parameters) extends XSModule { 11e43bb916SXuan Hu private val MaxLMUL = 8 12e43bb916SXuan Hu private val VdIdxInGroupWidth = log2Ceil(MaxLMUL) // hold 0~7 13e43bb916SXuan Hu private val minElemLen = 8 // 8 bits 14e43bb916SXuan Hu private val maxElemNumPerVreg = VLEN / minElemLen 15e43bb916SXuan Hu private val tailZeroBit = log2Ceil(maxElemNumPerVreg) // 16 -> 4 16e43bb916SXuan Hu 17e43bb916SXuan Hu val i = IO(Input(new Bundle { 18e43bb916SXuan Hu val fromExceptionGen = ValidIO(new VecExcpInfo) 19e43bb916SXuan Hu val fromRab = new RabToVecExcpMod 20e43bb916SXuan Hu val fromRat = new RatToVecExcpMod 21e43bb916SXuan Hu val fromVprf = new VprfToExcpMod(maxMergeNumPerCycle * 2) 22e43bb916SXuan Hu })) 23e43bb916SXuan Hu val o = IO(Output(new Bundle { 24e43bb916SXuan Hu val toVPRF = new ExcpModToVprf(maxMergeNumPerCycle * 2, maxMergeNumPerCycle) 25e43bb916SXuan Hu val status = new Bundle { 26e43bb916SXuan Hu val busy = Bool() 27e43bb916SXuan Hu } 28e43bb916SXuan Hu })) 29e43bb916SXuan Hu 30e43bb916SXuan Hu private val oldPregVecFromRat: Vec[ValidIO[UInt]] = Wire(Vec(RabCommitWidth, ValidIO(UInt(VfPhyRegIdxWidth.W)))) 31e43bb916SXuan Hu oldPregVecFromRat.zipWithIndex.foreach { case (oldPreg: ValidIO[UInt], idx) => 32e43bb916SXuan Hu val vecOldVd = i.fromRat.vecOldVdPdest(idx) 33e43bb916SXuan Hu val v0OldVd = i.fromRat.v0OldVdPdest(idx) 34e43bb916SXuan Hu oldPreg.valid := (vecOldVd.valid || v0OldVd.valid) 35e43bb916SXuan Hu oldPreg.bits := Mux1H(Seq( 36e43bb916SXuan Hu vecOldVd.valid -> vecOldVd.bits, 37e43bb916SXuan Hu v0OldVd.valid -> v0OldVd.bits, 38e43bb916SXuan Hu )) 39e43bb916SXuan Hu } 40e43bb916SXuan Hu 41e43bb916SXuan Hu private val lregNewPregVecFromRab = WireInit(i.fromRab.logicPhyRegMap) 42e43bb916SXuan Hu 43e43bb916SXuan Hu private val preMergedOldVd = WireInit(VecInit(i.fromVprf.rdata.take(maxMergeNumPerCycle).map(_.bits.asTypeOf(new VecElemData(VLEN))))) 44e43bb916SXuan Hu private val preMergedNewVd = WireInit(VecInit(i.fromVprf.rdata.drop(maxMergeNumPerCycle).map(_.bits.asTypeOf(new VecElemData(VLEN))))) 45e43bb916SXuan Hu private val preMoveOldVd = WireInit(VecInit(i.fromVprf.rdata.map(_.bits.asTypeOf(new VecElemData(VLEN))))) 46e43bb916SXuan Hu 47e43bb916SXuan Hu private val sNoExcp_vecExcpInfo = WireInit(i.fromExceptionGen) 48e43bb916SXuan Hu private val sNoExcp_vemul = sNoExcp_vecExcpInfo.bits.vlmul + sNoExcp_vecExcpInfo.bits.veew - sNoExcp_vecExcpInfo.bits.vsew 49e43bb916SXuan Hu // data vemul 50e43bb916SXuan Hu private val sNoExcp_dvemul = Mux( 51e43bb916SXuan Hu sNoExcp_vecExcpInfo.bits.isIndexed, 52e43bb916SXuan Hu sNoExcp_vecExcpInfo.bits.vlmul, 53e43bb916SXuan Hu sNoExcp_vemul, 54e43bb916SXuan Hu ) 55e43bb916SXuan Hu // index vemul 56e43bb916SXuan Hu private val sNoExcp_ivemul = WireInit(VLmul(), sNoExcp_vemul) 57e43bb916SXuan Hu dontTouch(sNoExcp_vemul) 58e43bb916SXuan Hu dontTouch(sNoExcp_dvemul) 59e43bb916SXuan Hu dontTouch(sNoExcp_ivemul) 60e43bb916SXuan Hu private val sNoExcp_dvemulNoLessThanM1 = VLmul.makeNoLessThanM1(sNoExcp_dvemul).take(2) 61e43bb916SXuan Hu private val sNoExcp_ivemulNoLessThanM1 = VLmul.makeNoLessThanM1(sNoExcp_ivemul).take(2) 62e43bb916SXuan Hu 63e43bb916SXuan Hu // if ivemul - dvemul = idx 64e43bb916SXuan Hu private val sNoExcp_vemul_i_d = VecInit.tabulate(4)(idx => 65e43bb916SXuan Hu sNoExcp_ivemulNoLessThanM1 === (sNoExcp_dvemulNoLessThanM1 +& idx.U) || 66e43bb916SXuan Hu (idx == 0).B && (sNoExcp_ivemulNoLessThanM1 < sNoExcp_dvemulNoLessThanM1) 67e43bb916SXuan Hu ) 68e43bb916SXuan Hu private val sNoExcp_nonSegIndexed = sNoExcp_vecExcpInfo.bits.isIndexed && sNoExcp_vecExcpInfo.bits.nf === 0.U 69e43bb916SXuan Hu 70e43bb916SXuan Hu private val commitNeeded = RegInit(VecInit.fill(MaxLMUL)(false.B)) 71e43bb916SXuan Hu private val rabCommitted = RegInit(VecInit.fill(MaxLMUL)(false.B)) 72e43bb916SXuan Hu private val ratCommitted = RegInit(VecInit.fill(MaxLMUL)(false.B)) 73e43bb916SXuan Hu private val hasReadRf = RegInit(VecInit.fill(MaxLMUL)(false.B)) 74e43bb916SXuan Hu 75e43bb916SXuan Hu private val regMaps = Reg(Vec(MaxLMUL, new LogicPhyRegMap)) 76e43bb916SXuan Hu 77e43bb916SXuan Hu private val currentIdx = RegInit(0.U(log2Up(8 + 1).W)) 78e43bb916SXuan Hu private val currentIdxVec = (0 until maxMergeNumPerCycle).map(idx => currentIdx + idx.U) 79e43bb916SXuan Hu 80e43bb916SXuan Hu private val mergedVd = Reg(Vec(maxMergeNumPerCycle, new VecElemData(VLEN))) 81e43bb916SXuan Hu 82e43bb916SXuan Hu private val sNoExcp_eewOH = SewOH.convertFromVSew(sNoExcp_vecExcpInfo.bits.veew) 83e43bb916SXuan Hu private val sNoExcp_sewOH = SewOH.convertFromVSew(sNoExcp_vecExcpInfo.bits.vsew) 84e43bb916SXuan Hu private val sNoExcp_deewOH = Mux( 85e43bb916SXuan Hu sNoExcp_vecExcpInfo.bits.isIndexed, 86e43bb916SXuan Hu sNoExcp_sewOH, 87e43bb916SXuan Hu sNoExcp_eewOH, 88e43bb916SXuan Hu ) 89e43bb916SXuan Hu private val sNoExcp_voffset = Module(new GetE8OffsetInVreg(VLEN))(sNoExcp_deewOH, sNoExcp_vecExcpInfo.bits.vstart) 90*71c0165fSchengguanghui private val sNoExcp_idxRangeVec: Vec[HWRange] = 91*71c0165fSchengguanghui Module(new NfMappedElemIdx(VLEN))( 92*71c0165fSchengguanghui Mux(!sNoExcp_vecExcpInfo.bits.isWhole, sNoExcp_vecExcpInfo.bits.nf, 0.U), 93*71c0165fSchengguanghui sNoExcp_deewOH 94*71c0165fSchengguanghui ) 95e43bb916SXuan Hu private val sNoExcp_vstartIsAligned: Bool = Mux(!sNoExcp_vecExcpInfo.bits.isVlm, sNoExcp_voffset === 0.U, false.B) 96e43bb916SXuan Hu 97e43bb916SXuan Hu private val sNoExcp_inRangeVec: Vec[Bool] = VecInit((0 until 8).map(idx => 98e43bb916SXuan Hu if (idx == 0) { 99e43bb916SXuan Hu sNoExcp_vecExcpInfo.bits.isVlm || 100e43bb916SXuan Hu sNoExcp_idxRangeVec(idx).inRange (sNoExcp_vecExcpInfo.bits.vstart) 101e43bb916SXuan Hu } else { 102e43bb916SXuan Hu !sNoExcp_vecExcpInfo.bits.isVlm && 103e43bb916SXuan Hu sNoExcp_idxRangeVec(idx).inRange (sNoExcp_vecExcpInfo.bits.vstart) 104e43bb916SXuan Hu } 105e43bb916SXuan Hu )) 106e43bb916SXuan Hu // The last no exception vdIdx, hold 0~7. 107e43bb916SXuan Hu // No need to hold 8, since if all vd are new, there is no exception occuration. 108e43bb916SXuan Hu private val sNoExcp_useNewVdUntil: UInt = PriorityEncoder(sNoExcp_inRangeVec) 109e43bb916SXuan Hu // The last exception vdIdx, hold 0~8. 110e43bb916SXuan Hu // Need to hold 8. 11136c15e45SXuan Hu private val sNoExcp_needMergeUntil: UInt = sNoExcp_useNewVdUntil + 11236c15e45SXuan Hu Mux(!sNoExcp_vecExcpInfo.bits.isWhole, sNoExcp_vecExcpInfo.bits.nf, 0.U) +& 11336c15e45SXuan Hu 1.U 114e43bb916SXuan Hu // the max vd idx need to write 115e43bb916SXuan Hu private val sNoExcp_maxVdIdx = Mux( 116e43bb916SXuan Hu sNoExcp_vecExcpInfo.valid, 117e43bb916SXuan Hu MuxCase( 118e43bb916SXuan Hu default = ((sNoExcp_vecExcpInfo.bits.nf +& 1.U) << sNoExcp_dvemulNoLessThanM1).asUInt, 119e43bb916SXuan Hu Seq( 120e43bb916SXuan Hu sNoExcp_vecExcpInfo.bits.isVlm -> 1.U, 121e43bb916SXuan Hu sNoExcp_vecExcpInfo.bits.isWhole -> (sNoExcp_vecExcpInfo.bits.nf +& 1.U), 122e43bb916SXuan Hu ) 123e43bb916SXuan Hu ), 124e43bb916SXuan Hu 0.U 125e43bb916SXuan Hu ) 126e43bb916SXuan Hu 127e43bb916SXuan Hu private val sNoExcp_handleUntil = sNoExcp_maxVdIdx(3, 0) // [1, 8] 128e43bb916SXuan Hu // strided vector load need 2 uop to move data, so skip these reg maps 129e43bb916SXuan Hu private val sNoExcp_writeOffset = Mux(sNoExcp_vecExcpInfo.bits.isStride, 2.U, 1.U) 130e43bb916SXuan Hu 131e43bb916SXuan Hu private val sWaitRab_vecExcpInfo = RegNextWithEnable(sNoExcp_vecExcpInfo) 132e43bb916SXuan Hu 133e43bb916SXuan Hu // At the beginning of waitRab, 134e43bb916SXuan Hu // when not offset not aligned, currentIdx = useNewVdUntil <= needMergeUntil <= handleUntil 135e43bb916SXuan Hu // otherwise, currentIdx = needMergeUntil <= handleUntil 136e43bb916SXuan Hu private val sWaitRab_useNewVdUntil = RegEnable(sNoExcp_useNewVdUntil, sNoExcp_vecExcpInfo.valid) 137e43bb916SXuan Hu private val sWaitRab_needMergeUntil = RegEnable(sNoExcp_needMergeUntil, sNoExcp_vecExcpInfo.valid) 138e43bb916SXuan Hu private val sWaitRab_e8offset = RegEnable( 139e43bb916SXuan Hu Mux1H((0 until 4).map(idx => sNoExcp_deewOH(idx) -> ZeroExt(sNoExcp_voffset(tailZeroBit - 1, 0), tailZeroBit))), 140e43bb916SXuan Hu sNoExcp_vecExcpInfo.valid 141e43bb916SXuan Hu ) 142e43bb916SXuan Hu private val sWaitRab_idxRangeVec = RegEnable(sNoExcp_idxRangeVec, sNoExcp_vecExcpInfo.valid) 143e43bb916SXuan Hu private val sWaitRab_vstartIsAligned = RegEnable(sNoExcp_vstartIsAligned, sNoExcp_vecExcpInfo.valid) 144e43bb916SXuan Hu private val sWaitRab_handleUntil = RegEnable(sNoExcp_handleUntil, sNoExcp_vecExcpInfo.valid) 145e43bb916SXuan Hu 146e43bb916SXuan Hu private val sWaitRab_nonSegIndexed = RegEnable(sNoExcp_nonSegIndexed, sNoExcp_vecExcpInfo.valid) 147e43bb916SXuan Hu private val sWaitRab_vemul_i_d = RegEnable(sNoExcp_vemul_i_d, sNoExcp_vecExcpInfo.valid) 148e43bb916SXuan Hu private val sWaitRab_dvemulNoLessThanM1 = RegEnable(sNoExcp_dvemulNoLessThanM1, sNoExcp_vecExcpInfo.valid) 149e43bb916SXuan Hu 150e43bb916SXuan Hu private val sWaitRab_rabWriteOffset = Reg(UInt(4.W)) // [1,10] 151e43bb916SXuan Hu private val sWaitRab_ratWriteOffset = Reg(UInt(4.W)) // [1,10] 152e43bb916SXuan Hu 153e43bb916SXuan Hu // segShuffledRegIdxTable(nf)(dvemul)(vdIdx) 154e43bb916SXuan Hu private val segShuffledRegIdxTable: Seq[Seq[Seq[Int]]] = Seq.tabulate(8, 4) { 155e43bb916SXuan Hu case (nf, dvemul) => 156e43bb916SXuan Hu val nField = nf + 1 // 1~8 157e43bb916SXuan Hu val dEMUL = 1 << dvemul // 1, 2, 4, 8 158e43bb916SXuan Hu if (nField == 2 && dEMUL == 2) { 159e43bb916SXuan Hu Seq(0, 2, 1, 3, 0, 0, 0, 0) 160e43bb916SXuan Hu } 161e43bb916SXuan Hu else if (nField == 2 && dEMUL == 4) { 162e43bb916SXuan Hu Seq(0, 4, 1, 5, 2, 6, 3, 7) 163e43bb916SXuan Hu } 164e43bb916SXuan Hu else if (nField == 3 && dEMUL == 2) { 165e43bb916SXuan Hu Seq(0, 2, 4, 1, 3, 5, 0, 0) 166e43bb916SXuan Hu } 167e43bb916SXuan Hu else if (nField == 4 && dEMUL == 2) { 168e43bb916SXuan Hu Seq(0, 2, 4, 6, 1, 3, 5, 7) 169e43bb916SXuan Hu } 170e43bb916SXuan Hu else { 171e43bb916SXuan Hu Seq(0, 1, 2, 3, 4, 5, 6, 7) 172e43bb916SXuan Hu } 173e43bb916SXuan Hu } 174e43bb916SXuan Hu private val segRegTableHW: Vec[Vec[Vec[UInt]]] = WireInit(VecInit.tabulate(8, 4) { 175e43bb916SXuan Hu case (nf, dvemul) => VecInit(segShuffledRegIdxTable(nf)(dvemul).map(_.U(VdIdxInGroupWidth.W))) 176e43bb916SXuan Hu }) 177e43bb916SXuan Hu 178e43bb916SXuan Hu // when nonSegIndexed load, iemul/demul = 1 << 2, vdLoc will be mapped as (0, 1, 2, 3, ...) -> (0, 4, ...) 179e43bb916SXuan Hu private val oldVdLocVec: Vec[UInt] = VecInit(currentIdxVec.map(idx => 180e43bb916SXuan Hu Mux( 181e43bb916SXuan Hu sWaitRab_nonSegIndexed, 182e43bb916SXuan Hu Mux1H(sWaitRab_vemul_i_d.zipWithIndex.map { case (i_d_n, ii) => i_d_n -> (idx << ii).asUInt }), 183e43bb916SXuan Hu Mux( 184e43bb916SXuan Hu sWaitRab_vecExcpInfo.bits.isWhole, 185e43bb916SXuan Hu idx, 186e43bb916SXuan Hu segRegTableHW(sWaitRab_vecExcpInfo.bits.nf)(sWaitRab_dvemulNoLessThanM1)(idx), 187e43bb916SXuan Hu ) 188e43bb916SXuan Hu ).take(VdIdxInGroupWidth) 189e43bb916SXuan Hu )) 190e43bb916SXuan Hu 191e43bb916SXuan Hu // when nonSegIndexed load, iemul/demul = 1 << 2, vdLoc will be mapped as (0, 1, 2, 3, ...) -> (3, 7, ...) 192e43bb916SXuan Hu private val newVdLocVec = VecInit(currentIdxVec.map(idx => 193e43bb916SXuan Hu Mux( 194e43bb916SXuan Hu sWaitRab_nonSegIndexed, 195e43bb916SXuan Hu Mux1H(sWaitRab_vemul_i_d.zipWithIndex.map { case (i_d_n, ii) => i_d_n -> ((idx << ii).asUInt | ((1 << ii) - 1).U) }), 196e43bb916SXuan Hu Mux( 197e43bb916SXuan Hu sWaitRab_vecExcpInfo.bits.isWhole, 198e43bb916SXuan Hu idx, 199e43bb916SXuan Hu segRegTableHW(sWaitRab_vecExcpInfo.bits.nf)(sWaitRab_dvemulNoLessThanM1)(idx), 200e43bb916SXuan Hu ) 201e43bb916SXuan Hu ).take(VdIdxInGroupWidth) 202e43bb916SXuan Hu )) 203e43bb916SXuan Hu 204e43bb916SXuan Hu dontTouch(oldVdLocVec) 205e43bb916SXuan Hu dontTouch(newVdLocVec) 206e43bb916SXuan Hu 207e43bb916SXuan Hu private object State extends ChiselEnum { 208e43bb916SXuan Hu val noExcp = Value 209e43bb916SXuan Hu val waitRab = Value 210e43bb916SXuan Hu val mergeVd = Value 211e43bb916SXuan Hu val mvOldVd = Value 212e43bb916SXuan Hu val finish = Value 213e43bb916SXuan Hu } 214e43bb916SXuan Hu 215e43bb916SXuan Hu private val state: State.Type = RegInit(State.noExcp) 216e43bb916SXuan Hu private val stateNext = WireInit(state) 217e43bb916SXuan Hu state := stateNext 218e43bb916SXuan Hu 219e43bb916SXuan Hu private val collectedAllRegMap = Wire(Bool()) 220e43bb916SXuan Hu private val mergeFinished = currentIdx >= sWaitRab_needMergeUntil 221e43bb916SXuan Hu private val mvFinished = currentIdx >= sWaitRab_handleUntil 222e43bb916SXuan Hu 223e43bb916SXuan Hu // get lreg and new preg, the last mapped newPdest 224e43bb916SXuan Hu private val filteredRabCommitedVec: Vec[Vec[Bool]] = WireInit(VecInit.tabulate(4, MaxLMUL) { case (i_d_n, vdIdx) => 225e43bb916SXuan Hu val vdLoc = ((vdIdx + 1) << i_d_n) - 1 226e43bb916SXuan Hu rabCommitted(if (vdLoc >= MaxLMUL) 0 else vdLoc) 227e43bb916SXuan Hu }) 228e43bb916SXuan Hu // get old preg, the first mapped oldPdest 229e43bb916SXuan Hu private val filteredRatCommitedVec: Vec[Vec[Bool]] = WireInit(VecInit.tabulate(4, MaxLMUL) { case (i_d_n, vdIdx) => 230e43bb916SXuan Hu val vdLoc = vdIdx << i_d_n 231e43bb916SXuan Hu ratCommitted(if (vdLoc >= MaxLMUL) 0 else vdLoc) 232e43bb916SXuan Hu }) 233e43bb916SXuan Hu 234e43bb916SXuan Hu private val filteredRabCommited = Wire(Vec(MaxLMUL, Bool())) 235e43bb916SXuan Hu private val filteredRatCommited = Wire(Vec(MaxLMUL, Bool())) 236e43bb916SXuan Hu when (sWaitRab_nonSegIndexed) { 237e43bb916SXuan Hu filteredRabCommited := Mux1H(sWaitRab_vemul_i_d, filteredRabCommitedVec) 238e43bb916SXuan Hu filteredRatCommited := Mux1H(sWaitRab_vemul_i_d, filteredRatCommitedVec) 239e43bb916SXuan Hu }.otherwise { 240e43bb916SXuan Hu // No need to shuffle, since the vdIdx always compressed towards zero and left tail unused. 241e43bb916SXuan Hu filteredRabCommited := rabCommitted 242e43bb916SXuan Hu filteredRatCommited := ratCommitted 243e43bb916SXuan Hu } 244e43bb916SXuan Hu 245e43bb916SXuan Hu // 1. no need commit 246e43bb916SXuan Hu // 2. need commit and both rab and rat committed 247e43bb916SXuan Hu collectedAllRegMap := ((~commitNeeded.asUInt).asUInt | (commitNeeded.asUInt & filteredRabCommited.asUInt & filteredRatCommited.asUInt)).andR 248e43bb916SXuan Hu 249e43bb916SXuan Hu switch(state) { 250e43bb916SXuan Hu is(State.noExcp) { 251e43bb916SXuan Hu when (i.fromExceptionGen.valid) { 252e43bb916SXuan Hu stateNext := State.waitRab 253e43bb916SXuan Hu } 254e43bb916SXuan Hu } 255e43bb916SXuan Hu is(State.waitRab) { 256e43bb916SXuan Hu when (collectedAllRegMap) { 257e43bb916SXuan Hu stateNext := State.mergeVd 258e43bb916SXuan Hu currentIdx := sWaitRab_useNewVdUntil 259e43bb916SXuan Hu } 260e43bb916SXuan Hu } 261e43bb916SXuan Hu is(State.mergeVd) { 262e43bb916SXuan Hu when (mvFinished) { 263e43bb916SXuan Hu stateNext := State.finish 264e43bb916SXuan Hu }.elsewhen (mergeFinished) { 265e43bb916SXuan Hu stateNext := State.mvOldVd 266e43bb916SXuan Hu } 267e43bb916SXuan Hu when(o.toVPRF.w.head.valid) { 268e43bb916SXuan Hu currentIdx := currentIdx + PopCount(o.toVPRF.w.map(_.valid)) 269e43bb916SXuan Hu } 270e43bb916SXuan Hu } 271e43bb916SXuan Hu is(State.mvOldVd) { 272e43bb916SXuan Hu when (mvFinished) { 273e43bb916SXuan Hu stateNext := State.finish 274e43bb916SXuan Hu } 275e43bb916SXuan Hu when(o.toVPRF.w.head.valid) { 276e43bb916SXuan Hu currentIdx := currentIdx + PopCount(o.toVPRF.w.map(_.valid)) 277e43bb916SXuan Hu } 278e43bb916SXuan Hu } 279e43bb916SXuan Hu is(State.finish) { 280e43bb916SXuan Hu stateNext := State.noExcp 281e43bb916SXuan Hu currentIdx := 0.U 282e43bb916SXuan Hu } 283e43bb916SXuan Hu } 284e43bb916SXuan Hu 285e43bb916SXuan Hu private val regWriteFromRabVec: Vec[ValidIO[RegWriteFromRab]] = i.fromRab.logicPhyRegMap 286e43bb916SXuan Hu private val regWriteFromRatVec: Vec[ValidIO[UInt]] = oldPregVecFromRat 287e43bb916SXuan Hu 288e43bb916SXuan Hu val mergedVdWData: Vec[VecE8Vec] = Wire(Vec(maxMergeNumPerCycle, new VecE8Vec(VLEN))) 289e43bb916SXuan Hu mergedVdWData.zipWithIndex.foreach { case (vd, vIdx) => 290e43bb916SXuan Hu vd.data.zipWithIndex.foreach { case (vde, eIdx) => 291e43bb916SXuan Hu vde := Mux( 292e43bb916SXuan Hu state === State.mergeVd, 293e43bb916SXuan Hu Mux( 294e43bb916SXuan Hu eIdx.U >= sWaitRab_e8offset, 295e43bb916SXuan Hu preMergedOldVd(vIdx).e8Vec(eIdx), 296e43bb916SXuan Hu preMergedNewVd(vIdx).e8Vec(eIdx), 297e43bb916SXuan Hu ), 298e43bb916SXuan Hu preMoveOldVd(vIdx).e8Vec(eIdx), 299e43bb916SXuan Hu ) 300e43bb916SXuan Hu } 301e43bb916SXuan Hu } 302e43bb916SXuan Hu 303e43bb916SXuan Hu private val hasRabWrite = regWriteFromRabVec.head.valid 304e43bb916SXuan Hu private val hasRatWrite = regWriteFromRatVec.head.valid 305e43bb916SXuan Hu require( 306e43bb916SXuan Hu 2 * RabCommitWidth >= (MaxLMUL + 2), 307e43bb916SXuan Hu "Cannot receive all 10 reg maps from RAB and RAT in two cycles. " + 308e43bb916SXuan Hu "This module should be rewrited to support more than 2 cycles receiving" 309e43bb916SXuan Hu ) 310e43bb916SXuan Hu 311e43bb916SXuan Hu switch (state) { 312e43bb916SXuan Hu is (State.noExcp) { 313e43bb916SXuan Hu when (stateNext === State.waitRab) { 314e43bb916SXuan Hu sWaitRab_rabWriteOffset := 0.U 315e43bb916SXuan Hu sWaitRab_ratWriteOffset := 0.U 316e43bb916SXuan Hu commitNeeded.zipWithIndex.foreach { case (needed, idx) => 317e43bb916SXuan Hu needed := sNoExcp_maxVdIdx > idx.U 318e43bb916SXuan Hu } 319e43bb916SXuan Hu } 320e43bb916SXuan Hu } 321e43bb916SXuan Hu is (State.waitRab) { 322e43bb916SXuan Hu when (hasRabWrite) { 323e43bb916SXuan Hu sWaitRab_rabWriteOffset := sWaitRab_rabWriteOffset + 324e43bb916SXuan Hu PriorityMux((0 until RabCommitWidth).map( 325e43bb916SXuan Hu idx => i.fromRab.logicPhyRegMap.reverse(idx).valid -> (6 - idx).U 326e43bb916SXuan Hu )) 327e43bb916SXuan Hu } 328e43bb916SXuan Hu when (hasRatWrite) { 329e43bb916SXuan Hu sWaitRab_ratWriteOffset := sWaitRab_ratWriteOffset + 330e43bb916SXuan Hu PriorityMux((0 until RabCommitWidth).map( 331e43bb916SXuan Hu idx => regWriteFromRatVec.reverse(idx).valid -> (6 - idx).U 332e43bb916SXuan Hu )) 333e43bb916SXuan Hu } 334e43bb916SXuan Hu 335e43bb916SXuan Hu when(sWaitRab_rabWriteOffset === 0.U) { 336e43bb916SXuan Hu // the first patch of RAB commit consider offset 337e43bb916SXuan Hu when(sWaitRab_vecExcpInfo.bits.isStride) { 338e43bb916SXuan Hu (2 until RabCommitWidth).map { idx => 339e43bb916SXuan Hu val vdIdx = idx - 2 340e43bb916SXuan Hu when(regWriteFromRabVec(idx).valid) { 341e43bb916SXuan Hu regMaps(vdIdx).lreg := regWriteFromRabVec(idx).bits.lreg 342e43bb916SXuan Hu regMaps(vdIdx).newPreg := regWriteFromRabVec(idx).bits.preg 343e43bb916SXuan Hu rabCommitted(vdIdx) := true.B 344e43bb916SXuan Hu } 345e43bb916SXuan Hu } 346e43bb916SXuan Hu }.otherwise { 347e43bb916SXuan Hu (1 until RabCommitWidth).map { idx => 348e43bb916SXuan Hu val vdIdx = idx - 1 349e43bb916SXuan Hu when(regWriteFromRabVec(idx).valid) { 350e43bb916SXuan Hu regMaps(vdIdx).lreg := regWriteFromRabVec(idx).bits.lreg 351e43bb916SXuan Hu regMaps(vdIdx).newPreg := regWriteFromRabVec(idx).bits.preg 352e43bb916SXuan Hu rabCommitted(vdIdx) := true.B 353e43bb916SXuan Hu } 354e43bb916SXuan Hu } 355e43bb916SXuan Hu } 356e43bb916SXuan Hu }.otherwise { 357e43bb916SXuan Hu // the second patch of RAB/RAT commit need no offset 358e43bb916SXuan Hu when(sWaitRab_vecExcpInfo.bits.isStride) { 359e43bb916SXuan Hu (0 until (MaxLMUL + 2 - RabCommitWidth)).map { idx => 360e43bb916SXuan Hu val vdIdx = idx - 2 + RabCommitWidth 361e43bb916SXuan Hu when(regWriteFromRabVec(idx).valid) { 362e43bb916SXuan Hu regMaps(vdIdx).lreg := regWriteFromRabVec(idx).bits.lreg 363e43bb916SXuan Hu regMaps(vdIdx).newPreg := regWriteFromRabVec(idx).bits.preg 364e43bb916SXuan Hu rabCommitted(vdIdx) := true.B 365e43bb916SXuan Hu } 366e43bb916SXuan Hu } 367e43bb916SXuan Hu }.otherwise { 368e43bb916SXuan Hu (0 until MaxLMUL + 1 - RabCommitWidth).map { idx => 369e43bb916SXuan Hu val vdIdx = idx - 1 + RabCommitWidth 370e43bb916SXuan Hu when(regWriteFromRabVec(idx).valid) { 371e43bb916SXuan Hu regMaps(vdIdx).lreg := regWriteFromRabVec(idx).bits.lreg 372e43bb916SXuan Hu regMaps(vdIdx).newPreg := regWriteFromRabVec(idx).bits.preg 373e43bb916SXuan Hu rabCommitted(vdIdx) := true.B 374e43bb916SXuan Hu } 375e43bb916SXuan Hu } 376e43bb916SXuan Hu } 377e43bb916SXuan Hu } 378e43bb916SXuan Hu 379e43bb916SXuan Hu when (sWaitRab_ratWriteOffset === 0.U) { 380e43bb916SXuan Hu // the first patch of RAT commit consider offset 381e43bb916SXuan Hu when(sWaitRab_vecExcpInfo.bits.isStride) { 382e43bb916SXuan Hu (2 until RabCommitWidth).map { idx => 383e43bb916SXuan Hu val vdIdx = idx - 2 384e43bb916SXuan Hu when(regWriteFromRatVec(idx).valid) { 385e43bb916SXuan Hu regMaps(vdIdx).oldPreg := regWriteFromRatVec(idx).bits 386e43bb916SXuan Hu ratCommitted(vdIdx) := true.B 387e43bb916SXuan Hu } 388e43bb916SXuan Hu } 389e43bb916SXuan Hu }.otherwise { 390e43bb916SXuan Hu (1 until RabCommitWidth).map { idx => 391e43bb916SXuan Hu val vdIdx = idx - 1 392e43bb916SXuan Hu when(regWriteFromRatVec(idx).valid) { 393e43bb916SXuan Hu regMaps(vdIdx).oldPreg := regWriteFromRatVec(idx).bits 394e43bb916SXuan Hu ratCommitted(vdIdx) := true.B 395e43bb916SXuan Hu } 396e43bb916SXuan Hu } 397e43bb916SXuan Hu } 398e43bb916SXuan Hu }.otherwise { 399e43bb916SXuan Hu // the second patch of RAT commit need no offset 400e43bb916SXuan Hu when(sWaitRab_vecExcpInfo.bits.isStride) { 401e43bb916SXuan Hu (0 until (MaxLMUL + 2 - RabCommitWidth)).map { idx => 402e43bb916SXuan Hu val vdIdx = idx - 2 + RabCommitWidth 403e43bb916SXuan Hu when(regWriteFromRatVec(idx).valid) { 404e43bb916SXuan Hu regMaps(vdIdx).oldPreg := regWriteFromRatVec(idx).bits 405e43bb916SXuan Hu ratCommitted(vdIdx) := true.B 406e43bb916SXuan Hu } 407e43bb916SXuan Hu } 408e43bb916SXuan Hu }.otherwise { 409e43bb916SXuan Hu (0 until MaxLMUL + 1 - RabCommitWidth).map { idx => 410e43bb916SXuan Hu val vdIdx = idx - 1 + RabCommitWidth 411e43bb916SXuan Hu when(regWriteFromRatVec(idx).valid) { 412e43bb916SXuan Hu regMaps(vdIdx).oldPreg := regWriteFromRatVec(idx).bits 413e43bb916SXuan Hu ratCommitted(vdIdx) := true.B 414e43bb916SXuan Hu } 415e43bb916SXuan Hu } 416e43bb916SXuan Hu } 417e43bb916SXuan Hu } 418e43bb916SXuan Hu } 419e43bb916SXuan Hu is (State.finish) { 420e43bb916SXuan Hu commitNeeded.foreach(_ := false.B) 421e43bb916SXuan Hu rabCommitted.foreach(_ := false.B) 422e43bb916SXuan Hu ratCommitted.foreach(_ := false.B) 423e43bb916SXuan Hu hasReadRf .foreach(_ := false.B) 424e43bb916SXuan Hu sWaitRab_rabWriteOffset := 0.U 425e43bb916SXuan Hu sWaitRab_ratWriteOffset := 0.U 426e43bb916SXuan Hu sWaitRab_vecExcpInfo.valid := false.B 427e43bb916SXuan Hu } 428e43bb916SXuan Hu } 429e43bb916SXuan Hu 430e43bb916SXuan Hu switch (state) { 431e43bb916SXuan Hu is (State.mergeVd, State.mvOldVd) { 432e43bb916SXuan Hu (0 until maxMergeNumPerCycle).map(vIdx => 433e43bb916SXuan Hu when(i.fromVprf.rdata(vIdx).valid) { 434e43bb916SXuan Hu mergedVd(vIdx) := mergedVdWData(vIdx).asTypeOf(new VecElemData(VLEN)) 435e43bb916SXuan Hu } 436e43bb916SXuan Hu ) 437e43bb916SXuan Hu } 438e43bb916SXuan Hu } 439e43bb916SXuan Hu 440e43bb916SXuan Hu when (state === State.mergeVd) { 441e43bb916SXuan Hu (0 until maxMergeNumPerCycle).foreach { case (idx) => 442e43bb916SXuan Hu val vdIdx = currentIdxVec(idx) 443e43bb916SXuan Hu // when nonSegIndexed load, iemul/demul = 1 << 2, vdLoc will be mapped as (0, 1, 2, 3, ...) -> (0, 4, ...) 444e43bb916SXuan Hu val oldVdLoc = oldVdLocVec(idx) 445e43bb916SXuan Hu // when nonSegIndexed load, iemul/demul = 1 << 2, vdLoc will be mapped as (0, 1, 2, 3, ...) -> (3, 7, ...) 446e43bb916SXuan Hu val newVdLoc = newVdLocVec(idx) 447e43bb916SXuan Hu o.toVPRF.r(idx).valid := commitNeeded(vdIdx) && !hasReadRf(vdIdx) && vdIdx < sWaitRab_needMergeUntil 448e43bb916SXuan Hu o.toVPRF.r(idx).bits.addr := regMaps(oldVdLoc).oldPreg 449e43bb916SXuan Hu o.toVPRF.r(idx).bits.isV0 := (regMaps(oldVdLoc).lreg === 0.U) && (idx == 0).B 450e43bb916SXuan Hu o.toVPRF.r(idx + maxMergeNumPerCycle).valid := commitNeeded(vdIdx) && !hasReadRf(vdIdx) && vdIdx < sWaitRab_needMergeUntil 451e43bb916SXuan Hu o.toVPRF.r(idx + maxMergeNumPerCycle).bits.addr := regMaps(newVdLoc).newPreg 452e43bb916SXuan Hu o.toVPRF.r(idx + maxMergeNumPerCycle).bits.isV0 := (regMaps(newVdLoc).lreg === 0.U) && (idx == 0).B 453e43bb916SXuan Hu hasReadRf(vdIdx) := true.B && vdIdx < sWaitRab_needMergeUntil 454e43bb916SXuan Hu } 455e43bb916SXuan Hu }.elsewhen (state === State.mvOldVd) { 456e43bb916SXuan Hu (0 until maxMergeNumPerCycle).foreach { case (idx) => 457e43bb916SXuan Hu val vdIdx = currentIdxVec(idx) 458e43bb916SXuan Hu // when nonSegIndexed load, iemul/demul = 1 << 2, vdLoc will be mapped as (0, 1, 2, 3, ...) -> (0, 4, ...) 459e43bb916SXuan Hu val oldVdLoc = oldVdLocVec(idx) 460e43bb916SXuan Hu // when nonSegIndexed load, iemul/demul = 1 << 2, vdLoc will be mapped as (0, 1, 2, 3, ...) -> (3, 7, ...) 461e43bb916SXuan Hu val newVdLoc = newVdLocVec(idx) 462e43bb916SXuan Hu o.toVPRF.r(idx).valid := commitNeeded(vdIdx) && !hasReadRf(vdIdx) && vdIdx < sWaitRab_handleUntil 463e43bb916SXuan Hu o.toVPRF.r(idx).bits.addr := regMaps(oldVdLoc).oldPreg 464e43bb916SXuan Hu o.toVPRF.r(idx).bits.isV0 := (regMaps(oldVdLoc).lreg === 0.U) && (idx == 0).B 465e43bb916SXuan Hu o.toVPRF.r(idx + maxMergeNumPerCycle).valid := 0.U 466e43bb916SXuan Hu o.toVPRF.r(idx + maxMergeNumPerCycle).bits.addr := 0.U 467e43bb916SXuan Hu o.toVPRF.r(idx + maxMergeNumPerCycle).bits.isV0 := false.B 468e43bb916SXuan Hu hasReadRf(vdIdx) := true.B && vdIdx < sWaitRab_handleUntil 469e43bb916SXuan Hu } 470e43bb916SXuan Hu }.otherwise { 471e43bb916SXuan Hu o.toVPRF.r := 0.U.asTypeOf(chiselTypeOf(o.toVPRF.r)) 472e43bb916SXuan Hu } 473e43bb916SXuan Hu 474e43bb916SXuan Hu o.toVPRF.w.zipWithIndex.foreach { case (w, idx) => 475e43bb916SXuan Hu val vdIdx = currentIdxVec(idx) 476e43bb916SXuan Hu // when nonSegIndexed load, iemul/demul = 1 << 2, vdLoc will be mapped as (0, 1, 2, 3, ...) -> (0, 4, ...) 477e43bb916SXuan Hu val oldVdLoc = oldVdLocVec(idx) 478e43bb916SXuan Hu // when nonSegIndexed load, iemul/demul = 1 << 2, vdLoc will be mapped as (0, 1, 2, 3, ...) -> (3, 7, ...) 479e43bb916SXuan Hu val newVdLoc = newVdLocVec(idx) 480e43bb916SXuan Hu w.valid := RegNext(i.fromVprf.rdata(idx).valid) 481e43bb916SXuan Hu w.bits.isV0 := (regMaps(newVdLoc).lreg === 0.U) && (idx == 0).B 482e43bb916SXuan Hu w.bits.newVdAddr := regMaps(newVdLoc).newPreg 483e43bb916SXuan Hu w.bits.newVdData := mergedVd(idx.U).asUInt 484e43bb916SXuan Hu } 485e43bb916SXuan Hu 486e43bb916SXuan Hu o.status.busy := DelayN(state.isOneOf(State.waitRab, State.mergeVd, State.mvOldVd), 1) 487e43bb916SXuan Hu} 488e43bb916SXuan Hu 489e43bb916SXuan Huclass LogicPhyRegMap(implicit p: Parameters) extends XSBundle { 490e43bb916SXuan Hu val lreg = UInt(LogicRegsWidth.W) 491e43bb916SXuan Hu val newPreg = UInt(VfPhyRegIdxWidth.W) 492e43bb916SXuan Hu val oldPreg = UInt(VfPhyRegIdxWidth.W) 493e43bb916SXuan Hu} 494e43bb916SXuan Hu 495e43bb916SXuan Huclass RegWriteFromRab(implicit p: Parameters) extends XSBundle { 496e43bb916SXuan Hu private val maxVregLMUL = 8 497e43bb916SXuan Hu val lreg = UInt(LogicRegsWidth.W) 498e43bb916SXuan Hu val preg = UInt(VfPhyRegIdxWidth.W) 499e43bb916SXuan Hu} 500e43bb916SXuan Hu 501e43bb916SXuan Huclass RabToVecExcpMod(implicit p: Parameters) extends XSBundle { 502e43bb916SXuan Hu val logicPhyRegMap = Vec(RabCommitWidth, ValidIO(new RegWriteFromRab)) 503e43bb916SXuan Hu} 504e43bb916SXuan Hu 505e43bb916SXuan Huclass VecExcpInfo(implicit p: Parameters) extends XSBundle { 506e43bb916SXuan Hu val vstart = Vstart() 507e43bb916SXuan Hu val vsew = VSew() 508e43bb916SXuan Hu val veew = VSew() 509e43bb916SXuan Hu val vlmul = VLmul() 510e43bb916SXuan Hu val nf = Nf() 511e43bb916SXuan Hu val isStride = Bool() 512e43bb916SXuan Hu val isIndexed = Bool() 513e43bb916SXuan Hu val isWhole = Bool() 514e43bb916SXuan Hu val isVlm = Bool() 515e43bb916SXuan Hu} 516e43bb916SXuan Hu 517e43bb916SXuan Huclass RatToVecExcpMod(implicit p: Parameters) extends XSBundle { 518e43bb916SXuan Hu val vecOldVdPdest = Vec(RabCommitWidth, ValidIO(UInt(VfPhyRegIdxWidth.W))) 519e43bb916SXuan Hu val v0OldVdPdest = Vec(RabCommitWidth, ValidIO(UInt(VfPhyRegIdxWidth.W))) 520e43bb916SXuan Hu} 521e43bb916SXuan Hu 522e43bb916SXuan Huclass VprfToExcpMod(numPort: Int)(implicit p: Parameters) extends XSBundle { 523e43bb916SXuan Hu val rdata = Vec(numPort, ValidIO(UInt(VLEN.W))) 524e43bb916SXuan Hu} 525e43bb916SXuan Hu 526e43bb916SXuan Huclass ExcpModToVprf(numReadPort: Int, numWritePort: Int)(implicit p: Parameters) extends XSBundle { 527e43bb916SXuan Hu val r = Vec(numReadPort, ValidIO(new Bundle { 528e43bb916SXuan Hu val isV0 = Bool() 529e43bb916SXuan Hu val addr = UInt(VfPhyRegIdxWidth.W) 530e43bb916SXuan Hu })) 531e43bb916SXuan Hu val w = Vec(numWritePort, ValidIO(new Bundle { 532e43bb916SXuan Hu val isV0 = Bool() 533e43bb916SXuan Hu val newVdAddr = UInt(VfPhyRegIdxWidth.W) 534e43bb916SXuan Hu val newVdData = UInt(VLEN.W) 535e43bb916SXuan Hu })) 536e43bb916SXuan Hu} 537e43bb916SXuan Hu 538e43bb916SXuan Huclass NfMappedElemIdx(vlen: Int) extends Module { 539e43bb916SXuan Hu require(isPow2(vlen)) 540e43bb916SXuan Hu // vlen = 128, idxWidth = 8, hold 0~128 541e43bb916SXuan Hu val idxWidth = log2Up(vlen + 1) 542e43bb916SXuan Hu 543e43bb916SXuan Hu val in = IO(Input(new Bundle { 544e43bb916SXuan Hu val nf = Nf() 545e43bb916SXuan Hu val eewOH = SewOH() 546e43bb916SXuan Hu })) 547e43bb916SXuan Hu val out = IO(Output(new Bundle { 548e43bb916SXuan Hu val idxRangeVec = Vec(8, new HWRange(idxWidth)) 549e43bb916SXuan Hu })) 550e43bb916SXuan Hu 551e43bb916SXuan Hu private val minElemLen = 8 552e43bb916SXuan Hu private val maxElemNumPerVreg = vlen / minElemLen 553e43bb916SXuan Hu 554e43bb916SXuan Hu private val rangeTable: Vec[Vec[HWRange]] = VecInit.tabulate(8, 8) { case(nf, vdIdx) => 555e43bb916SXuan Hu val nFields = nf + 1 556e43bb916SXuan Hu // vector register group 557e43bb916SXuan Hu val vrgIdx = vdIdx / nFields 558e43bb916SXuan Hu HWRange(idxWidth)((maxElemNumPerVreg * vrgIdx).U, (maxElemNumPerVreg * (vrgIdx + 1)).U) 559e43bb916SXuan Hu } 560e43bb916SXuan Hu 561e43bb916SXuan Hu out.idxRangeVec := VecInit(rangeTable.map { case rangeVec: Vec[HWRange] => 562e43bb916SXuan Hu Mux1H( 563e43bb916SXuan Hu (0 until 4).map(i => 564e43bb916SXuan Hu in.eewOH(i) -> VecInit(rangeVec.map( 565e43bb916SXuan Hu x => HWRange(idxWidth)(x.from >> i, x.until >> i) 566e43bb916SXuan Hu )) 567e43bb916SXuan Hu ) 568e43bb916SXuan Hu ) 569e43bb916SXuan Hu })(in.nf) 570e43bb916SXuan Hu 571e43bb916SXuan Hu dontTouch(out.idxRangeVec) 572e43bb916SXuan Hu 573e43bb916SXuan Hu def apply(nf: UInt, eewOH: UInt): Vec[HWRange] = { 574e43bb916SXuan Hu this.in.nf := nf 575e43bb916SXuan Hu this.in.eewOH := eewOH 576e43bb916SXuan Hu this.out.idxRangeVec 577e43bb916SXuan Hu } 578e43bb916SXuan Hu} 579e43bb916SXuan Hu 580e43bb916SXuan Huclass GetE8OffsetInVreg(vlen: Int) extends Module { 581e43bb916SXuan Hu require(isPow2(vlen)) 582e43bb916SXuan Hu private val minElemLen = 8 583e43bb916SXuan Hu private val maxElemNumPerVreg = vlen / minElemLen 584e43bb916SXuan Hu private val tailZeroBit = log2Ceil(maxElemNumPerVreg) // 16 -> 4 585e43bb916SXuan Hu 586e43bb916SXuan Hu val in = IO(Input(new Bundle { 587e43bb916SXuan Hu val eewOH = SewOH() 588e43bb916SXuan Hu val idx = UInt(log2Up(vlen).W) 589e43bb916SXuan Hu })) 590e43bb916SXuan Hu val out = IO(Output(new Bundle { 591e43bb916SXuan Hu val offset = UInt(tailZeroBit.W) 592e43bb916SXuan Hu })) 593e43bb916SXuan Hu 594e43bb916SXuan Hu out.offset := Mux1H( 595e43bb916SXuan Hu (0 until 4).map( 596e43bb916SXuan Hu // eew=32(0b0100), idx=1, get offset=4 597e43bb916SXuan Hu i => in.eewOH(i) -> (in.idx << i) 598e43bb916SXuan Hu ) 599e43bb916SXuan Hu ) 600e43bb916SXuan Hu 601e43bb916SXuan Hu def apply(eewOH: UInt, idx: UInt): UInt = { 602e43bb916SXuan Hu this.in.eewOH := eewOH 603e43bb916SXuan Hu this.in.idx := idx 604e43bb916SXuan Hu this.out.offset 605e43bb916SXuan Hu } 606e43bb916SXuan Hu} 607e43bb916SXuan Hu 608e43bb916SXuan Huclass VecElemData(vlen: Int) extends Bundle { 609e43bb916SXuan Hu val rawData = UInt(vlen.W) 610e43bb916SXuan Hu 611e43bb916SXuan Hu def e8Vec = this.rawData.asTypeOf(new VecE8Vec(vlen)) 612e43bb916SXuan Hu def e16Vec = this.rawData.asTypeOf(new VecE16Vec(vlen)) 613e43bb916SXuan Hu def e32Vec = this.rawData.asTypeOf(new VecE32Vec(vlen)) 614e43bb916SXuan Hu def e64Vec = this.rawData.asTypeOf(new VecE64Vec(vlen)) 615e43bb916SXuan Hu} 616e43bb916SXuan Hu 617e43bb916SXuan Huclass VecE8Vec(vlen: Int) extends Bundle { 618e43bb916SXuan Hu val data = Vec(vlen / 8, UInt(8.W)) 619e43bb916SXuan Hu 620e43bb916SXuan Hu def apply(idx: Int): UInt = this.data(idx) 621e43bb916SXuan Hu} 622e43bb916SXuan Hu 623e43bb916SXuan Huclass VecE16Vec(vlen: Int) extends Bundle { 624e43bb916SXuan Hu val data = Vec(vlen / 16, UInt(16.W)) 625e43bb916SXuan Hu 626e43bb916SXuan Hu def apply(idx: Int): UInt = this.data(idx) 627e43bb916SXuan Hu} 628e43bb916SXuan Hu 629e43bb916SXuan Huclass VecE32Vec(vlen: Int) extends Bundle { 630e43bb916SXuan Hu val data = Vec(vlen / 32, UInt(32.W)) 631e43bb916SXuan Hu 632e43bb916SXuan Hu def apply(idx: Int): UInt = this.data(idx) 633e43bb916SXuan Hu} 634e43bb916SXuan Hu 635e43bb916SXuan Huclass VecE64Vec(vlen: Int) extends Bundle { 636e43bb916SXuan Hu val data = Vec(vlen / 64, UInt(64.W)) 637e43bb916SXuan Hu 638e43bb916SXuan Hu def apply(idx: Int): UInt = this.data(idx) 639e43bb916SXuan Hu} 640e43bb916SXuan Hu 641e43bb916SXuan Huclass HWRange(w: Int) extends Bundle { 642e43bb916SXuan Hu val from = UInt(w.W) 643e43bb916SXuan Hu val until = UInt(w.W) 644e43bb916SXuan Hu 645e43bb916SXuan Hu def inRange(uint: UInt) = { 646e43bb916SXuan Hu uint >= this.from && uint < this.until 647e43bb916SXuan Hu } 648e43bb916SXuan Hu 649e43bb916SXuan Hu def apply(_from: Bits, _until: Bits): this.type = { 650e43bb916SXuan Hu this.from := _from 651e43bb916SXuan Hu this.until := _until 652e43bb916SXuan Hu this 653e43bb916SXuan Hu } 654e43bb916SXuan Hu} 655e43bb916SXuan Hu 656e43bb916SXuan Huobject HWRange { 657e43bb916SXuan Hu def apply(w: Int)(_from: Bits, _until: Bits): HWRange = Wire(new HWRange(w)).apply(_from, _until) 658e43bb916SXuan Hu} 659e43bb916SXuan Hu 660