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() { 99*675acc68SYinan Xu val func = Input(UInt(6.W)) 100*675acc68SYinan 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 105*675acc68SYinan Xu val logicRes = VecInit(Seq( 106*675acc68SYinan Xu io.and, 107*675acc68SYinan Xu io.or, 108*675acc68SYinan Xu io.xor, 109*675acc68SYinan Xu io.orcb 110*675acc68SYinan Xu ))(io.func(2, 1)) 111*675acc68SYinan Xu val miscRes = VecInit(Seq(io.sextb, io.packh, io.sexth, io.packw))(io.func(1, 0)) 112*675acc68SYinan Xu val logicBase = Mux(io.func(3), miscRes, logicRes) 11388825c5cSYinan Xu 114*675acc68SYinan Xu val revRes = VecInit(Seq(io.revb, io.rev8, io.pack, io.orh48))(io.func(1, 0)) 115*675acc68SYinan Xu val customRes = VecInit(Seq( 116*675acc68SYinan Xu Cat(0.U(31.W), io.src(31, 0), 0.U(1.W)), 117*675acc68SYinan Xu Cat(0.U(30.W), io.src(31, 0), 0.U(2.W)), 118*675acc68SYinan Xu Cat(0.U(29.W), io.src(31, 0), 0.U(3.W)), 119*675acc68SYinan Xu Cat(0.U(56.W), io.src(15, 8))))(io.func(1, 0)) 120*675acc68SYinan Xu val logicAdv = Mux(io.func(3), customRes, revRes) 121ee8ff153Szfw 122*675acc68SYinan Xu val mask = Cat(Fill(15, io.func(0)), 1.U(1.W)) 123*675acc68SYinan Xu val maskedLogicRes = mask & logicRes 124*675acc68SYinan Xu 125*675acc68SYinan 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() { 130*675acc68SYinan 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 135*675acc68SYinan Xu // val leftBit = Mux(io.func(1), io.binv, Mux(io.func(0), io.bset, io.bclr)) 136*675acc68SYinan Xu // val leftRes = Mux(io.func(2), leftBit, io.sll) 137*675acc68SYinan Xu // val rightRes = Mux(io.func(1) && io.func(0), io.sra, Mux(io.func(1), io.bext, io.srl)) 138*675acc68SYinan Xu val resultSource = VecInit(Seq( 139*675acc68SYinan Xu io.sll, 140*675acc68SYinan Xu io.sll, 141*675acc68SYinan Xu io.bclr, 142*675acc68SYinan Xu io.bset, 143*675acc68SYinan Xu io.binv, 144*675acc68SYinan Xu io.srl, 145*675acc68SYinan Xu io.bext, 146*675acc68SYinan Xu io.sra 147*675acc68SYinan Xu )) 148*675acc68SYinan Xu val simple = resultSource(io.func(2, 0)) 149ee8ff153Szfw 150*675acc68SYinan Xu io.shiftRes := Mux(io.func(3), Mux(io.func(0), 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 160*675acc68SYinan Xu val addsubRes = Mux(!io.func(2) && io.func(1), io.subw, io.addw) 161*675acc68SYinan Xu val shiftRes = Mux(io.func(2), Mux(io.func(0), io.rorw, io.rolw), 162*675acc68SYinan Xu Mux(io.func(1), io.sraw, Mux(io.func(0), io.srlw, io.sllw))) 163*675acc68SYinan 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() { 170*675acc68SYinan 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 175*675acc68SYinan Xu val res = Mux(io.func(2, 1) === 0.U, Mux(io.func(0), io.wordRes, io.shiftRes), 176*675acc68SYinan 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 190*675acc68SYinan Xu val shamt = src2(5, 0) 191*675acc68SYinan Xu val revShamt = ~src2(5,0) + 1.U 192*675acc68SYinan Xu 193*675acc68SYinan Xu // slliuw, sll 194*675acc68SYinan Xu val leftShiftModule = Module(new LeftShiftModule) 195*675acc68SYinan Xu val sll = leftShiftModule.io.sll 196*675acc68SYinan Xu val revSll = leftShiftModule.io.revSll 197*675acc68SYinan Xu leftShiftModule.io.sllSrc := Cat(Fill(32, func(0)), Fill(32, 1.U)) & src1 198*675acc68SYinan Xu leftShiftModule.io.shamt := shamt 199*675acc68SYinan Xu leftShiftModule.io.revShamt := revShamt 200*675acc68SYinan Xu 201*675acc68SYinan Xu // bclr, bset, binv 202*675acc68SYinan Xu val bitShift = 1.U << src2(5, 0) 203*675acc68SYinan Xu val bclr = src1 & ~bitShift 204*675acc68SYinan Xu val bset = src1 | bitShift 205*675acc68SYinan Xu val binv = src1 ^ bitShift 206*675acc68SYinan Xu 207*675acc68SYinan Xu // srl, sra, bext 208*675acc68SYinan Xu val rightShiftModule = Module(new RightShiftModule) 209*675acc68SYinan Xu val srl = rightShiftModule.io.srl 210*675acc68SYinan Xu val revSrl = rightShiftModule.io.revSrl 211*675acc68SYinan Xu val sra = rightShiftModule.io.sra 212*675acc68SYinan Xu rightShiftModule.io.shamt := shamt 213*675acc68SYinan Xu rightShiftModule.io.revShamt := revShamt 214*675acc68SYinan Xu rightShiftModule.io.srlSrc := src1 215*675acc68SYinan Xu rightShiftModule.io.sraSrc := src1 216*675acc68SYinan Xu val bext = srl(0) 217*675acc68SYinan Xu 218*675acc68SYinan Xu val rol = revSrl | sll 219*675acc68SYinan Xu val ror = srl | revSll 220*675acc68SYinan Xu 221*675acc68SYinan Xu // addw 222184a1958Szfw val addModule = Module(new AddModule) 223*675acc68SYinan Xu addModule.io.srcw := Mux(!func(2) && func(0), ZeroExt(src1(0), XLEN), src1(31, 0)) 224*675acc68SYinan Xu val addwResultAll = VecInit(Seq( 225*675acc68SYinan Xu ZeroExt(addModule.io.addw(0), XLEN), 226*675acc68SYinan Xu ZeroExt(addModule.io.addw(7, 0), XLEN), 227*675acc68SYinan Xu ZeroExt(addModule.io.addw(15, 0), XLEN), 228*675acc68SYinan Xu SignExt(addModule.io.addw(15, 0), XLEN) 229*675acc68SYinan Xu )) 230*675acc68SYinan Xu val addw = Mux(func(2), addwResultAll(func(1, 0)), addModule.io.addw) 231*675acc68SYinan Xu 232*675acc68SYinan Xu // subw 233*675acc68SYinan Xu val subModule = Module(new SubModule) 234*675acc68SYinan Xu val subw = subModule.io.sub 235*675acc68SYinan Xu 236*675acc68SYinan Xu // sllw 237*675acc68SYinan Xu val leftShiftWordModule = Module(new LeftShiftWordModule) 238*675acc68SYinan Xu val sllw = leftShiftWordModule.io.sllw 239*675acc68SYinan Xu val revSllw = leftShiftWordModule.io.revSllw 240*675acc68SYinan Xu leftShiftWordModule.io.sllSrc := src1 241*675acc68SYinan Xu leftShiftWordModule.io.shamt := shamt 242*675acc68SYinan Xu leftShiftWordModule.io.revShamt := revShamt 243*675acc68SYinan Xu 244*675acc68SYinan Xu val rightShiftWordModule = Module(new RightShiftWordModule) 245*675acc68SYinan Xu val srlw = rightShiftWordModule.io.srlw 246*675acc68SYinan Xu val revSrlw = rightShiftWordModule.io.revSrlw 247*675acc68SYinan Xu val sraw = rightShiftWordModule.io.sraw 248*675acc68SYinan Xu rightShiftWordModule.io.shamt := shamt 249*675acc68SYinan Xu rightShiftWordModule.io.revShamt := revShamt 250*675acc68SYinan Xu rightShiftWordModule.io.srlSrc := src1 251*675acc68SYinan Xu rightShiftWordModule.io.sraSrc := src1 252*675acc68SYinan Xu 253*675acc68SYinan Xu val rolw = revSrlw | sllw 254*675acc68SYinan Xu val rorw = srlw | revSllw 255*675acc68SYinan Xu 256*675acc68SYinan 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. 272*675acc68SYinan Xu addModule.io.src(0) := Mux(func(3), shaddSource(func(2, 1)), 273*675acc68SYinan Xu Mux(func(2), sraddSource(func(1, 0)), 274*675acc68SYinan 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 279*675acc68SYinan Xu // sub 280184a1958Szfw val sub = subModule.io.sub 2812bd5334dSYinan Xu subModule.io.src(0) := src1 2822bd5334dSYinan Xu subModule.io.src(1) := src2 283184a1958Szfw val sgtu = sub(XLEN) 284184a1958Szfw val sltu = !sgtu 285*675acc68SYinan Xu val slt = src1(XLEN - 1) ^ src2(XLEN - 1) ^ sltu 286ee8ff153Szfw val maxMin = Mux(slt ^ func(0), src2, src1) 28728c18878Szfw val maxMinU = Mux((sgtu && func(0)) || ~(sgtu && func(0)), src2, src1) 288*675acc68SYinan Xu val compareRes = Mux(func(2), Mux(func(1), maxMin, maxMinU), Mux(func(1), slt, Mux(func(0), sltu, sub))) 289ee8ff153Szfw 290*675acc68SYinan Xu // logic 291*675acc68SYinan Xu val logicSrc2 = Mux(!func(5) && func(0), ~src2, src2) 292*675acc68SYinan Xu val and = src1 & logicSrc2 293*675acc68SYinan Xu val or = src1 | logicSrc2 294*675acc68SYinan Xu val xor = src1 ^ logicSrc2 295*675acc68SYinan Xu val orcb = Cat((7 to 0).map(i => Fill(8, src1(i * 8 + 7, i * 8).orR))) 296*675acc68SYinan Xu val orh48 = Cat(src1(63, 8), 0.U(8.W)) | src2 297*675acc68SYinan Xu 298*675acc68SYinan Xu val sextb = SignExt(src1(7, 0), XLEN) 299*675acc68SYinan Xu val packh = Cat(src2(7,0), src1(7,0)) 300*675acc68SYinan Xu val sexth = SignExt(src1(15, 0), XLEN) 301*675acc68SYinan Xu val packw = SignExt(Cat(src2(15, 0), src1(15, 0)), XLEN) 302*675acc68SYinan Xu 303*675acc68SYinan Xu val revb = Cat((7 to 0).map(i => Reverse(src1(8 * i + 7, 8 * i)))) 304*675acc68SYinan Xu val pack = Cat(src2(31, 0), src1(31, 0)) 305*675acc68SYinan Xu val rev8 = Cat((0 until 8).map(i => src1(8 * i + 7, 8 * i))) 306*675acc68SYinan Xu 307*675acc68SYinan Xu // branch 308ee8ff153Szfw val branchOpTable = List( 309ee8ff153Szfw ALUOpType.getBranchType(ALUOpType.beq) -> !xor.orR, 310ee8ff153Szfw ALUOpType.getBranchType(ALUOpType.blt) -> slt, 311ee8ff153Szfw ALUOpType.getBranchType(ALUOpType.bltu) -> sltu 312ee8ff153Szfw ) 313ee8ff153Szfw val taken = LookupTree(ALUOpType.getBranchType(func), branchOpTable) ^ ALUOpType.isBranchInvert(func) 314ee8ff153Szfw 315184a1958Szfw // Result Select 316184a1958Szfw val shiftResSel = Module(new ShiftResultSelect) 317*675acc68SYinan Xu shiftResSel.io.func := func(3, 0) 318184a1958Szfw shiftResSel.io.sll := sll 319184a1958Szfw shiftResSel.io.srl := srl 320184a1958Szfw shiftResSel.io.sra := sra 32128c18878Szfw shiftResSel.io.rol := rol 32228c18878Szfw shiftResSel.io.ror := ror 323184a1958Szfw shiftResSel.io.bclr := bclr 324184a1958Szfw shiftResSel.io.binv := binv 325184a1958Szfw shiftResSel.io.bset := bset 326184a1958Szfw shiftResSel.io.bext := bext 327184a1958Szfw val shiftRes = shiftResSel.io.shiftRes 32831ea8750SLinJiawei 32931ea8750SLinJiawei val miscResSel = Module(new MiscResultSelect) 330*675acc68SYinan Xu miscResSel.io.func := func(5, 0) 331ee8ff153Szfw miscResSel.io.and := and 332ee8ff153Szfw miscResSel.io.or := or 333ee8ff153Szfw miscResSel.io.xor := xor 334*675acc68SYinan Xu miscResSel.io.orcb := orcb 33588825c5cSYinan Xu miscResSel.io.orh48 := orh48 336ee8ff153Szfw miscResSel.io.sextb := sextb 337*675acc68SYinan Xu miscResSel.io.packh := packh 338ee8ff153Szfw miscResSel.io.sexth := sexth 339*675acc68SYinan Xu miscResSel.io.packw := packw 340*675acc68SYinan Xu miscResSel.io.revb := revb 341ee8ff153Szfw miscResSel.io.rev8 := rev8 342*675acc68SYinan Xu miscResSel.io.pack := pack 34388825c5cSYinan Xu miscResSel.io.src := src1 34431ea8750SLinJiawei val miscRes = miscResSel.io.miscRes 34531ea8750SLinJiawei 346184a1958Szfw val wordResSel = Module(new WordResultSelect) 347184a1958Szfw wordResSel.io.func := func 348184a1958Szfw wordResSel.io.addw := addw 349184a1958Szfw wordResSel.io.subw := subw 350184a1958Szfw wordResSel.io.sllw := sllw 351184a1958Szfw wordResSel.io.srlw := srlw 352184a1958Szfw wordResSel.io.sraw := sraw 35328c18878Szfw wordResSel.io.rolw := rolw 35428c18878Szfw wordResSel.io.rorw := rorw 355184a1958Szfw val wordRes = wordResSel.io.wordRes 356ee8ff153Szfw 35731ea8750SLinJiawei val aluResSel = Module(new AluResSel) 358*675acc68SYinan Xu aluResSel.io.func := func(6, 4) 359184a1958Szfw aluResSel.io.addRes := add 360184a1958Szfw aluResSel.io.compareRes := compareRes 361ee8ff153Szfw aluResSel.io.shiftRes := shiftRes 36231ea8750SLinJiawei aluResSel.io.miscRes := miscRes 363184a1958Szfw aluResSel.io.wordRes := wordRes 36431ea8750SLinJiawei val aluRes = aluResSel.io.aluRes 365e18c367fSLinJiawei 366e2203130SLinJiawei io.result := aluRes 367e2203130SLinJiawei io.taken := taken 368e2203130SLinJiawei io.mispredict := (io.pred_taken ^ taken) && io.isBranch 369e2203130SLinJiawei} 370e2203130SLinJiawei 371adb5df20SYinan Xuclass Alu(implicit p: Parameters) extends FUWithRedirect { 372e2203130SLinJiawei 373*675acc68SYinan Xu val uop = io.in.bits.uop 374e2203130SLinJiawei 375*675acc68SYinan Xu val isBranch = ALUOpType.isBranch(io.in.bits.uop.ctrl.fuOpType) 376e2203130SLinJiawei val dataModule = Module(new AluDataModule) 377e2203130SLinJiawei 378*675acc68SYinan Xu dataModule.io.src := io.in.bits.src.take(2) 379*675acc68SYinan Xu dataModule.io.func := io.in.bits.uop.ctrl.fuOpType 380e2203130SLinJiawei dataModule.io.pred_taken := uop.cf.pred_taken 381e2203130SLinJiawei dataModule.io.isBranch := isBranch 382e2203130SLinJiawei 383e18c367fSLinJiawei redirectOutValid := io.out.valid && isBranch 384151e3043SLinJiawei redirectOut := DontCare 385bfb958a3SYinan Xu redirectOut.level := RedirectLevel.flushAfter 386e18c367fSLinJiawei redirectOut.roqIdx := uop.roqIdx 387cde9280dSLinJiawei redirectOut.ftqIdx := uop.cf.ftqPtr 388cde9280dSLinJiawei redirectOut.ftqOffset := uop.cf.ftqOffset 389e2203130SLinJiawei redirectOut.cfiUpdate.isMisPred := dataModule.io.mispredict 390e2203130SLinJiawei redirectOut.cfiUpdate.taken := dataModule.io.taken 391cde9280dSLinJiawei redirectOut.cfiUpdate.predTaken := uop.cf.pred_taken 392151e3043SLinJiawei 393e18c367fSLinJiawei io.in.ready := io.out.ready 394*675acc68SYinan 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