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