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