xref: /XiangShan/src/test/scala/xiangshan/backend/fu/VsetTop.scala (revision a8db15d829fbeffc63c1e3101725a2131cedc087)
1*a8db15d8Sfdypackage xiangshan.backend.fu
2*a8db15d8Sfdy
3*a8db15d8Sfdyimport chisel3._
4*a8db15d8Sfdyimport chisel3.util._
5*a8db15d8Sfdyimport xiangshan.backend.fu.wrapper.{VSetRiWi, VSetRiWvf, VSetRvfWvf}
6*a8db15d8Sfdyimport xiangshan._
7*a8db15d8Sfdyimport chipsalliance.rocketchip.config.Parameters
8*a8db15d8Sfdyimport xiangshan.backend.fu.vector.Bundles.{VConfig, VType, Vl}
9*a8db15d8Sfdy
10*a8db15d8Sfdyclass VsetTop(implicit p: Parameters) extends XSModule {
11*a8db15d8Sfdy
12*a8db15d8Sfdy  val io = IO(new XSBundle{
13*a8db15d8Sfdy    val in = new XSBundle {
14*a8db15d8Sfdy      val avl = Input(UInt(XLEN.W))
15*a8db15d8Sfdy      val vtype = Input(VType())
16*a8db15d8Sfdy      val func  = Input(FuOpType())
17*a8db15d8Sfdy      val oldVl = Input(UInt(8.W))
18*a8db15d8Sfdy    }
19*a8db15d8Sfdy
20*a8db15d8Sfdy    val out = Output(new XSBundle {
21*a8db15d8Sfdy      val vconfig = VConfig()
22*a8db15d8Sfdy    })
23*a8db15d8Sfdy    val debug = new XSBundle() {
24*a8db15d8Sfdy      val fuOpType0 = Output(FuOpType())
25*a8db15d8Sfdy      val src0      = Output(Vec(2, UInt(64.W)))
26*a8db15d8Sfdy      val fuOpType1 = Output(FuOpType())
27*a8db15d8Sfdy      val src1      = Output(Vec(2, UInt(64.W)))
28*a8db15d8Sfdy      val fuOpType2 = Output(FuOpType())
29*a8db15d8Sfdy      val src2      = Output(Vec(2, UInt(64.W)))
30*a8db15d8Sfdy
31*a8db15d8Sfdy    }
32*a8db15d8Sfdy  })
33*a8db15d8Sfdy
34*a8db15d8Sfdy  val vtypeStruct = WireInit(0.U.asTypeOf(new VtypeStruct()))
35*a8db15d8Sfdy  vtypeStruct := VType.toVtypeStruct(io.in.vtype)
36*a8db15d8Sfdy  vtypeStruct.reserved := io.in.avl
37*a8db15d8Sfdy  when(!VSETOpType.isVsetvl(io.in.func)){
38*a8db15d8Sfdy    vtypeStruct.vill := false.B
39*a8db15d8Sfdy  }
40*a8db15d8Sfdy
41*a8db15d8Sfdy  val vsetRiWi = Module(new VSetRiWi(FuConfig.VSetRiWiCfg)(p))
42*a8db15d8Sfdy  val vsetRiWvf = Module(new VSetRiWvf(FuConfig.VSetRiWvfCfg)(p))
43*a8db15d8Sfdy  val vsetRvfWvf = Module(new VSetRvfWvf(FuConfig.VSetRvfWvfCfg)(p))
44*a8db15d8Sfdy
45*a8db15d8Sfdy  vsetRiWi.io.flush := 0.U.asTypeOf(vsetRiWi.io.flush)
46*a8db15d8Sfdy  vsetRiWi.io.in.valid := true.B
47*a8db15d8Sfdy  vsetRiWi.io.out.ready := true.B
48*a8db15d8Sfdy  vsetRiWi.io.in.bits := 0.U.asTypeOf(vsetRiWi.io.in.bits.cloneType)
49*a8db15d8Sfdy  vsetRiWi.io.in.bits.fuOpType := io.in.func
50*a8db15d8Sfdy  vsetRiWi.io.in.bits.src(0) := io.in.avl
51*a8db15d8Sfdy  vsetRiWi.io.in.bits.src(1) := vtypeStruct.asUInt
52*a8db15d8Sfdy
53*a8db15d8Sfdy  vsetRiWvf.io.flush := 0.U.asTypeOf(vsetRiWvf.io.flush)
54*a8db15d8Sfdy  vsetRiWvf.io.in.valid := true.B
55*a8db15d8Sfdy  vsetRiWvf.io.out.ready := true.B
56*a8db15d8Sfdy  vsetRiWvf.io.in.bits := 0.U.asTypeOf(vsetRiWvf.io.in.bits.cloneType)
57*a8db15d8Sfdy  vsetRiWvf.io.in.bits.fuOpType := io.in.func
58*a8db15d8Sfdy  vsetRiWvf.io.in.bits.src(0) := io.in.avl
59*a8db15d8Sfdy  vsetRiWvf.io.in.bits.src(1) := vtypeStruct.asUInt
60*a8db15d8Sfdy
61*a8db15d8Sfdy  val vconfig = WireInit(0.U.asTypeOf(VConfig()))
62*a8db15d8Sfdy  vconfig.vl := io.in.oldVl
63*a8db15d8Sfdy  vsetRvfWvf.io.flush := 0.U.asTypeOf(vsetRvfWvf.io.flush)
64*a8db15d8Sfdy  vsetRvfWvf.io.in.valid := true.B
65*a8db15d8Sfdy  vsetRvfWvf.io.out.ready := true.B
66*a8db15d8Sfdy  vsetRvfWvf.io.in.bits := 0.U.asTypeOf(vsetRvfWvf.io.in.bits.cloneType)
67*a8db15d8Sfdy  vsetRvfWvf.io.in.bits.fuOpType := io.in.func
68*a8db15d8Sfdy  vsetRvfWvf.io.in.bits.src(0) := vconfig.asUInt
69*a8db15d8Sfdy  vsetRvfWvf.io.in.bits.src(1) := Mux(VSETOpType.isVsetvl(io.in.func), vtypeStruct.asUInt, vtypeStruct.asUInt(7, 0))
70*a8db15d8Sfdy
71*a8db15d8Sfdy  val selVsetIVL: Bool =  io.in.func === VSETOpType.uvsetrd_ii ||
72*a8db15d8Sfdy                          io.in.func === VSETOpType.uvsetrd_xi ||
73*a8db15d8Sfdy                          io.in.func === VSETOpType.uvsetrd_xx ||
74*a8db15d8Sfdy                          io.in.func === VSETOpType.uvsetrd_vlmax_i ||
75*a8db15d8Sfdy                          io.in.func === VSETOpType.uvsetrd_vlmax_x
76*a8db15d8Sfdy
77*a8db15d8Sfdy  val selVsetIVConfig: Bool = io.in.func === VSETOpType.uvsetvcfg_ii ||
78*a8db15d8Sfdy                              io.in.func === VSETOpType.uvsetvcfg_xi ||
79*a8db15d8Sfdy                              io.in.func === VSETOpType.uvsetvcfg_xx ||
80*a8db15d8Sfdy                              io.in.func === VSETOpType.uvsetvcfg_vlmax_i ||
81*a8db15d8Sfdy                              io.in.func === VSETOpType.uvsetvcfg_vlmax_x
82*a8db15d8Sfdy
83*a8db15d8Sfdy  val selVsetFVConfig: Bool = io.in.func === VSETOpType.uvsetvcfg_vv ||
84*a8db15d8Sfdy                              io.in.func === VSETOpType.uvsetvcfg_keep_v
85*a8db15d8Sfdy
86*a8db15d8Sfdy  io.out.vconfig := MuxCase(0.U.asTypeOf(VConfig()), Seq(
87*a8db15d8Sfdy    selVsetIVL -> vsetRiWi.debugIO.vconfig,
88*a8db15d8Sfdy    selVsetIVConfig -> vsetRiWvf.debugIO.vconfig,
89*a8db15d8Sfdy    selVsetFVConfig -> vsetRvfWvf.debugIO.vconfig,
90*a8db15d8Sfdy  ))
91*a8db15d8Sfdy
92*a8db15d8Sfdy  io.debug.fuOpType0 := vsetRiWi.io.in.bits.fuOpType
93*a8db15d8Sfdy  io.debug.src0(0) := vsetRiWi.io.in.bits.src(0)
94*a8db15d8Sfdy  io.debug.src0(1) := vsetRiWi.io.in.bits.src(1)
95*a8db15d8Sfdy
96*a8db15d8Sfdy  io.debug.fuOpType1 := vsetRiWvf.io.in.bits.fuOpType
97*a8db15d8Sfdy  io.debug.src1(0) := vsetRiWvf.io.in.bits.src(0)
98*a8db15d8Sfdy  io.debug.src1(1) := vsetRiWvf.io.in.bits.src(1)
99*a8db15d8Sfdy
100*a8db15d8Sfdy  io.debug.fuOpType2 := vsetRvfWvf.io.in.bits.fuOpType
101*a8db15d8Sfdy  io.debug.src2(0) := vsetRvfWvf.io.in.bits.src(0)
102*a8db15d8Sfdy  io.debug.src2(1) := vsetRvfWvf.io.in.bits.src(1)
103*a8db15d8Sfdy}
104