xref: /XiangShan/src/main/scala/xiangshan/frontend/Composer.scala (revision cd365d4ca1205723617d915c8588e09b1ecb1819)
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 chipsalliance.rocketchip.config.Parameters
2009c6f1ddSLingrui98import chisel3._
2109c6f1ddSLingrui98import chisel3.util._
2209c6f1ddSLingrui98import xiangshan._
2309c6f1ddSLingrui98import utils._
2409c6f1ddSLingrui98
2509c6f1ddSLingrui98class Composer(implicit p: Parameters) extends BasePredictor with HasBPUConst {
2609c6f1ddSLingrui98  val (components, resp) = getBPDComponents(io.in.bits.resp_in(0), p, EnableSC)
2709c6f1ddSLingrui98  io.out.resp := resp
2809c6f1ddSLingrui98
2909c6f1ddSLingrui98  var metas = 0.U(1.W)
3009c6f1ddSLingrui98  var meta_sz = 0
3109c6f1ddSLingrui98  for (c <- components) {
3209c6f1ddSLingrui98    c.io.in.valid           := io.in.valid
3309c6f1ddSLingrui98    c.io.in.bits.s0_pc      := io.in.bits.s0_pc
3409c6f1ddSLingrui98    c.io.in.bits.ghist      := io.in.bits.ghist
3509c6f1ddSLingrui98    c.io.in.bits.phist      := io.in.bits.phist
3609c6f1ddSLingrui98
3709c6f1ddSLingrui98    c.io.s0_fire := io.s0_fire
3809c6f1ddSLingrui98    c.io.s1_fire := io.s1_fire
3909c6f1ddSLingrui98    c.io.s2_fire := io.s2_fire
4009c6f1ddSLingrui98    c.io.s3_fire := io.s3_fire
4109c6f1ddSLingrui98
4209c6f1ddSLingrui98    c.io.redirect := io.redirect
4309c6f1ddSLingrui98
4409c6f1ddSLingrui98    if (c.meta_size > 0) {
4509c6f1ddSLingrui98      metas = (metas << c.meta_size) | c.io.out.s3_meta(c.meta_size-1,0)
4609c6f1ddSLingrui98    }
4709c6f1ddSLingrui98    meta_sz = meta_sz + c.meta_size
4809c6f1ddSLingrui98  }
4909c6f1ddSLingrui98
5009c6f1ddSLingrui98  io.in.ready := components.map(_.io.s1_ready).reduce(_ && _)
5109c6f1ddSLingrui98
5209c6f1ddSLingrui98  io.s1_ready := components.map(_.io.s1_ready).reduce(_ && _)
5309c6f1ddSLingrui98  io.s2_ready := components.map(_.io.s2_ready).reduce(_ && _)
5409c6f1ddSLingrui98  io.s3_ready := components.map(_.io.s3_ready).reduce(_ && _)
5509c6f1ddSLingrui98
5609c6f1ddSLingrui98  require(meta_sz < MaxMetaLength)
5709c6f1ddSLingrui98  io.out.s3_meta := metas
5809c6f1ddSLingrui98
5909c6f1ddSLingrui98  var update_meta = io.update.bits.meta
6009c6f1ddSLingrui98  for (c <- components.reverse) {
6109c6f1ddSLingrui98    c.io.update := io.update
6209c6f1ddSLingrui98    c.io.update.bits.meta := update_meta
6309c6f1ddSLingrui98    update_meta = update_meta >> c.meta_size
6409c6f1ddSLingrui98  }
6509c6f1ddSLingrui98
6609c6f1ddSLingrui98  def extractMeta(meta: UInt, idx: Int): UInt = {
6709c6f1ddSLingrui98    var update_meta = meta
6809c6f1ddSLingrui98    var metas: Seq[UInt] = Nil
6909c6f1ddSLingrui98    for (c <- components.reverse) {
7009c6f1ddSLingrui98      metas = metas :+ update_meta
7109c6f1ddSLingrui98      update_meta = update_meta >> c.meta_size
7209c6f1ddSLingrui98    }
7309c6f1ddSLingrui98    metas(idx)
7409c6f1ddSLingrui98  }
75*cd365d4cSrvcoresjw
76*cd365d4cSrvcoresjw  val comp_1_perf = components(1).asInstanceOf[MicroBTB].perfEvents.map(_._1).zip(components(1).asInstanceOf[MicroBTB].perfinfo.perfEvents.perf_events)
77*cd365d4cSrvcoresjw  val comp_2_perf = components(2).asInstanceOf[Tage_SC].perfEvents.map(_._1).zip(components(2).asInstanceOf[Tage_SC].perfinfo.perfEvents.perf_events)
78*cd365d4cSrvcoresjw  val comp_3_perf = components(3).asInstanceOf[FTB].perfEvents.map(_._1).zip(components(3).asInstanceOf[FTB].perfinfo.perfEvents.perf_events)
79*cd365d4cSrvcoresjw  val perfEvents = comp_1_perf ++ comp_2_perf ++ comp_3_perf
80*cd365d4cSrvcoresjw  val perf_list = components(1).asInstanceOf[MicroBTB].perfinfo.perfEvents.perf_events ++
81*cd365d4cSrvcoresjw                  components(2).asInstanceOf[Tage_SC].perfinfo.perfEvents.perf_events ++
82*cd365d4cSrvcoresjw                  components(3).asInstanceOf[FTB].perfinfo.perfEvents.perf_events
83*cd365d4cSrvcoresjw  val perfinfo = IO(new Bundle(){
84*cd365d4cSrvcoresjw    val perfEvents = Output(new PerfEventsBundle(perf_list.length))
85*cd365d4cSrvcoresjw  })
86*cd365d4cSrvcoresjw  perfinfo.perfEvents.perf_events := perf_list
8709c6f1ddSLingrui98}
88