xref: /XiangShan/src/main/scala/xiangshan/backend/fu/wrapper/VSet.scala (revision d29ebcf67d13bee7b390343d6ad33311f88054b1)
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