xref: /XiangShan/src/main/scala/xiangshan/backend/fu/fpu/FPUSubModule.scala (revision 9e200047e3e84d1588ae9ea8bd96d3eade2c7638)
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
17b5a00ce7SLinJiaweipackage xiangshan.backend.fu.fpu
18b5a00ce7SLinJiawei
198891a219SYinan Xuimport org.chipsalliance.cde.config.Parameters
20b5a00ce7SLinJiaweiimport chisel3._
21b5a00ce7SLinJiaweiimport chisel3.util._
22730cfbc0SXuan Huimport xiangshan.backend.fu.{FuncUnit, HasPipelineReg}
23730cfbc0SXuan Huimport xiangshan.backend.fu.FuConfig
2472d89280SXuan Huimport xiangshan.{FPUCtrlSignals, XSModule}
25b5a00ce7SLinJiawei
26b5a00ce7SLinJiaweitrait HasUIntToSIntHelper {
27b5a00ce7SLinJiawei  implicit class UIntToSIntHelper(x: UInt){
28935edac4STang Haojin    def toSInt: SInt = Cat(0.U(1.W), x).asSInt
29b5a00ce7SLinJiawei  }
30b5a00ce7SLinJiawei}
31b5a00ce7SLinJiawei
322225d46eSJiawei Linabstract class FPUDataModule(implicit p: Parameters) extends XSModule {
339ca85825SLinJiawei  val io = IO(new Bundle() {
349ca85825SLinJiawei    val in = Input(new Bundle() {
35dc597826SJiawei Lin      val src = Vec(3, UInt(64.W))
369ca85825SLinJiawei      val fpCtrl = new FPUCtrlSignals
379ca85825SLinJiawei      val rm = UInt(3.W)
389ca85825SLinJiawei    })
399ca85825SLinJiawei    val out = Output(new Bundle() {
40dc597826SJiawei Lin      val data = UInt(64.W)
419ca85825SLinJiawei      val fflags = UInt(5.W)
429ca85825SLinJiawei    })
439ca85825SLinJiawei  })
449ca85825SLinJiawei
4572d89280SXuan Hu  val rm = Mux(io.in.fpCtrl.rm === "b111".U, io.in.rm, io.in.fpCtrl.rm)
469ca85825SLinJiawei}
479ca85825SLinJiawei
483b739f49SXuan Huabstract class FPUSubModule(cfg: FuConfig)(implicit p: Parameters) extends FuncUnit(cfg)
49e18c367fSLinJiawei  with HasUIntToSIntHelper
50e18c367fSLinJiawei{
519ca85825SLinJiawei  val dataModule: FPUDataModule
529ca85825SLinJiawei  def connectDataModule = {
533b739f49SXuan Hu    for (i <- 0 until dataModule.io.in.src.length) {
546a35d972SXuan Hu      dataModule.io.in.src(i) := (if (i < io.in.bits.data.src.length) io.in.bits.data.src(i) else 0.U)
553b739f49SXuan Hu    }
566a35d972SXuan Hu    io.in.bits.ctrl.fpu.foreach(_ <> dataModule.io.in.fpCtrl)
573b739f49SXuan Hu    dataModule.io.in.rm <> io.frm.get
586a35d972SXuan Hu    io.out.bits.res.data := dataModule.io.out.data
596a35d972SXuan Hu    io.out.bits.res.fflags.get := dataModule.io.out.fflags
609ca85825SLinJiawei  }
614b65fc7eSJiawei Lin  def invert_sign(x: UInt, len: Int) = {
624b65fc7eSJiawei Lin    Cat(
634b65fc7eSJiawei Lin      !x(len-1), x(len-2, 0)
644b65fc7eSJiawei Lin    )
654b65fc7eSJiawei Lin  }
66e18c367fSLinJiawei}
671df1dea4SLinJiawei
683b739f49SXuan Huabstract class FPUPipelineModule(cfg: FuConfig)(implicit p: Parameters)
693b739f49SXuan Hu  extends FPUSubModule(cfg)
70e18c367fSLinJiawei  with HasPipelineReg
71*9e200047Slewislzh{
72*9e200047Slewislzh  override def latency: Int = cfg.latency.latencyVal.get
73*9e200047Slewislzh}
74