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