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 17e18c367fSLinJiaweipackage xiangshan.backend.fu 18e18c367fSLinJiawei 192225d46eSJiawei Linimport chipsalliance.rocketchip.config.Parameters 20e18c367fSLinJiaweiimport chisel3._ 21e18c367fSLinJiaweiimport chisel3.util._ 2288825c5cSYinan Xuimport utils.{LookupTree, LookupTreeDefault, ParallelMux, SignExt, ZeroExt} 23e18c367fSLinJiaweiimport xiangshan._ 24e18c367fSLinJiawei 252225d46eSJiawei Linclass AddModule(implicit p: Parameters) extends XSModule { 2631ea8750SLinJiawei val io = IO(new Bundle() { 272bd5334dSYinan Xu val src = Vec(2, Input(UInt(XLEN.W))) 2828c18878Szfw val srcw = Input(UInt((XLEN/2).W)) 2928c18878Szfw val add = Output(UInt(XLEN.W)) 3028c18878Szfw val addw = Output(UInt((XLEN/2).W)) 3131ea8750SLinJiawei }) 3228c18878Szfw io.add := io.src(0) + io.src(1) 3388825c5cSYinan Xu // TODO: why this extra adder? 3428c18878Szfw io.addw := io.srcw + io.src(1)(31,0) 3531ea8750SLinJiawei} 3631ea8750SLinJiawei 372225d46eSJiawei Linclass SubModule(implicit p: Parameters) extends XSModule { 3831ea8750SLinJiawei val io = IO(new Bundle() { 392bd5334dSYinan Xu val src = Vec(2, Input(UInt(XLEN.W))) 40184a1958Szfw val sub = Output(UInt((XLEN+1).W)) 4131ea8750SLinJiawei }) 42184a1958Szfw io.sub := (io.src(0) +& (~io.src(1)).asUInt()) + 1.U 4331ea8750SLinJiawei} 4431ea8750SLinJiawei 452225d46eSJiawei Linclass LeftShiftModule(implicit p: Parameters) extends XSModule { 4631ea8750SLinJiawei val io = IO(new Bundle() { 4731ea8750SLinJiawei val shamt = Input(UInt(6.W)) 4828c18878Szfw val revShamt = Input(UInt(6.W)) 4931ea8750SLinJiawei val sllSrc = Input(UInt(XLEN.W)) 5031ea8750SLinJiawei val sll = Output(UInt(XLEN.W)) 5128c18878Szfw val revSll = Output(UInt(XLEN.W)) 5231ea8750SLinJiawei }) 53184a1958Szfw io.sll := io.sllSrc << io.shamt 5428c18878Szfw io.revSll := io.sllSrc << io.revShamt 55184a1958Szfw} 56184a1958Szfw 57184a1958Szfwclass LeftShiftWordModule(implicit p: Parameters) extends XSModule { 58184a1958Szfw val io = IO(new Bundle() { 59184a1958Szfw val shamt = Input(UInt(5.W)) 6028c18878Szfw val revShamt = Input(UInt(5.W)) 61184a1958Szfw val sllSrc = Input(UInt((XLEN/2).W)) 62184a1958Szfw val sllw = Output(UInt((XLEN/2).W)) 6328c18878Szfw val revSllw = Output(UInt((XLEN/2).W)) 64184a1958Szfw }) 65184a1958Szfw io.sllw := io.sllSrc << io.shamt 6628c18878Szfw io.revSllw := io.sllSrc << io.revShamt 6731ea8750SLinJiawei} 6831ea8750SLinJiawei 692225d46eSJiawei Linclass RightShiftModule(implicit p: Parameters) extends XSModule { 7031ea8750SLinJiawei val io = IO(new Bundle() { 7131ea8750SLinJiawei val shamt = Input(UInt(6.W)) 7228c18878Szfw val revShamt = Input(UInt(6.W)) 7331ea8750SLinJiawei val srlSrc, sraSrc = Input(UInt(XLEN.W)) 74184a1958Szfw val srl, sra = Output(UInt(XLEN.W)) 7528c18878Szfw val revSrl = Output(UInt(XLEN.W)) 7631ea8750SLinJiawei }) 77184a1958Szfw io.srl := io.srlSrc >> io.shamt 78184a1958Szfw io.sra := (io.sraSrc.asSInt() >> io.shamt).asUInt() 7928c18878Szfw io.revSrl := io.srlSrc >> io.revShamt 8031ea8750SLinJiawei} 8131ea8750SLinJiawei 82184a1958Szfwclass RightShiftWordModule(implicit p: Parameters) extends XSModule { 83ee8ff153Szfw val io = IO(new Bundle() { 84184a1958Szfw val shamt = Input(UInt(5.W)) 8528c18878Szfw val revShamt = Input(UInt(5.W)) 86184a1958Szfw val srlSrc, sraSrc = Input(UInt((XLEN/2).W)) 87184a1958Szfw val srlw, sraw = Output(UInt((XLEN/2).W)) 8828c18878Szfw val revSrlw = Output(UInt((XLEN/2).W)) 89ee8ff153Szfw }) 90184a1958Szfw 91184a1958Szfw io.srlw := io.srlSrc >> io.shamt 92184a1958Szfw io.sraw := (io.sraSrc.asSInt() >> io.shamt).asUInt() 9328c18878Szfw io.revSrlw := io.srlSrc >> io.revShamt 94ee8ff153Szfw} 95ee8ff153Szfw 96184a1958Szfw 972225d46eSJiawei Linclass MiscResultSelect(implicit p: Parameters) extends XSModule { 9831ea8750SLinJiawei val io = IO(new Bundle() { 99675acc68SYinan Xu val func = Input(UInt(6.W)) 100675acc68SYinan Xu val and, or, xor, orcb, orh48, sextb, packh, sexth, packw, revb, rev8, pack = Input(UInt(XLEN.W)) 10188825c5cSYinan Xu val src = Input(UInt(XLEN.W)) 10231ea8750SLinJiawei val miscRes = Output(UInt(XLEN.W)) 10331ea8750SLinJiawei }) 104ee8ff153Szfw 105675acc68SYinan Xu val logicRes = VecInit(Seq( 106675acc68SYinan Xu io.and, 107675acc68SYinan Xu io.or, 108675acc68SYinan Xu io.xor, 109675acc68SYinan Xu io.orcb 110675acc68SYinan Xu ))(io.func(2, 1)) 111675acc68SYinan Xu val miscRes = VecInit(Seq(io.sextb, io.packh, io.sexth, io.packw))(io.func(1, 0)) 112675acc68SYinan Xu val logicBase = Mux(io.func(3), miscRes, logicRes) 11388825c5cSYinan Xu 114675acc68SYinan Xu val revRes = VecInit(Seq(io.revb, io.rev8, io.pack, io.orh48))(io.func(1, 0)) 115675acc68SYinan Xu val customRes = VecInit(Seq( 116675acc68SYinan Xu Cat(0.U(31.W), io.src(31, 0), 0.U(1.W)), 117675acc68SYinan Xu Cat(0.U(30.W), io.src(31, 0), 0.U(2.W)), 118675acc68SYinan Xu Cat(0.U(29.W), io.src(31, 0), 0.U(3.W)), 119675acc68SYinan Xu Cat(0.U(56.W), io.src(15, 8))))(io.func(1, 0)) 120675acc68SYinan Xu val logicAdv = Mux(io.func(3), customRes, revRes) 121ee8ff153Szfw 122675acc68SYinan Xu val mask = Cat(Fill(15, io.func(0)), 1.U(1.W)) 123675acc68SYinan Xu val maskedLogicRes = mask & logicRes 124675acc68SYinan Xu 125675acc68SYinan Xu io.miscRes := Mux(io.func(5), maskedLogicRes, Mux(io.func(4), logicAdv, logicBase)) 12631ea8750SLinJiawei} 12731ea8750SLinJiawei 128ee8ff153Szfwclass ShiftResultSelect(implicit p: Parameters) extends XSModule { 129ee8ff153Szfw val io = IO(new Bundle() { 130675acc68SYinan Xu val func = Input(UInt(4.W)) 13128c18878Szfw val sll, srl, sra, rol, ror, bclr, bset, binv, bext = Input(UInt(XLEN.W)) 132ee8ff153Szfw val shiftRes = Output(UInt(XLEN.W)) 133ee8ff153Szfw }) 134ee8ff153Szfw 135675acc68SYinan Xu // val leftBit = Mux(io.func(1), io.binv, Mux(io.func(0), io.bset, io.bclr)) 136675acc68SYinan Xu // val leftRes = Mux(io.func(2), leftBit, io.sll) 137675acc68SYinan Xu // val rightRes = Mux(io.func(1) && io.func(0), io.sra, Mux(io.func(1), io.bext, io.srl)) 138675acc68SYinan Xu val resultSource = VecInit(Seq( 139675acc68SYinan Xu io.sll, 140675acc68SYinan Xu io.sll, 141675acc68SYinan Xu io.bclr, 142675acc68SYinan Xu io.bset, 143675acc68SYinan Xu io.binv, 144675acc68SYinan Xu io.srl, 145675acc68SYinan Xu io.bext, 146675acc68SYinan Xu io.sra 147675acc68SYinan Xu )) 148675acc68SYinan Xu val simple = resultSource(io.func(2, 0)) 149ee8ff153Szfw 1507b441e5eSYinan Xu io.shiftRes := Mux(io.func(3), Mux(io.func(1), io.ror, io.rol), simple) 151184a1958Szfw} 152ee8ff153Szfw 153184a1958Szfwclass WordResultSelect(implicit p: Parameters) extends XSModule { 154184a1958Szfw val io = IO(new Bundle() { 155184a1958Szfw val func = Input(UInt()) 15628c18878Szfw val sllw, srlw, sraw, rolw, rorw, addw, subw = Input(UInt((XLEN/2).W)) 157184a1958Szfw val wordRes = Output(UInt(XLEN.W)) 158184a1958Szfw }) 159ee8ff153Szfw 160675acc68SYinan Xu val addsubRes = Mux(!io.func(2) && io.func(1), io.subw, io.addw) 161675acc68SYinan Xu val shiftRes = Mux(io.func(2), Mux(io.func(0), io.rorw, io.rolw), 162675acc68SYinan Xu Mux(io.func(1), io.sraw, Mux(io.func(0), io.srlw, io.sllw))) 163675acc68SYinan Xu val wordRes = Mux(io.func(3), shiftRes, addsubRes) 164184a1958Szfw io.wordRes := SignExt(wordRes, XLEN) 165ee8ff153Szfw} 166ee8ff153Szfw 167ee8ff153Szfw 1682225d46eSJiawei Linclass AluResSel(implicit p: Parameters) extends XSModule { 16931ea8750SLinJiawei val io = IO(new Bundle() { 170675acc68SYinan Xu val func = Input(UInt(3.W)) 171184a1958Szfw val addRes, shiftRes, miscRes, compareRes, wordRes = Input(UInt(XLEN.W)) 17231ea8750SLinJiawei val aluRes = Output(UInt(XLEN.W)) 17331ea8750SLinJiawei }) 174ee8ff153Szfw 175675acc68SYinan Xu val res = Mux(io.func(2, 1) === 0.U, Mux(io.func(0), io.wordRes, io.shiftRes), 176675acc68SYinan Xu Mux(!io.func(2), Mux(io.func(0), io.compareRes, io.addRes), io.miscRes)) 177184a1958Szfw io.aluRes := res 17831ea8750SLinJiawei} 17931ea8750SLinJiawei 1802225d46eSJiawei Linclass AluDataModule(implicit p: Parameters) extends XSModule { 181e2203130SLinJiawei val io = IO(new Bundle() { 1822bd5334dSYinan Xu val src = Vec(2, Input(UInt(XLEN.W))) 183e2203130SLinJiawei val func = Input(FuOpType()) 184e2203130SLinJiawei val pred_taken, isBranch = Input(Bool()) 185e2203130SLinJiawei val result = Output(UInt(XLEN.W)) 186e2203130SLinJiawei val taken, mispredict = Output(Bool()) 187e2203130SLinJiawei }) 1882bd5334dSYinan Xu val (src1, src2, func) = (io.src(0), io.src(1), io.func) 189e18c367fSLinJiawei 190675acc68SYinan Xu val shamt = src2(5, 0) 191675acc68SYinan Xu val revShamt = ~src2(5,0) + 1.U 192675acc68SYinan Xu 193675acc68SYinan Xu // slliuw, sll 194675acc68SYinan Xu val leftShiftModule = Module(new LeftShiftModule) 195675acc68SYinan Xu val sll = leftShiftModule.io.sll 196675acc68SYinan Xu val revSll = leftShiftModule.io.revSll 197675acc68SYinan Xu leftShiftModule.io.sllSrc := Cat(Fill(32, func(0)), Fill(32, 1.U)) & src1 198675acc68SYinan Xu leftShiftModule.io.shamt := shamt 199675acc68SYinan Xu leftShiftModule.io.revShamt := revShamt 200675acc68SYinan Xu 201675acc68SYinan Xu // bclr, bset, binv 202675acc68SYinan Xu val bitShift = 1.U << src2(5, 0) 203675acc68SYinan Xu val bclr = src1 & ~bitShift 204675acc68SYinan Xu val bset = src1 | bitShift 205675acc68SYinan Xu val binv = src1 ^ bitShift 206675acc68SYinan Xu 207675acc68SYinan Xu // srl, sra, bext 208675acc68SYinan Xu val rightShiftModule = Module(new RightShiftModule) 209675acc68SYinan Xu val srl = rightShiftModule.io.srl 210675acc68SYinan Xu val revSrl = rightShiftModule.io.revSrl 211675acc68SYinan Xu val sra = rightShiftModule.io.sra 212675acc68SYinan Xu rightShiftModule.io.shamt := shamt 213675acc68SYinan Xu rightShiftModule.io.revShamt := revShamt 214675acc68SYinan Xu rightShiftModule.io.srlSrc := src1 215675acc68SYinan Xu rightShiftModule.io.sraSrc := src1 216675acc68SYinan Xu val bext = srl(0) 217675acc68SYinan Xu 218675acc68SYinan Xu val rol = revSrl | sll 219675acc68SYinan Xu val ror = srl | revSll 220675acc68SYinan Xu 221675acc68SYinan Xu // addw 222184a1958Szfw val addModule = Module(new AddModule) 223675acc68SYinan Xu addModule.io.srcw := Mux(!func(2) && func(0), ZeroExt(src1(0), XLEN), src1(31, 0)) 224675acc68SYinan Xu val addwResultAll = VecInit(Seq( 225675acc68SYinan Xu ZeroExt(addModule.io.addw(0), XLEN), 226675acc68SYinan Xu ZeroExt(addModule.io.addw(7, 0), XLEN), 227675acc68SYinan Xu ZeroExt(addModule.io.addw(15, 0), XLEN), 228675acc68SYinan Xu SignExt(addModule.io.addw(15, 0), XLEN) 229675acc68SYinan Xu )) 230675acc68SYinan Xu val addw = Mux(func(2), addwResultAll(func(1, 0)), addModule.io.addw) 231675acc68SYinan Xu 232675acc68SYinan Xu // subw 233675acc68SYinan Xu val subModule = Module(new SubModule) 234675acc68SYinan Xu val subw = subModule.io.sub 235675acc68SYinan Xu 236675acc68SYinan Xu // sllw 237675acc68SYinan Xu val leftShiftWordModule = Module(new LeftShiftWordModule) 238675acc68SYinan Xu val sllw = leftShiftWordModule.io.sllw 239675acc68SYinan Xu val revSllw = leftShiftWordModule.io.revSllw 240675acc68SYinan Xu leftShiftWordModule.io.sllSrc := src1 241675acc68SYinan Xu leftShiftWordModule.io.shamt := shamt 242675acc68SYinan Xu leftShiftWordModule.io.revShamt := revShamt 243675acc68SYinan Xu 244675acc68SYinan Xu val rightShiftWordModule = Module(new RightShiftWordModule) 245675acc68SYinan Xu val srlw = rightShiftWordModule.io.srlw 246675acc68SYinan Xu val revSrlw = rightShiftWordModule.io.revSrlw 247675acc68SYinan Xu val sraw = rightShiftWordModule.io.sraw 248675acc68SYinan Xu rightShiftWordModule.io.shamt := shamt 249675acc68SYinan Xu rightShiftWordModule.io.revShamt := revShamt 250675acc68SYinan Xu rightShiftWordModule.io.srlSrc := src1 251675acc68SYinan Xu rightShiftWordModule.io.sraSrc := src1 252675acc68SYinan Xu 253675acc68SYinan Xu val rolw = revSrlw | sllw 254675acc68SYinan Xu val rorw = srlw | revSllw 255675acc68SYinan Xu 256675acc68SYinan Xu // add 257a792bcf1SYinan Xu val wordMaskAddSource = Cat(Fill(32, func(0)), Fill(32, 1.U)) & src1 258a792bcf1SYinan Xu val shaddSource = VecInit(Seq( 259a792bcf1SYinan Xu Cat(wordMaskAddSource(62, 0), 0.U(1.W)), 260a792bcf1SYinan Xu Cat(wordMaskAddSource(61, 0), 0.U(2.W)), 261a792bcf1SYinan Xu Cat(wordMaskAddSource(60, 0), 0.U(3.W)), 262a792bcf1SYinan Xu Cat(wordMaskAddSource(59, 0), 0.U(4.W)) 263a792bcf1SYinan Xu )) 264a792bcf1SYinan Xu val sraddSource = VecInit(Seq( 265a792bcf1SYinan Xu ZeroExt(src1(63, 29), XLEN), 26688825c5cSYinan Xu ZeroExt(src1(63, 30), XLEN), 26788825c5cSYinan Xu ZeroExt(src1(63, 31), XLEN), 26888825c5cSYinan Xu ZeroExt(src1(63, 32), XLEN) 26988825c5cSYinan Xu )) 270a792bcf1SYinan Xu // TODO: use decoder or other libraries to optimize timing 271a792bcf1SYinan Xu // Now we assume shadd has the worst timing. 272675acc68SYinan Xu addModule.io.src(0) := Mux(func(3), shaddSource(func(2, 1)), 273675acc68SYinan Xu Mux(func(2), sraddSource(func(1, 0)), 274675acc68SYinan Xu Mux(func(1), ZeroExt(src1(0), XLEN), wordMaskAddSource)) 275a792bcf1SYinan Xu ) 276a792bcf1SYinan Xu addModule.io.src(1) := src2 27788825c5cSYinan Xu val add = addModule.io.add 278ee8ff153Szfw 279675acc68SYinan Xu // sub 280184a1958Szfw val sub = subModule.io.sub 2812bd5334dSYinan Xu subModule.io.src(0) := src1 2822bd5334dSYinan Xu subModule.io.src(1) := src2 2837b441e5eSYinan Xu val sltu = !sub(XLEN) 284675acc68SYinan Xu val slt = src1(XLEN - 1) ^ src2(XLEN - 1) ^ sltu 285ee8ff153Szfw val maxMin = Mux(slt ^ func(0), src2, src1) 2867b441e5eSYinan Xu val maxMinU = Mux(sltu ^ func(0), src2, src1) 287675acc68SYinan Xu val compareRes = Mux(func(2), Mux(func(1), maxMin, maxMinU), Mux(func(1), slt, Mux(func(0), sltu, sub))) 288ee8ff153Szfw 289675acc68SYinan Xu // logic 290675acc68SYinan Xu val logicSrc2 = Mux(!func(5) && func(0), ~src2, src2) 291675acc68SYinan Xu val and = src1 & logicSrc2 292675acc68SYinan Xu val or = src1 | logicSrc2 293675acc68SYinan Xu val xor = src1 ^ logicSrc2 294*73be64b3SJiawei Lin val orcb = Cat((0 until 8).map(i => Fill(8, src1(i * 8 + 7, i * 8).orR)).reverse) 295675acc68SYinan Xu val orh48 = Cat(src1(63, 8), 0.U(8.W)) | src2 296675acc68SYinan Xu 297675acc68SYinan Xu val sextb = SignExt(src1(7, 0), XLEN) 298675acc68SYinan Xu val packh = Cat(src2(7,0), src1(7,0)) 299675acc68SYinan Xu val sexth = SignExt(src1(15, 0), XLEN) 300675acc68SYinan Xu val packw = SignExt(Cat(src2(15, 0), src1(15, 0)), XLEN) 301675acc68SYinan Xu 302*73be64b3SJiawei Lin val revb = Cat((0 until 8).map(i => Reverse(src1(8 * i + 7, 8 * i))).reverse) 303675acc68SYinan Xu val pack = Cat(src2(31, 0), src1(31, 0)) 304675acc68SYinan Xu val rev8 = Cat((0 until 8).map(i => src1(8 * i + 7, 8 * i))) 305675acc68SYinan Xu 306675acc68SYinan Xu // branch 307ee8ff153Szfw val branchOpTable = List( 308ee8ff153Szfw ALUOpType.getBranchType(ALUOpType.beq) -> !xor.orR, 309ee8ff153Szfw ALUOpType.getBranchType(ALUOpType.blt) -> slt, 310ee8ff153Szfw ALUOpType.getBranchType(ALUOpType.bltu) -> sltu 311ee8ff153Szfw ) 312ee8ff153Szfw val taken = LookupTree(ALUOpType.getBranchType(func), branchOpTable) ^ ALUOpType.isBranchInvert(func) 313ee8ff153Szfw 314184a1958Szfw // Result Select 315184a1958Szfw val shiftResSel = Module(new ShiftResultSelect) 316675acc68SYinan Xu shiftResSel.io.func := func(3, 0) 317184a1958Szfw shiftResSel.io.sll := sll 318184a1958Szfw shiftResSel.io.srl := srl 319184a1958Szfw shiftResSel.io.sra := sra 32028c18878Szfw shiftResSel.io.rol := rol 32128c18878Szfw shiftResSel.io.ror := ror 322184a1958Szfw shiftResSel.io.bclr := bclr 323184a1958Szfw shiftResSel.io.binv := binv 324184a1958Szfw shiftResSel.io.bset := bset 325184a1958Szfw shiftResSel.io.bext := bext 326184a1958Szfw val shiftRes = shiftResSel.io.shiftRes 32731ea8750SLinJiawei 32831ea8750SLinJiawei val miscResSel = Module(new MiscResultSelect) 329675acc68SYinan Xu miscResSel.io.func := func(5, 0) 330ee8ff153Szfw miscResSel.io.and := and 331ee8ff153Szfw miscResSel.io.or := or 332ee8ff153Szfw miscResSel.io.xor := xor 333675acc68SYinan Xu miscResSel.io.orcb := orcb 33488825c5cSYinan Xu miscResSel.io.orh48 := orh48 335ee8ff153Szfw miscResSel.io.sextb := sextb 336675acc68SYinan Xu miscResSel.io.packh := packh 337ee8ff153Szfw miscResSel.io.sexth := sexth 338675acc68SYinan Xu miscResSel.io.packw := packw 339675acc68SYinan Xu miscResSel.io.revb := revb 340ee8ff153Szfw miscResSel.io.rev8 := rev8 341675acc68SYinan Xu miscResSel.io.pack := pack 34288825c5cSYinan Xu miscResSel.io.src := src1 34331ea8750SLinJiawei val miscRes = miscResSel.io.miscRes 34431ea8750SLinJiawei 345184a1958Szfw val wordResSel = Module(new WordResultSelect) 346184a1958Szfw wordResSel.io.func := func 347184a1958Szfw wordResSel.io.addw := addw 348184a1958Szfw wordResSel.io.subw := subw 349184a1958Szfw wordResSel.io.sllw := sllw 350184a1958Szfw wordResSel.io.srlw := srlw 351184a1958Szfw wordResSel.io.sraw := sraw 35228c18878Szfw wordResSel.io.rolw := rolw 35328c18878Szfw wordResSel.io.rorw := rorw 354184a1958Szfw val wordRes = wordResSel.io.wordRes 355ee8ff153Szfw 35631ea8750SLinJiawei val aluResSel = Module(new AluResSel) 357675acc68SYinan Xu aluResSel.io.func := func(6, 4) 358184a1958Szfw aluResSel.io.addRes := add 359184a1958Szfw aluResSel.io.compareRes := compareRes 360ee8ff153Szfw aluResSel.io.shiftRes := shiftRes 36131ea8750SLinJiawei aluResSel.io.miscRes := miscRes 362184a1958Szfw aluResSel.io.wordRes := wordRes 36331ea8750SLinJiawei val aluRes = aluResSel.io.aluRes 364e18c367fSLinJiawei 365e2203130SLinJiawei io.result := aluRes 366e2203130SLinJiawei io.taken := taken 367e2203130SLinJiawei io.mispredict := (io.pred_taken ^ taken) && io.isBranch 368e2203130SLinJiawei} 369e2203130SLinJiawei 370adb5df20SYinan Xuclass Alu(implicit p: Parameters) extends FUWithRedirect { 371e2203130SLinJiawei 372675acc68SYinan Xu val uop = io.in.bits.uop 373e2203130SLinJiawei 374675acc68SYinan Xu val isBranch = ALUOpType.isBranch(io.in.bits.uop.ctrl.fuOpType) 375e2203130SLinJiawei val dataModule = Module(new AluDataModule) 376e2203130SLinJiawei 377675acc68SYinan Xu dataModule.io.src := io.in.bits.src.take(2) 378675acc68SYinan Xu dataModule.io.func := io.in.bits.uop.ctrl.fuOpType 379e2203130SLinJiawei dataModule.io.pred_taken := uop.cf.pred_taken 380e2203130SLinJiawei dataModule.io.isBranch := isBranch 381e2203130SLinJiawei 382e18c367fSLinJiawei redirectOutValid := io.out.valid && isBranch 383151e3043SLinJiawei redirectOut := DontCare 384bfb958a3SYinan Xu redirectOut.level := RedirectLevel.flushAfter 3859aca92b9SYinan Xu redirectOut.robIdx := uop.robIdx 386cde9280dSLinJiawei redirectOut.ftqIdx := uop.cf.ftqPtr 387cde9280dSLinJiawei redirectOut.ftqOffset := uop.cf.ftqOffset 388e2203130SLinJiawei redirectOut.cfiUpdate.isMisPred := dataModule.io.mispredict 389e2203130SLinJiawei redirectOut.cfiUpdate.taken := dataModule.io.taken 390cde9280dSLinJiawei redirectOut.cfiUpdate.predTaken := uop.cf.pred_taken 39120edb3f7SWilliam Wang redirectOut.debug_runahead_checkpoint_id := uop.debugInfo.runahead_checkpoint_id 392151e3043SLinJiawei 393e18c367fSLinJiawei io.in.ready := io.out.ready 394675acc68SYinan Xu io.out.valid := io.in.valid 395e18c367fSLinJiawei io.out.bits.uop <> io.in.bits.uop 396e2203130SLinJiawei io.out.bits.data := dataModule.io.result 397e18c367fSLinJiawei} 398