xref: /XiangShan/src/test/scala/xiangshan/backend/fu/VsetTop.scala (revision 83ba63b34cf09b33c0a9e1b3203138e51af4491b)
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