1d91483a6Sfdypackage xiangshan.backend.fu.wrapper 2d91483a6Sfdy 383ba63b3SXuan Huimport org.chipsalliance.cde.config.Parameters 4d91483a6Sfdyimport chisel3._ 5a32c56f4SXuan Huimport utility.ZeroExt 687c5d21dSZiyue Zhangimport xiangshan.{VSETOpType, CSROpType} 7e6ac7fe1SZiyue Zhangimport xiangshan.backend.decode.{Imm_VSETIVLI, Imm_VSETVLI} 8a32c56f4SXuan Huimport xiangshan.backend.decode.isa.bitfield.InstVType 94c8a449fSZiyue Zhangimport xiangshan.backend.fu.vector.Bundles.VsetVType 1078115a00SXuan Huimport xiangshan.backend.fu.{FuConfig, FuncUnit, PipedFuncUnit, VsetModule, VtypeStruct} 11a8db15d8Sfdyimport xiangshan.backend.fu.vector.Bundles.VConfig 12d91483a6Sfdy 1378115a00SXuan Huclass VSetBase(cfg: FuConfig)(implicit p: Parameters) extends PipedFuncUnit(cfg) { 14a8db15d8Sfdy val debugIO = IO(new Bundle() { 15a8db15d8Sfdy val vconfig = Output(VConfig()) 16a8db15d8Sfdy }) 17a32c56f4SXuan Hu protected val in = io.in.bits 18a32c56f4SXuan Hu protected val out = io.out.bits 19d91483a6Sfdy 20a32c56f4SXuan Hu protected val vsetModule = Module(new VsetModule) 21a32c56f4SXuan Hu 226a35d972SXuan Hu protected val flushed = io.in.bits.ctrl.robIdx.needFlush(io.flush) 23a32c56f4SXuan Hu 246a35d972SXuan Hu protected val avlImm = Imm_VSETIVLI().getAvl(in.data.src(1)) 256a35d972SXuan Hu protected val avl = Mux(VSETOpType.isVsetivli(in.ctrl.fuOpType), avlImm, in.data.src(0)) 26a32c56f4SXuan Hu 27e6ac7fe1SZiyue Zhang protected val instVType: InstVType = Mux(VSETOpType.isVsetivli(in.ctrl.fuOpType), Imm_VSETIVLI().getVType(in.data.src(1)), Imm_VSETVLI().getVType(in.data.src(1))) 284c8a449fSZiyue Zhang protected val vtypeImm: VsetVType = VsetVType.fromInstVType(instVType) 294c8a449fSZiyue Zhang protected val vtype: VsetVType = Mux(VSETOpType.isVsetvl(in.ctrl.fuOpType), VsetVType.fromVtypeStruct(in.data.src(1).asTypeOf(new VtypeStruct())), vtypeImm) 30a32c56f4SXuan Hu 316a35d972SXuan Hu vsetModule.io.in.func := in.ctrl.fuOpType 32db7becb6Sxiaofeibao connect0LatencyCtrlSingal 33d91483a6Sfdy io.out.valid := io.in.valid 34d91483a6Sfdy io.in.ready := io.out.ready 35a32c56f4SXuan Hu} 36d91483a6Sfdy 37a32c56f4SXuan Hu 38a32c56f4SXuan Hu/** 39a32c56f4SXuan Hu * Wrapper of VsetModule 40a32c56f4SXuan Hu * This fu is uop of vset which reads two int regs and writes one int regs.<br> 41a32c56f4SXuan Hu * uop: <br/> 42a32c56f4SXuan Hu * [[VSETOpType.uvsetrd_ii]], <br/> 43a32c56f4SXuan Hu * [[VSETOpType.uvsetrd_xi]], <br/> 44a32c56f4SXuan Hu * [[VSETOpType.uvsetrd_xx]], <br/> 45a32c56f4SXuan Hu * [[VSETOpType.uvsetrd_vlmax_i]], <br/> 46a32c56f4SXuan Hu * [[VSETOpType.uvsetrd_vlmax_x]], <br/> 47a32c56f4SXuan Hu * @param cfg [[FuConfig]] 48a32c56f4SXuan Hu * @param p [[Parameters]] 49a32c56f4SXuan Hu */ 50a8db15d8Sfdyclass VSetRiWi(cfg: FuConfig)(implicit p: Parameters) extends VSetBase(cfg) { 51a32c56f4SXuan Hu vsetModule.io.in.avl := avl 52a32c56f4SXuan Hu vsetModule.io.in.vtype := vtype 53a32c56f4SXuan Hu 546a35d972SXuan Hu out.res.data := vsetModule.io.out.vconfig.vl 55a32c56f4SXuan Hu 56a8db15d8Sfdy debugIO.vconfig := vsetModule.io.out.vconfig 57d91483a6Sfdy} 58d91483a6Sfdy 59a32c56f4SXuan Hu/** 60a32c56f4SXuan Hu * Wrapper of VsetModule 61a32c56f4SXuan Hu * This fu is uop of vset which reads two int regs and writes one vf regs.<br> 62a32c56f4SXuan Hu * uop: <br/> 63a32c56f4SXuan Hu * [[VSETOpType.uvsetvcfg_ii]], <br/> 64a32c56f4SXuan Hu * [[VSETOpType.uvsetvcfg_xi]], <br/> 65a32c56f4SXuan Hu * [[VSETOpType.uvsetvcfg_xx]], <br/> 66a32c56f4SXuan Hu * [[VSETOpType.uvsetvcfg_vlmax_i]], <br/> 67a32c56f4SXuan Hu * [[VSETOpType.uvsetvcfg_vlmax_x]], <br/> 68a32c56f4SXuan Hu * @param cfg [[FuConfig]] 69a32c56f4SXuan Hu * @param p [[Parameters]] 70a32c56f4SXuan Hu */ 71a8db15d8Sfdyclass VSetRiWvf(cfg: FuConfig)(implicit p: Parameters) extends VSetBase(cfg) { 72a32c56f4SXuan Hu vsetModule.io.in.avl := avl 73a32c56f4SXuan Hu vsetModule.io.in.vtype := vtype 74b6279fc6SZiyue Zhang val vl = vsetModule.io.out.vconfig.vl 75b6279fc6SZiyue Zhang val vlmax = vsetModule.io.out.vlmax 761436b764SZiyue Zhang val isVsetvl = VSETOpType.isVsetvl(in.ctrl.fuOpType) 77d91483a6Sfdy 78*d29ebcf6SZiyue Zhang out.res.data := vl 79d91483a6Sfdy 80b8db7211Sxiaofeibao if (cfg.writeVlRf) io.vtype.get.bits := vsetModule.io.out.vconfig.vtype 811436b764SZiyue Zhang if (cfg.writeVlRf) io.vtype.get.valid := io.out.valid && isVsetvl 82d88d4328SZiyue Zhang if (cfg.writeVlRf) io.vlIsZero.get := io.out.valid && vl === 0.U 83d88d4328SZiyue Zhang if (cfg.writeVlRf) io.vlIsVlmax.get := io.out.valid && vl === vlmax 84b6279fc6SZiyue Zhang 85a8db15d8Sfdy debugIO.vconfig := vsetModule.io.out.vconfig 86d91483a6Sfdy} 87d91483a6Sfdy 88a32c56f4SXuan Hu/** 89a32c56f4SXuan Hu * Wrapper of VsetModule 90a32c56f4SXuan Hu * This fu is uop of vset which reads two int regs and writes one vf regs.<br> 91a32c56f4SXuan Hu * uop: <br/> 92a32c56f4SXuan Hu * [[VSETOpType.uvsetvcfg_vv]], <br/> 93a32c56f4SXuan Hu * [[VSETOpType.uvsetvcfg_keep_v]], <br/> 94a32c56f4SXuan Hu * @param cfg [[FuConfig]] 95a32c56f4SXuan Hu * @param p [[Parameters]] 96a32c56f4SXuan Hu */ 97a8db15d8Sfdyclass VSetRvfWvf(cfg: FuConfig)(implicit p: Parameters) extends VSetBase(cfg) { 98*d29ebcf6SZiyue Zhang val oldVL = in.data.src(4).asTypeOf(VConfig()).vl 99*d29ebcf6SZiyue Zhang vsetModule.io.in.avl := oldVL 100a32c56f4SXuan Hu vsetModule.io.in.vtype := vtype 101d91483a6Sfdy 102*d29ebcf6SZiyue Zhang val vl = vsetModule.io.out.vconfig.vl 103b6279fc6SZiyue Zhang val vlmax = vsetModule.io.out.vlmax 1041436b764SZiyue Zhang val isVsetvl = VSETOpType.isVsetvl(in.ctrl.fuOpType) 105cc1eb70dSXuan Hu val isReadVl = in.ctrl.fuOpType === VSETOpType.csrrvl 106a8db15d8Sfdy 107*d29ebcf6SZiyue Zhang // csrr vl instruction will use this exu to read vl 108*d29ebcf6SZiyue Zhang out.res.data := Mux(isReadVl, oldVL, vl) 109d91483a6Sfdy 110b8db7211Sxiaofeibao if (cfg.writeVlRf) io.vtype.get.bits := vsetModule.io.out.vconfig.vtype 1111436b764SZiyue Zhang if (cfg.writeVlRf) io.vtype.get.valid := isVsetvl && io.out.valid 112*d29ebcf6SZiyue Zhang if (cfg.writeVlRf) io.vlIsZero.get := io.out.valid && !isReadVl && vl === 0.U 113*d29ebcf6SZiyue Zhang if (cfg.writeVlRf) io.vlIsVlmax.get := io.out.valid && !isReadVl && vl === vlmax 114b6279fc6SZiyue Zhang 115*d29ebcf6SZiyue Zhang debugIO.vconfig := vsetModule.io.out.vconfig 116d91483a6Sfdy} 117