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