xref: /XiangShan/src/main/scala/xiangshan/backend/fu/FunctionUnit.scala (revision bb2f3f51dd67f6e16e0cc1ffe43368c9fc7e4aef)
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