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