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