xref: /XiangShan/src/main/scala/xiangshan/backend/fu/fpu/IntToFP.scala (revision 614d2bc6eead7bc6e6e71c4d6dc850d2d5ad3aef)
1c6d43980SLemover/***************************************************************************************
2c6d43980SLemover* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences
3f320e0f0SYinan Xu* Copyright (c) 2020-2021 Peng Cheng Laboratory
4c6d43980SLemover*
5c6d43980SLemover* XiangShan is licensed under Mulan PSL v2.
6c6d43980SLemover* You can use this software according to the terms and conditions of the Mulan PSL v2.
7c6d43980SLemover* You may obtain a copy of Mulan PSL v2 at:
8c6d43980SLemover*          http://license.coscl.org.cn/MulanPSL2
9c6d43980SLemover*
10c6d43980SLemover* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
11c6d43980SLemover* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
12c6d43980SLemover* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
13c6d43980SLemover*
14c6d43980SLemover* See the Mulan PSL v2 for more details.
15c6d43980SLemover***************************************************************************************/
16c6d43980SLemover
172b16f8ebSLinJiawei// See LICENSE.Berkeley for license details.
182b16f8ebSLinJiawei// See LICENSE.SiFive for license details.
192b16f8ebSLinJiawei
207f1506e3SLinJiaweipackage xiangshan.backend.fu.fpu
217f1506e3SLinJiawei
228891a219SYinan Xuimport org.chipsalliance.cde.config.Parameters
237f1506e3SLinJiaweiimport chisel3._
242dd504e9SLinJiaweiimport chisel3.util._
253c02ee8fSwakafaimport utility.{SignExt, ZeroExt}
26730cfbc0SXuan Huimport xiangshan.backend.fu.FuConfig
27*614d2bc6SHeiHuDieimport yunsuan.scalar
287f1506e3SLinJiawei
29e174d629SJiawei Linclass IntToFPDataModule(latency: Int)(implicit p: Parameters) extends FPUDataModule {
30e174d629SJiawei Lin  val regEnables = IO(Input(Vec(latency, Bool())))
319ca85825SLinJiawei
32e174d629SJiawei Lin  //  stage1
33e174d629SJiawei Lin  val ctrl = io.in.fpCtrl
34e174d629SJiawei Lin  val in = io.in.src(0)
357f1506e3SLinJiawei  val typ = ctrl.typ
36e174d629SJiawei Lin  val intValue = RegEnable(Mux(ctrl.wflags,
37e174d629SJiawei Lin    Mux(typ(1),
38e174d629SJiawei Lin      Mux(typ(0), ZeroExt(in, XLEN), SignExt(in, XLEN)),
39e174d629SJiawei Lin      Mux(typ(0), ZeroExt(in(31, 0), XLEN), SignExt(in(31, 0), XLEN))
40e174d629SJiawei Lin    ),
41e174d629SJiawei Lin    in
42e174d629SJiawei Lin  ), regEnables(0))
43e174d629SJiawei Lin  val ctrlReg = RegEnable(ctrl, regEnables(0))
44e174d629SJiawei Lin  val rmReg = RegEnable(rm, regEnables(0))
45e174d629SJiawei Lin
46e174d629SJiawei Lin  // stage2
47e174d629SJiawei Lin  val s2_tag = ctrlReg.typeTagOut
48e174d629SJiawei Lin  val s2_wflags = ctrlReg.wflags
49e174d629SJiawei Lin  val s2_typ = ctrlReg.typ
507f1506e3SLinJiawei
517f1506e3SLinJiawei  val mux = Wire(new Bundle() {
52dc597826SJiawei Lin    val data = UInt(XLEN.W)
537f1506e3SLinJiawei    val exc = UInt(5.W)
547f1506e3SLinJiawei  })
55dc597826SJiawei Lin
56e174d629SJiawei Lin  mux.data := intValue
577f1506e3SLinJiawei  mux.exc := 0.U
587f1506e3SLinJiawei
59e174d629SJiawei Lin  when(s2_wflags){
60*614d2bc6SHeiHuDie    val i2fResults = for(t <- FPU.ftypes.take(3)) yield {
61*614d2bc6SHeiHuDie      val i2f = Module(new scalar.IntToFP(t.expWidth, t.precision))
62e174d629SJiawei Lin      i2f.io.sign := ~s2_typ(0)
63e174d629SJiawei Lin      i2f.io.long := s2_typ(1)
64dc597826SJiawei Lin      i2f.io.int := intValue
65dc597826SJiawei Lin      i2f.io.rm := rmReg
66dc597826SJiawei Lin      (i2f.io.result, i2f.io.fflags)
677f1506e3SLinJiawei    }
687f1506e3SLinJiawei    val (data, exc) = i2fResults.unzip
69e174d629SJiawei Lin    mux.data := VecInit(data)(s2_tag)
70e174d629SJiawei Lin    mux.exc := VecInit(exc)(s2_tag)
717f1506e3SLinJiawei  }
727f1506e3SLinJiawei
73e174d629SJiawei Lin  // stage3
74e174d629SJiawei Lin  val s3_out = RegEnable(mux, regEnables(1))
75e174d629SJiawei Lin  val s3_tag = RegEnable(s2_tag, regEnables(1))
76e174d629SJiawei Lin
7772d89280SXuan Hu  io.out.fflags := s3_out.exc
78e174d629SJiawei Lin  io.out.data := FPU.box(s3_out.data, s3_tag)
79ba64d2c9SLinJiawei}
802dd504e9SLinJiawei
813b739f49SXuan Huclass IntToFP(cfg: FuConfig)(implicit p: Parameters) extends FPUPipelineModule(cfg) {
82730cfbc0SXuan Hu  override def latency: Int = cfg.latency.latencyVal.get
83e174d629SJiawei Lin  override val dataModule = Module(new IntToFPDataModule(latency))
849ca85825SLinJiawei  connectDataModule
85e174d629SJiawei Lin  dataModule.regEnables <> VecInit((1 to latency) map (i => regEnable(i)))
867f1506e3SLinJiawei}
87