xref: /XiangShan/src/main/scala/xiangshan/frontend/Composer.scala (revision cf7d6b7a1a781c73aeb87de112de2e7fe5ea3b7c)
109c6f1ddSLingrui98/***************************************************************************************
209c6f1ddSLingrui98* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences
309c6f1ddSLingrui98* Copyright (c) 2020-2021 Peng Cheng Laboratory
409c6f1ddSLingrui98*
509c6f1ddSLingrui98* XiangShan is licensed under Mulan PSL v2.
609c6f1ddSLingrui98* You can use this software according to the terms and conditions of the Mulan PSL v2.
709c6f1ddSLingrui98* You may obtain a copy of Mulan PSL v2 at:
809c6f1ddSLingrui98*          http://license.coscl.org.cn/MulanPSL2
909c6f1ddSLingrui98*
1009c6f1ddSLingrui98* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
1109c6f1ddSLingrui98* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
1209c6f1ddSLingrui98* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
1309c6f1ddSLingrui98*
1409c6f1ddSLingrui98* See the Mulan PSL v2 for more details.
1509c6f1ddSLingrui98***************************************************************************************/
1609c6f1ddSLingrui98
1709c6f1ddSLingrui98package xiangshan.frontend
1809c6f1ddSLingrui98
1909c6f1ddSLingrui98import chisel3._
2009c6f1ddSLingrui98import chisel3.util._
21*cf7d6b7aSMuziimport org.chipsalliance.cde.config.Parameters
223c02ee8fSwakafaimport utility._
23*cf7d6b7aSMuziimport utils._
24*cf7d6b7aSMuziimport xiangshan._
2509c6f1ddSLingrui98
261ca0e4f3SYinan Xuclass Composer(implicit p: Parameters) extends BasePredictor with HasBPUConst with HasPerfEvents {
27bf358e08SLingrui98  val (components, resp) = getBPDComponents(io.in.bits.resp_in(0), p)
28c2d1ec7dSLingrui98  io.out := resp
29b60e4b0bSLingrui98  // shorter path for s1 pred
30b60e4b0bSLingrui98  val all_fast_pred = components.filter(_.is_fast_pred)
31b60e4b0bSLingrui98  require(all_fast_pred.length <= 1)
32b60e4b0bSLingrui98  if (all_fast_pred.length == 1) {
33b60e4b0bSLingrui98    val fast_pred = all_fast_pred(0)
34b60e4b0bSLingrui98    println("[composer] bypassing output of fast pred: " + fast_pred.name)
35b60e4b0bSLingrui98    io.out.s1 := fast_pred.io.out.s1
36b60e4b0bSLingrui98  }
3709c6f1ddSLingrui98
3809c6f1ddSLingrui98  var metas   = 0.U(1.W)
3909c6f1ddSLingrui98  var meta_sz = 0
4009c6f1ddSLingrui98  for (c <- components) {
41c4b44470SGuokai Chen    c.io.reset_vector           := io.reset_vector
4209c6f1ddSLingrui98    c.io.in.valid               := io.in.valid
4309c6f1ddSLingrui98    c.io.in.bits.s0_pc          := io.in.bits.s0_pc
44dd6c0695SLingrui98    c.io.in.bits.folded_hist    := io.in.bits.folded_hist
45c4a59f19SYuandongliang    c.io.in.bits.s1_folded_hist := io.in.bits.s1_folded_hist
4686d9c530SLingrui98    c.io.in.bits.ghist          := io.in.bits.ghist
4709c6f1ddSLingrui98
4809c6f1ddSLingrui98    c.io.s0_fire := io.s0_fire
4909c6f1ddSLingrui98    c.io.s1_fire := io.s1_fire
5009c6f1ddSLingrui98    c.io.s2_fire := io.s2_fire
51ba246ba1SLingrui98    c.io.s3_fire := io.s3_fire
5209c6f1ddSLingrui98
5385670bacSLingrui98    c.io.s2_redirect := io.s2_redirect
5485670bacSLingrui98    c.io.s3_redirect := io.s3_redirect
5585670bacSLingrui98
5609c6f1ddSLingrui98    c.io.redirect        := io.redirect
576ee06c7aSSteve Gou    c.io.ctrl            := DelayN(io.ctrl, 1)
58fd3aa057SYuandongliang    c.io.redirectFromIFU := io.redirectFromIFU
5909c6f1ddSLingrui98
6009c6f1ddSLingrui98    if (c.meta_size > 0) {
613e52bed1SLingrui98      metas = (metas << c.meta_size) | c.io.out.last_stage_meta(c.meta_size - 1, 0)
6209c6f1ddSLingrui98    }
6309c6f1ddSLingrui98    meta_sz = meta_sz + c.meta_size
6409c6f1ddSLingrui98  }
651bc6e9c8SLingrui98  println(s"total meta size: $meta_sz\n\n")
6609c6f1ddSLingrui98
6709c6f1ddSLingrui98  io.in.ready := components.map(_.io.s1_ready).reduce(_ && _)
6809c6f1ddSLingrui98
6909c6f1ddSLingrui98  io.s1_ready := components.map(_.io.s1_ready).reduce(_ && _)
7009c6f1ddSLingrui98  io.s2_ready := components.map(_.io.s2_ready).reduce(_ && _)
7109c6f1ddSLingrui98
7274b57163SGao-Zeyu  require(meta_sz <= MaxMetaLength)
733e52bed1SLingrui98  io.out.last_stage_meta := metas
7409c6f1ddSLingrui98
7509c6f1ddSLingrui98  var update_meta = io.update.bits.meta
7609c6f1ddSLingrui98  for (c <- components.reverse) {
7709c6f1ddSLingrui98    c.io.update           := io.update
7809c6f1ddSLingrui98    c.io.update.bits.meta := update_meta
7909c6f1ddSLingrui98    update_meta = update_meta >> c.meta_size
8009c6f1ddSLingrui98  }
8109c6f1ddSLingrui98
8209c6f1ddSLingrui98  def extractMeta(meta: UInt, idx: Int): UInt = {
8309c6f1ddSLingrui98    var update_meta = meta
8409c6f1ddSLingrui98    var metas: Seq[UInt] = Nil
8509c6f1ddSLingrui98    for (c <- components.reverse) {
8609c6f1ddSLingrui98      metas = metas :+ update_meta
8709c6f1ddSLingrui98      update_meta = update_meta >> c.meta_size
8809c6f1ddSLingrui98    }
8909c6f1ddSLingrui98    metas(idx)
9009c6f1ddSLingrui98  }
91cd365d4cSrvcoresjw
92dd6c0695SLingrui98  override def getFoldedHistoryInfo = Some(components.map(_.getFoldedHistoryInfo.getOrElse(Set())).reduce(_ ++ _))
93dd6c0695SLingrui98
944813e060SLingrui98  override val perfEvents = components.map(_.getPerfEvents).reduce(_ ++ _)
951ca0e4f3SYinan Xu  generatePerfEvent()
9609c6f1ddSLingrui98}
97