xref: /XiangShan/src/main/scala/xiangshan/backend/VecExcpDataMergeModule.scala (revision 71c0165fa5c2925e0bf31c3cf0e308e3292f71e9)
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