xref: /XiangShan/src/main/scala/xiangshan/backend/fu/Branch.scala (revision 83ba63b34cf09b33c0a9e1b3203138e51af4491b)
13a6ab23aSczw/***************************************************************************************
23a6ab23aSczw* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences
33a6ab23aSczw* Copyright (c) 2020-2021 Peng Cheng Laboratory
43a6ab23aSczw*
53a6ab23aSczw* XiangShan is licensed under Mulan PSL v2.
63a6ab23aSczw* You can use this software according to the terms and conditions of the Mulan PSL v2.
73a6ab23aSczw* You may obtain a copy of Mulan PSL v2 at:
83a6ab23aSczw*          http://license.coscl.org.cn/MulanPSL2
93a6ab23aSczw*
103a6ab23aSczw* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
113a6ab23aSczw* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
123a6ab23aSczw* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
133a6ab23aSczw*
143a6ab23aSczw* See the Mulan PSL v2 for more details.
153a6ab23aSczw***************************************************************************************/
163a6ab23aSczw
173a6ab23aSczwpackage xiangshan.backend.fu
183a6ab23aSczw
19*83ba63b3SXuan Huimport org.chipsalliance.cde.config.Parameters
203a6ab23aSczwimport chisel3._
213a6ab23aSczwimport chisel3.util._
223a6ab23aSczwimport utility.LookupTree
233a6ab23aSczwimport xiangshan._
243a6ab23aSczw
253a6ab23aSczwclass BranchModule(implicit p: Parameters) extends XSModule {
263a6ab23aSczw  val io = IO(new Bundle() {
273a6ab23aSczw    val src = Vec(2, Input(UInt(XLEN.W)))
283a6ab23aSczw    val func = Input(FuOpType())
293b739f49SXuan Hu    val pred_taken = Input(Bool())
303a6ab23aSczw    val taken, mispredict = Output(Bool())
313a6ab23aSczw  })
323a6ab23aSczw  val (src1, src2, func) = (io.src(0), io.src(1), io.func)
333a6ab23aSczw
343a6ab23aSczw  val subModule = Module(new SubModule)
353a6ab23aSczw  subModule.io.src(0) := src1
363a6ab23aSczw  subModule.io.src(1) := src2
373a6ab23aSczw  val sub  = subModule.io.sub
383a6ab23aSczw  val sltu    = !sub(XLEN)
393a6ab23aSczw  val slt     = src1(XLEN - 1) ^ src2(XLEN - 1) ^ sltu
403b739f49SXuan Hu  val xor     = src1 ^ src2
413a6ab23aSczw  // branch
423a6ab23aSczw  val branchOpTable = List(
433a93c817SXuan Hu    BRUOpType.getBranchType(BRUOpType.beq)  -> !xor.orR,
443a93c817SXuan Hu    BRUOpType.getBranchType(BRUOpType.blt)  -> slt,
453a93c817SXuan Hu    BRUOpType.getBranchType(BRUOpType.bltu) -> sltu
463a6ab23aSczw  )
473b739f49SXuan Hu  val taken = LookupTree(BRUOpType.getBranchType(func), branchOpTable) ^ BRUOpType.isBranchInvert(func)
483a6ab23aSczw
493a6ab23aSczw  io.taken := taken
503b739f49SXuan Hu  io.mispredict := io.pred_taken ^ taken
513a6ab23aSczw}
52