xref: /XiangShan/src/main/scala/xiangshan/backend/fu/vector/Utils.scala (revision 2559805febfb8dd49c75222f38419f3721f099d8)
1package xiangshan.backend.fu.vector
2
3import chisel3._
4import chisel3.util.Mux1H
5import xiangshan.backend.fu.vector.Bundles.VSew
6
7object Utils {
8  def VecDataToMaskDataVec(vecData: UInt, vsew: UInt): Vec[UInt] = {
9    val maskWidth = vecData.getWidth / 8
10    val maskDataVec = Wire(Vec(8, UInt(maskWidth.W)))
11    require(8 * maskWidth == vecData.getWidth, "can not split this vector data into mask data vec")
12    for ((maskData, i) <- maskDataVec.zipWithIndex) {
13      maskData := Mux1H(Seq(
14        (vsew === VSew.e8)  -> vecData((i + 1) * maskWidth     - 1, i * maskWidth    ),
15        (vsew === VSew.e16) -> vecData((i + 1) * maskWidth / 2 - 1, i * maskWidth / 2),
16        (vsew === VSew.e32) -> vecData((i + 1) * maskWidth / 4 - 1, i * maskWidth / 4),
17        (vsew === VSew.e64) -> vecData((i + 1) * maskWidth / 8 - 1, i * maskWidth / 8),
18      ))
19    }
20    maskDataVec
21  }
22}
23