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 17cafb3558SLinJiaweipackage xiangshan.backend.fu 18cafb3558SLinJiawei 198891a219SYinan Xuimport org.chipsalliance.cde.config.Parameters 20cafb3558SLinJiaweiimport chisel3._ 21cafb3558SLinJiaweiimport chisel3.util._ 22*bb2f3f51STang Haojinimport utility.XSPerfAccumulate 23cafb3558SLinJiaweiimport xiangshan._ 24e18c367fSLinJiaweiimport xiangshan.backend.fu.fpu._ 25cafb3558SLinJiawei 263e60a357SLinJiaweitrait HasFuLatency { 273e60a357SLinJiawei val latencyVal: Option[Int] 289e200047Slewislzh val extraLatencyVal: Option[Int] 2923c67001SHaojin Tang val uncertainLatencyVal: Option[Int] 307ffbf5fdSZhaoyang You val uncertainEnable: Option[Int] 313e60a357SLinJiawei} 323e60a357SLinJiawei 339e200047Slewislzhcase class CertainLatency(value: Int, extraValue: Int = 0) extends HasFuLatency { 349e200047Slewislzh override val latencyVal: Option[Int] = Some(value + extraValue) 359e200047Slewislzh override val extraLatencyVal: Option[Int] = Some(extraValue) 3623c67001SHaojin Tang override val uncertainLatencyVal: Option[Int] = None 377ffbf5fdSZhaoyang You override val uncertainEnable: Option[Int] = None 383e60a357SLinJiawei} 393e60a357SLinJiawei 4023c67001SHaojin Tangcase class UncertainLatency(value: Option[Int]) extends HasFuLatency { 413e60a357SLinJiawei override val latencyVal: Option[Int] = None 429e200047Slewislzh override val extraLatencyVal: Option[Int] = None 4323c67001SHaojin Tang override val uncertainLatencyVal: Option[Int] = value 447ffbf5fdSZhaoyang You override val uncertainEnable: Option[Int] = Some(0) // for gate uncertain fu 4523c67001SHaojin Tang} 4623c67001SHaojin Tang 4723c67001SHaojin Tangobject UncertainLatency { 4823c67001SHaojin Tang def apply(): UncertainLatency = UncertainLatency(None) 4923c67001SHaojin Tang def apply(value: Int): UncertainLatency = UncertainLatency(Some(value)) 503e60a357SLinJiawei} 513e60a357SLinJiawei 522225d46eSJiawei Linclass FuOutput(val len: Int)(implicit p: Parameters) extends XSBundle { 53e50fb2d7SLinJiawei val data = UInt(len.W) 54e18c367fSLinJiawei val uop = new MicroOp 55e18c367fSLinJiawei} 56e18c367fSLinJiawei 576cdd85d9SYinan Xuclass FunctionUnitInput(val len: Int)(implicit p: Parameters) extends XSBundle { 5852c3f215SLinJiawei val src = Vec(3, UInt(len.W)) 5914521086SLinJiawei val uop = new MicroOp 606cdd85d9SYinan Xu} 616cdd85d9SYinan Xu 626cdd85d9SYinan Xuclass FunctionUnitIO(val len: Int)(implicit p: Parameters) extends XSBundle { 636cdd85d9SYinan Xu val in = Flipped(DecoupledIO(new FunctionUnitInput(len))) 64ead41f51SLinJiawei 65e50fb2d7SLinJiawei val out = DecoupledIO(new FuOutput(len)) 66ead41f51SLinJiawei 6714521086SLinJiawei val redirectIn = Flipped(ValidIO(new Redirect)) 6814521086SLinJiawei} 6914521086SLinJiawei 702225d46eSJiawei Linabstract class FunctionUnit(len: Int = 64)(implicit p: Parameters) extends XSModule { 7114521086SLinJiawei 7252c3f215SLinJiawei val io = IO(new FunctionUnitIO(len)) 7314521086SLinJiawei 741a2cf152SYinan Xu XSPerfAccumulate("in_valid", io.in.valid) 751a2cf152SYinan Xu XSPerfAccumulate("in_fire", io.in.fire) 761a2cf152SYinan Xu XSPerfAccumulate("out_valid", io.out.valid) 771a2cf152SYinan Xu XSPerfAccumulate("out_fire", io.out.fire) 781a2cf152SYinan Xu 7914521086SLinJiawei} 80