1*a8db15d8Sfdypackage xiangshan.backend.fu 2*a8db15d8Sfdy 3*a8db15d8Sfdyimport chisel3._ 4*a8db15d8Sfdyimport chisel3.util._ 5*a8db15d8Sfdyimport xiangshan.backend.fu.wrapper.{VSetRiWi, VSetRiWvf, VSetRvfWvf} 6*a8db15d8Sfdyimport xiangshan._ 7*a8db15d8Sfdyimport chipsalliance.rocketchip.config.Parameters 8*a8db15d8Sfdyimport xiangshan.backend.fu.vector.Bundles.{VConfig, VType, Vl} 9*a8db15d8Sfdy 10*a8db15d8Sfdyclass VsetTop(implicit p: Parameters) extends XSModule { 11*a8db15d8Sfdy 12*a8db15d8Sfdy val io = IO(new XSBundle{ 13*a8db15d8Sfdy val in = new XSBundle { 14*a8db15d8Sfdy val avl = Input(UInt(XLEN.W)) 15*a8db15d8Sfdy val vtype = Input(VType()) 16*a8db15d8Sfdy val func = Input(FuOpType()) 17*a8db15d8Sfdy val oldVl = Input(UInt(8.W)) 18*a8db15d8Sfdy } 19*a8db15d8Sfdy 20*a8db15d8Sfdy val out = Output(new XSBundle { 21*a8db15d8Sfdy val vconfig = VConfig() 22*a8db15d8Sfdy }) 23*a8db15d8Sfdy val debug = new XSBundle() { 24*a8db15d8Sfdy val fuOpType0 = Output(FuOpType()) 25*a8db15d8Sfdy val src0 = Output(Vec(2, UInt(64.W))) 26*a8db15d8Sfdy val fuOpType1 = Output(FuOpType()) 27*a8db15d8Sfdy val src1 = Output(Vec(2, UInt(64.W))) 28*a8db15d8Sfdy val fuOpType2 = Output(FuOpType()) 29*a8db15d8Sfdy val src2 = Output(Vec(2, UInt(64.W))) 30*a8db15d8Sfdy 31*a8db15d8Sfdy } 32*a8db15d8Sfdy }) 33*a8db15d8Sfdy 34*a8db15d8Sfdy val vtypeStruct = WireInit(0.U.asTypeOf(new VtypeStruct())) 35*a8db15d8Sfdy vtypeStruct := VType.toVtypeStruct(io.in.vtype) 36*a8db15d8Sfdy vtypeStruct.reserved := io.in.avl 37*a8db15d8Sfdy when(!VSETOpType.isVsetvl(io.in.func)){ 38*a8db15d8Sfdy vtypeStruct.vill := false.B 39*a8db15d8Sfdy } 40*a8db15d8Sfdy 41*a8db15d8Sfdy val vsetRiWi = Module(new VSetRiWi(FuConfig.VSetRiWiCfg)(p)) 42*a8db15d8Sfdy val vsetRiWvf = Module(new VSetRiWvf(FuConfig.VSetRiWvfCfg)(p)) 43*a8db15d8Sfdy val vsetRvfWvf = Module(new VSetRvfWvf(FuConfig.VSetRvfWvfCfg)(p)) 44*a8db15d8Sfdy 45*a8db15d8Sfdy vsetRiWi.io.flush := 0.U.asTypeOf(vsetRiWi.io.flush) 46*a8db15d8Sfdy vsetRiWi.io.in.valid := true.B 47*a8db15d8Sfdy vsetRiWi.io.out.ready := true.B 48*a8db15d8Sfdy vsetRiWi.io.in.bits := 0.U.asTypeOf(vsetRiWi.io.in.bits.cloneType) 49*a8db15d8Sfdy vsetRiWi.io.in.bits.fuOpType := io.in.func 50*a8db15d8Sfdy vsetRiWi.io.in.bits.src(0) := io.in.avl 51*a8db15d8Sfdy vsetRiWi.io.in.bits.src(1) := vtypeStruct.asUInt 52*a8db15d8Sfdy 53*a8db15d8Sfdy vsetRiWvf.io.flush := 0.U.asTypeOf(vsetRiWvf.io.flush) 54*a8db15d8Sfdy vsetRiWvf.io.in.valid := true.B 55*a8db15d8Sfdy vsetRiWvf.io.out.ready := true.B 56*a8db15d8Sfdy vsetRiWvf.io.in.bits := 0.U.asTypeOf(vsetRiWvf.io.in.bits.cloneType) 57*a8db15d8Sfdy vsetRiWvf.io.in.bits.fuOpType := io.in.func 58*a8db15d8Sfdy vsetRiWvf.io.in.bits.src(0) := io.in.avl 59*a8db15d8Sfdy vsetRiWvf.io.in.bits.src(1) := vtypeStruct.asUInt 60*a8db15d8Sfdy 61*a8db15d8Sfdy val vconfig = WireInit(0.U.asTypeOf(VConfig())) 62*a8db15d8Sfdy vconfig.vl := io.in.oldVl 63*a8db15d8Sfdy vsetRvfWvf.io.flush := 0.U.asTypeOf(vsetRvfWvf.io.flush) 64*a8db15d8Sfdy vsetRvfWvf.io.in.valid := true.B 65*a8db15d8Sfdy vsetRvfWvf.io.out.ready := true.B 66*a8db15d8Sfdy vsetRvfWvf.io.in.bits := 0.U.asTypeOf(vsetRvfWvf.io.in.bits.cloneType) 67*a8db15d8Sfdy vsetRvfWvf.io.in.bits.fuOpType := io.in.func 68*a8db15d8Sfdy vsetRvfWvf.io.in.bits.src(0) := vconfig.asUInt 69*a8db15d8Sfdy vsetRvfWvf.io.in.bits.src(1) := Mux(VSETOpType.isVsetvl(io.in.func), vtypeStruct.asUInt, vtypeStruct.asUInt(7, 0)) 70*a8db15d8Sfdy 71*a8db15d8Sfdy val selVsetIVL: Bool = io.in.func === VSETOpType.uvsetrd_ii || 72*a8db15d8Sfdy io.in.func === VSETOpType.uvsetrd_xi || 73*a8db15d8Sfdy io.in.func === VSETOpType.uvsetrd_xx || 74*a8db15d8Sfdy io.in.func === VSETOpType.uvsetrd_vlmax_i || 75*a8db15d8Sfdy io.in.func === VSETOpType.uvsetrd_vlmax_x 76*a8db15d8Sfdy 77*a8db15d8Sfdy val selVsetIVConfig: Bool = io.in.func === VSETOpType.uvsetvcfg_ii || 78*a8db15d8Sfdy io.in.func === VSETOpType.uvsetvcfg_xi || 79*a8db15d8Sfdy io.in.func === VSETOpType.uvsetvcfg_xx || 80*a8db15d8Sfdy io.in.func === VSETOpType.uvsetvcfg_vlmax_i || 81*a8db15d8Sfdy io.in.func === VSETOpType.uvsetvcfg_vlmax_x 82*a8db15d8Sfdy 83*a8db15d8Sfdy val selVsetFVConfig: Bool = io.in.func === VSETOpType.uvsetvcfg_vv || 84*a8db15d8Sfdy io.in.func === VSETOpType.uvsetvcfg_keep_v 85*a8db15d8Sfdy 86*a8db15d8Sfdy io.out.vconfig := MuxCase(0.U.asTypeOf(VConfig()), Seq( 87*a8db15d8Sfdy selVsetIVL -> vsetRiWi.debugIO.vconfig, 88*a8db15d8Sfdy selVsetIVConfig -> vsetRiWvf.debugIO.vconfig, 89*a8db15d8Sfdy selVsetFVConfig -> vsetRvfWvf.debugIO.vconfig, 90*a8db15d8Sfdy )) 91*a8db15d8Sfdy 92*a8db15d8Sfdy io.debug.fuOpType0 := vsetRiWi.io.in.bits.fuOpType 93*a8db15d8Sfdy io.debug.src0(0) := vsetRiWi.io.in.bits.src(0) 94*a8db15d8Sfdy io.debug.src0(1) := vsetRiWi.io.in.bits.src(1) 95*a8db15d8Sfdy 96*a8db15d8Sfdy io.debug.fuOpType1 := vsetRiWvf.io.in.bits.fuOpType 97*a8db15d8Sfdy io.debug.src1(0) := vsetRiWvf.io.in.bits.src(0) 98*a8db15d8Sfdy io.debug.src1(1) := vsetRiWvf.io.in.bits.src(1) 99*a8db15d8Sfdy 100*a8db15d8Sfdy io.debug.fuOpType2 := vsetRvfWvf.io.in.bits.fuOpType 101*a8db15d8Sfdy io.debug.src2(0) := vsetRvfWvf.io.in.bits.src(0) 102*a8db15d8Sfdy io.debug.src2(1) := vsetRvfWvf.io.in.bits.src(1) 103*a8db15d8Sfdy} 104