xref: /XiangShan/src/main/scala/xiangshan/backend/fu/vector/ByteMaskTailGen.scala (revision bb2f3f51dd67f6e16e0cc1ffe43368c9fc7e4aef)
195c56213SXuan Hupackage xiangshan.backend.fu.vector
295c56213SXuan Hu
383ba63b3SXuan Huimport org.chipsalliance.cde.config.Parameters
495c56213SXuan Huimport chisel3._
595c56213SXuan Huimport chisel3.util._
695c56213SXuan Huimport xiangshan.backend.fu.vector.Bundles.{VSew, Vl}
795c56213SXuan Huimport xiangshan.backend.fu.vector.utils.{MaskExtractor, UIntToContLow0s, UIntToContLow1s}
8*bb2f3f51STang Haojinimport utility.XSDebug
995c56213SXuan Huimport yunsuan.vector.SewOH
10494bf430Szhanglinjuanimport yunsuan.util.LookupTree
1195c56213SXuan Hu
1295c56213SXuan Hu
1395c56213SXuan Huclass ByteMaskTailGenIO(vlen: Int)(implicit p: Parameters) extends Bundle {
1495c56213SXuan Hu  private val numBytes = vlen / 8
15494bf430Szhanglinjuan  private val maxVLMUL = 8
16494bf430Szhanglinjuan  private val maxVLMAX = 8 * 16 // TODO: parameterize this
17494bf430Szhanglinjuan  private val elemIdxWidth = log2Up(maxVLMAX + 1)
1895c56213SXuan Hu  println(s"elemIdxWidth: $elemIdxWidth")
1995c56213SXuan Hu
2095c56213SXuan Hu  val in = Input(new Bundle {
2195c56213SXuan Hu    val begin = UInt(elemIdxWidth.W)
2295c56213SXuan Hu    val end = UInt(elemIdxWidth.W)
2395c56213SXuan Hu    val vma = Bool()
2495c56213SXuan Hu    val vta = Bool()
2595c56213SXuan Hu    val vsew = VSew()
2695c56213SXuan Hu    val maskUsed = UInt(numBytes.W)
27494bf430Szhanglinjuan    val vdIdx = UInt(3.W)
2895c56213SXuan Hu  })
2995c56213SXuan Hu  val out = Output(new Bundle {
3081cbff07Schengguanghui    val activeEn   = UInt(numBytes.W)
3195c56213SXuan Hu    val agnosticEn = UInt(numBytes.W)
3295c56213SXuan Hu  })
3395c56213SXuan Hu  val debugOnly = Output(new Bundle {
3495c56213SXuan Hu    val startBytes = UInt()
3595c56213SXuan Hu    val vlBytes = UInt()
3695c56213SXuan Hu    val prestartEn = UInt()
3781cbff07Schengguanghui    val bodyEn = UInt()
3895c56213SXuan Hu    val tailEn = UInt()
3995c56213SXuan Hu    val maskEn = UInt()
4095c56213SXuan Hu    val maskAgnosticEn = UInt()
4195c56213SXuan Hu    val tailAgnosticEn = UInt()
4295c56213SXuan Hu    val agnosticEn = UInt()
4395c56213SXuan Hu  })
4495c56213SXuan Hu}
4595c56213SXuan Hu
4695c56213SXuan Huclass ByteMaskTailGen(vlen: Int)(implicit p: Parameters) extends Module {
4795c56213SXuan Hu  require(isPow2(vlen))
4895c56213SXuan Hu
4995c56213SXuan Hu  private val numBytes = vlen / 8
5095c56213SXuan Hu  private val byteWidth = log2Up(numBytes) // vlen=128, numBytes=16, byteWidth=log2(16)=4
51494bf430Szhanglinjuan  private val maxVLMUL = 8
52494bf430Szhanglinjuan  private val maxVLMAX = 8 * 16 // TODO: parameterize this
53494bf430Szhanglinjuan  private val elemIdxWidth = log2Up(maxVLMAX + 1)
5495c56213SXuan Hu
5595c56213SXuan Hu  println(s"numBytes: ${numBytes}, byteWidth: ${byteWidth}")
5695c56213SXuan Hu
5795c56213SXuan Hu  val io = IO(new ByteMaskTailGenIO(vlen))
5895c56213SXuan Hu
5995c56213SXuan Hu  private val eewOH = SewOH(io.in.vsew).oneHot
6095c56213SXuan Hu
61494bf430Szhanglinjuan  private val startBytes = Mux1H(eewOH, Seq.tabulate(4)(x => io.in.begin(elemIdxWidth - 1 - x, 0) << x)).asUInt
62494bf430Szhanglinjuan  private val vlBytes    = Mux1H(eewOH, Seq.tabulate(4)(x => io.in.end(elemIdxWidth - 1 - x, 0) << x)).asUInt
63494bf430Szhanglinjuan  private val vdIdx      = io.in.vdIdx
6495c56213SXuan Hu
65494bf430Szhanglinjuan  private val prestartEn = UIntToContLow1s(startBytes, maxVLMAX)
6681cbff07Schengguanghui  private val bodyEn = UIntToContLow0s(startBytes, maxVLMAX) & UIntToContLow1s(vlBytes, maxVLMAX)
67494bf430Szhanglinjuan  private val tailEn = UIntToContLow0s(vlBytes, maxVLMAX)
68494bf430Szhanglinjuan  private val prestartEnInVd = LookupTree(vdIdx, (0 until maxVLMUL).map(i => i.U -> prestartEn((i+1)*numBytes - 1, i*numBytes)))
6981cbff07Schengguanghui  private val bodyEnInVd = LookupTree(vdIdx, (0 until maxVLMUL).map(i => i.U -> bodyEn((i+1)*numBytes - 1, i*numBytes)))
70494bf430Szhanglinjuan  private val tailEnInVd = LookupTree(vdIdx, (0 until maxVLMUL).map(i => i.U -> tailEn((i+1)*numBytes - 1, i*numBytes)))
7195c56213SXuan Hu
7295c56213SXuan Hu  private val maskEn = MaskExtractor(vlen)(io.in.maskUsed, io.in.vsew)
7395c56213SXuan Hu  private val maskOffEn = (~maskEn).asUInt
7481cbff07Schengguanghui  private val maskAgnosticEn = Mux(io.in.vma, maskOffEn, 0.U) & bodyEnInVd
7595c56213SXuan Hu
76494bf430Szhanglinjuan  private val tailAgnosticEn = Mux(io.in.vta, tailEnInVd, 0.U)
7795c56213SXuan Hu
7881cbff07Schengguanghui  private val activeEn = Mux(io.in.begin >= io.in.end, 0.U(numBytes.W), bodyEnInVd & maskEn)
79382346a1Szhanglinjuan  private val agnosticEn = Mux(io.in.begin >= io.in.end, 0.U(numBytes.W), maskAgnosticEn | tailAgnosticEn)
8095c56213SXuan Hu
81494bf430Szhanglinjuan  // TODO: delete me later
82494bf430Szhanglinjuan  dontTouch(eewOH)
83494bf430Szhanglinjuan  dontTouch(startBytes)
84494bf430Szhanglinjuan  dontTouch(vlBytes)
85494bf430Szhanglinjuan  dontTouch(vdIdx)
86494bf430Szhanglinjuan  dontTouch(prestartEn)
8781cbff07Schengguanghui  dontTouch(bodyEn)
88494bf430Szhanglinjuan  dontTouch(tailEn)
89494bf430Szhanglinjuan  dontTouch(prestartEnInVd)
9081cbff07Schengguanghui  dontTouch(bodyEnInVd)
91494bf430Szhanglinjuan  dontTouch(tailEnInVd)
92494bf430Szhanglinjuan  dontTouch(maskEn)
93494bf430Szhanglinjuan  dontTouch(maskOffEn)
94494bf430Szhanglinjuan  dontTouch(maskAgnosticEn)
95494bf430Szhanglinjuan  dontTouch(tailAgnosticEn)
96494bf430Szhanglinjuan
9781cbff07Schengguanghui  io.out.activeEn := activeEn
9895c56213SXuan Hu  io.out.agnosticEn := agnosticEn
9995c56213SXuan Hu
10095c56213SXuan Hu  io.debugOnly.startBytes := startBytes
10195c56213SXuan Hu  io.debugOnly.vlBytes := vlBytes
102494bf430Szhanglinjuan  io.debugOnly.prestartEn := prestartEnInVd
10381cbff07Schengguanghui  io.debugOnly.bodyEn := bodyEn
104494bf430Szhanglinjuan  io.debugOnly.tailEn := tailEnInVd
10595c56213SXuan Hu  io.debugOnly.maskEn := maskEn
10695c56213SXuan Hu  io.debugOnly.maskAgnosticEn := maskAgnosticEn
10795c56213SXuan Hu  io.debugOnly.tailAgnosticEn := tailAgnosticEn
10895c56213SXuan Hu  io.debugOnly.agnosticEn := agnosticEn
10995c56213SXuan Hu}
11095c56213SXuan Hu
111