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