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() { 9988825c5cSYinan Xu val func = Input(UInt(5.W)) 10088825c5cSYinan Xu val andn, orn, xnor, and, or, xor, orh48, sextb, sexth, zexth, rev8, orcb = Input(UInt(XLEN.W)) 10188825c5cSYinan Xu val src = Input(UInt(XLEN.W)) 10231ea8750SLinJiawei val miscRes = Output(UInt(XLEN.W)) 10331ea8750SLinJiawei }) 104ee8ff153Szfw 10588825c5cSYinan Xu val logicResSel = ParallelMux(List( 106184a1958Szfw ALUOpType.andn -> io.andn, 107184a1958Szfw ALUOpType.and -> io.and, 108184a1958Szfw ALUOpType.orn -> io.orn, 109184a1958Szfw ALUOpType.or -> io.or, 110184a1958Szfw ALUOpType.xnor -> io.xnor, 111184a1958Szfw ALUOpType.xor -> io.xor, 112*a792bcf1SYinan Xu ALUOpType.orh48 -> io.orh48, 113*a792bcf1SYinan Xu ALUOpType.orc_b -> io.orcb 11488825c5cSYinan Xu ).map(x => (x._1(2, 0) === io.func(2, 0), x._2))) 11588825c5cSYinan Xu val maskedLogicRes = Cat(Fill(63, ~io.func(3)), 1.U(1.W)) & logicResSel 11688825c5cSYinan Xu 11788825c5cSYinan Xu val miscRes = ParallelMux(List( 118184a1958Szfw ALUOpType.sext_b -> io.sextb, 119184a1958Szfw ALUOpType.sext_h -> io.sexth, 120184a1958Szfw ALUOpType.zext_h -> io.zexth, 12188825c5cSYinan Xu ALUOpType.rev8 -> io.rev8, 12288825c5cSYinan Xu ALUOpType.szewl1 -> Cat(0.U(31.W), io.src(31, 0), 0.U(1.W)), 12388825c5cSYinan Xu ALUOpType.szewl2 -> Cat(0.U(30.W), io.src(31, 0), 0.U(2.W)), 124*a792bcf1SYinan Xu ALUOpType.szewl3 -> Cat(0.U(29.W), io.src(31, 0), 0.U(3.W)), 12588825c5cSYinan Xu ALUOpType.byte2 -> Cat(0.U(56.W), io.src(15, 8)) 12688825c5cSYinan Xu ).map(x => (x._1(2, 0) === io.func(2, 0), x._2))) 127ee8ff153Szfw 12888825c5cSYinan Xu io.miscRes := Mux(io.func(3) && !io.func(4), miscRes, maskedLogicRes) 12931ea8750SLinJiawei} 13031ea8750SLinJiawei 131ee8ff153Szfwclass ShiftResultSelect(implicit p: Parameters) extends XSModule { 132ee8ff153Szfw val io = IO(new Bundle() { 133ee8ff153Szfw val func = Input(UInt()) 13428c18878Szfw val sll, srl, sra, rol, ror, bclr, bset, binv, bext = Input(UInt(XLEN.W)) 135ee8ff153Szfw val shiftRes = Output(UInt(XLEN.W)) 136ee8ff153Szfw }) 137ee8ff153Szfw 138184a1958Szfw val leftBit = Mux(io.func(1), io.binv, Mux(io.func(0), io.bset, io.bclr)) 139184a1958Szfw val leftRes = Mux(io.func(2), leftBit, io.sll) 140184a1958Szfw val rightRes = Mux(io.func(2), io.sra, Mux(io.func(1), io.bext, io.srl)) 141ee8ff153Szfw 14228c18878Szfw io.shiftRes := Mux(io.func(4), Mux(io.func(3), io.ror, io.rol), Mux(io.func(3), rightRes, leftRes)) 143184a1958Szfw} 144ee8ff153Szfw 145184a1958Szfwclass WordResultSelect(implicit p: Parameters) extends XSModule { 146184a1958Szfw val io = IO(new Bundle() { 147184a1958Szfw val func = Input(UInt()) 14828c18878Szfw val sllw, srlw, sraw, rolw, rorw, addw, subw = Input(UInt((XLEN/2).W)) 149184a1958Szfw val wordRes = Output(UInt(XLEN.W)) 150184a1958Szfw }) 151ee8ff153Szfw 152184a1958Szfw val addsubRes = Mux(io.func(6), io.subw, io.addw) 15328c18878Szfw val shiftRes = Mux(io.func(4), 15428c18878Szfw Mux(io.func(3), io.rorw, io.rolw), 155184a1958Szfw Mux(io.func(3), 156184a1958Szfw Mux(io.func(2), io.sraw, io.srlw), 157184a1958Szfw io.sllw)) 158184a1958Szfw val wordRes = Mux(io.func(6,5) === 2.U, shiftRes, addsubRes) 159184a1958Szfw io.wordRes := SignExt(wordRes, XLEN) 160ee8ff153Szfw} 161ee8ff153Szfw 162ee8ff153Szfw 1632225d46eSJiawei Linclass AluResSel(implicit p: Parameters) extends XSModule { 16431ea8750SLinJiawei val io = IO(new Bundle() { 16531ea8750SLinJiawei val func = Input(UInt()) 166184a1958Szfw val addRes, shiftRes, miscRes, compareRes, wordRes = Input(UInt(XLEN.W)) 16731ea8750SLinJiawei val aluRes = Output(UInt(XLEN.W)) 16831ea8750SLinJiawei }) 169ee8ff153Szfw 170184a1958Szfw val res = Mux(io.func(7), io.wordRes, Mux(io.func(6), 171184a1958Szfw Mux(io.func(5), io.compareRes, io.shiftRes), 172184a1958Szfw Mux(io.func(5), io.addRes, io.miscRes) 173184a1958Szfw )) 174184a1958Szfw io.aluRes := res 17531ea8750SLinJiawei} 17631ea8750SLinJiawei 1772225d46eSJiawei Linclass AluDataModule(implicit p: Parameters) extends XSModule { 178e2203130SLinJiawei val io = IO(new Bundle() { 1792bd5334dSYinan Xu val src = Vec(2, Input(UInt(XLEN.W))) 180e2203130SLinJiawei val func = Input(FuOpType()) 181e2203130SLinJiawei val pred_taken, isBranch = Input(Bool()) 182e2203130SLinJiawei val result = Output(UInt(XLEN.W)) 183e2203130SLinJiawei val taken, mispredict = Output(Bool()) 184e2203130SLinJiawei }) 1852bd5334dSYinan Xu val (src1, src2, func) = (io.src(0), io.src(1), io.func) 186e18c367fSLinJiawei 187184a1958Szfw val addModule = Module(new AddModule) 18888825c5cSYinan Xu // For 64-bit adder: 18988825c5cSYinan Xu // BITS(2, 1): shamt (0, 1, 2, 3) 19088825c5cSYinan Xu // BITS(3 ): different fused cases 191*a792bcf1SYinan Xu val wordMaskAddSource = Cat(Fill(32, func(0)), Fill(32, 1.U)) & src1 192*a792bcf1SYinan Xu val shaddSource = VecInit(Seq( 193*a792bcf1SYinan Xu Cat(wordMaskAddSource(62, 0), 0.U(1.W)), 194*a792bcf1SYinan Xu Cat(wordMaskAddSource(61, 0), 0.U(2.W)), 195*a792bcf1SYinan Xu Cat(wordMaskAddSource(60, 0), 0.U(3.W)), 196*a792bcf1SYinan Xu Cat(wordMaskAddSource(59, 0), 0.U(4.W)) 197*a792bcf1SYinan Xu )) 198*a792bcf1SYinan Xu val sraddSource = VecInit(Seq( 199*a792bcf1SYinan Xu ZeroExt(src1(63, 29), XLEN), 20088825c5cSYinan Xu ZeroExt(src1(63, 30), XLEN), 20188825c5cSYinan Xu ZeroExt(src1(63, 31), XLEN), 20288825c5cSYinan Xu ZeroExt(src1(63, 32), XLEN) 20388825c5cSYinan Xu )) 204*a792bcf1SYinan Xu // TODO: use decoder or other libraries to optimize timing 205*a792bcf1SYinan Xu // Now we assume shadd has the worst timing. 206*a792bcf1SYinan Xu addModule.io.src(0) := Mux(ALUOpType.isShAdd(func), shaddSource(func(2, 1)), 207*a792bcf1SYinan Xu Mux(ALUOpType.isSrAdd(func), sraddSource(func(2, 1)), 208*a792bcf1SYinan Xu Mux(ALUOpType.isAddOddBit(func), ZeroExt(src1(0), XLEN), wordMaskAddSource)) 209*a792bcf1SYinan Xu ) 210*a792bcf1SYinan Xu addModule.io.src(1) := src2 21188825c5cSYinan Xu val add = addModule.io.add 212*a792bcf1SYinan Xu // For 32-bit adder: its source comes from lower 32bits or lowest bit. 213*a792bcf1SYinan Xu addModule.io.srcw := Mux(ALUOpType.isAddOddBit(func), ZeroExt(src1(0), XLEN), src1(31,0)) 21488825c5cSYinan Xu val byteMask = Cat(Fill(56, ~func(1)), 0xff.U(8.W)) 21588825c5cSYinan Xu val bitMask = Cat(Fill(63, ~func(2)), 0x1.U(1.W)) 21688825c5cSYinan Xu val addw = addModule.io.addw & byteMask & bitMask 217ee8ff153Szfw 21831ea8750SLinJiawei val subModule = Module(new SubModule) 219184a1958Szfw val sub = subModule.io.sub 220184a1958Szfw val subw = subModule.io.sub 2212bd5334dSYinan Xu subModule.io.src(0) := src1 2222bd5334dSYinan Xu subModule.io.src(1) := src2 223e18c367fSLinJiawei 224184a1958Szfw val shamt = src2(5, 0) 225184a1958Szfw val revShamt = ~src2(5,0) + 1.U 226ee8ff153Szfw 227184a1958Szfw val leftShiftModule = Module(new LeftShiftModule) 228184a1958Szfw val sll = leftShiftModule.io.sll 22928c18878Szfw val revSll = leftShiftModule.io.revSll 23028c18878Szfw leftShiftModule.io.sllSrc := Cat(Fill(32, func(0)), Fill(32,1.U)) & src1 23128c18878Szfw leftShiftModule.io.shamt := shamt 23228c18878Szfw leftShiftModule.io.revShamt := revShamt 233184a1958Szfw 234184a1958Szfw val leftShiftWordModule = Module(new LeftShiftWordModule) 235184a1958Szfw val sllw = leftShiftWordModule.io.sllw 23628c18878Szfw val revSllw = leftShiftWordModule.io.revSllw 237184a1958Szfw leftShiftWordModule.io.sllSrc := src1 23828c18878Szfw leftShiftWordModule.io.shamt := shamt 23928c18878Szfw leftShiftWordModule.io.revShamt := revShamt 240184a1958Szfw 241184a1958Szfw val rightShiftModule = Module(new RightShiftModule) 242184a1958Szfw val srl = rightShiftModule.io.srl 24328c18878Szfw val revSrl = rightShiftModule.io.revSrl 244184a1958Szfw val sra = rightShiftModule.io.sra 24528c18878Szfw rightShiftModule.io.shamt := shamt 24628c18878Szfw rightShiftModule.io.revShamt := revShamt 247184a1958Szfw rightShiftModule.io.srlSrc := src1 24828c18878Szfw rightShiftModule.io.sraSrc := src1 249184a1958Szfw 250184a1958Szfw val rightShiftWordModule = Module(new RightShiftWordModule) 251184a1958Szfw val srlw = rightShiftWordModule.io.srlw 25228c18878Szfw val revSrlw = rightShiftWordModule.io.revSrlw 253184a1958Szfw val sraw = rightShiftWordModule.io.sraw 25428c18878Szfw rightShiftWordModule.io.shamt := shamt 25528c18878Szfw rightShiftWordModule.io.revShamt := revShamt 256184a1958Szfw rightShiftWordModule.io.srlSrc := src1 257184a1958Szfw rightShiftWordModule.io.sraSrc := src1 258184a1958Szfw 25928c18878Szfw val rol = revSrl | sll 26028c18878Szfw val ror = srl | revSll 26128c18878Szfw val rolw = revSrlw | sllw 26228c18878Szfw val rorw = srlw | revSllw 263184a1958Szfw 264184a1958Szfw val bitShift = 1.U << src2(5, 0) 265184a1958Szfw val bset = src1 | bitShift 266184a1958Szfw val bclr = src1 & ~bitShift 267184a1958Szfw val binv = src1 ^ bitShift 268184a1958Szfw val bext = srl(0) 269184a1958Szfw 2700a6fa50eSzfw val andn = src1 & ~src2 2710a6fa50eSzfw val orn = src1 | ~src2 2720a6fa50eSzfw val xnor = src1 ^ ~src2 2730a6fa50eSzfw val and = src1 & src2 2740a6fa50eSzfw val or = src1 | src2 2750a6fa50eSzfw val xor = src1 ^ src2 27688825c5cSYinan Xu val orh48 = Cat(src1(63, 8), 0.U(8.W)) | src2 277184a1958Szfw val sgtu = sub(XLEN) 278184a1958Szfw val sltu = !sgtu 279ee8ff153Szfw val slt = xor(XLEN-1) ^ sltu 28028c18878Szfw // val maxMin = Mux(slt ^ func(0), src2, src1) 28128c18878Szfw // val maxMinU = Mux(sltu^ func(0), src2, src1) 282ee8ff153Szfw val maxMin = Mux(slt ^ func(0), src2, src1) 28328c18878Szfw val maxMinU = Mux((sgtu && func(0)) || ~(sgtu && func(0)), src2, src1) 284ee8ff153Szfw val sextb = SignExt(src1(7, 0), XLEN) 285ee8ff153Szfw val sexth = SignExt(src1(15, 0), XLEN) 286ee8ff153Szfw val zexth = ZeroExt(src1(15, 0), XLEN) 287ee8ff153Szfw val rev8 = Cat(src1(7,0), src1(15,8), src1(23,16), src1(31,24), 288ee8ff153Szfw src1(39,32), src1(47,40), src1(55,48), src1(63,56)) 289ee8ff153Szfw val orcb = Cat(Reverse(src1(63,56)), Reverse(src1(55,48)), Reverse(src1(47,40)), Reverse(src1(39,32)), 290ee8ff153Szfw Reverse(src1(31,24)), Reverse(src1(23,16)), Reverse(src1(15,8)), Reverse(src1(7,0))) 291ee8ff153Szfw 292ee8ff153Szfw val branchOpTable = List( 293ee8ff153Szfw ALUOpType.getBranchType(ALUOpType.beq) -> !xor.orR, 294ee8ff153Szfw ALUOpType.getBranchType(ALUOpType.blt) -> slt, 295ee8ff153Szfw ALUOpType.getBranchType(ALUOpType.bltu) -> sltu 296ee8ff153Szfw ) 297ee8ff153Szfw val taken = LookupTree(ALUOpType.getBranchType(func), branchOpTable) ^ ALUOpType.isBranchInvert(func) 298ee8ff153Szfw 299ee8ff153Szfw 300184a1958Szfw // Result Select 3013ef996e9SLinJiawei 302184a1958Szfw val compareRes = Mux(func(2), Mux(func(1), maxMin, maxMinU), Mux(func(1), slt, Mux(func(0), sltu, sub))) 303ee8ff153Szfw 304184a1958Szfw val shiftResSel = Module(new ShiftResultSelect) 305184a1958Szfw shiftResSel.io.func := func(4,0) 306184a1958Szfw shiftResSel.io.sll := sll 307184a1958Szfw shiftResSel.io.srl := srl 308184a1958Szfw shiftResSel.io.sra := sra 30928c18878Szfw shiftResSel.io.rol := rol 31028c18878Szfw shiftResSel.io.ror := ror 311184a1958Szfw shiftResSel.io.bclr := bclr 312184a1958Szfw shiftResSel.io.binv := binv 313184a1958Szfw shiftResSel.io.bset := bset 314184a1958Szfw shiftResSel.io.bext := bext 315184a1958Szfw val shiftRes = shiftResSel.io.shiftRes 31631ea8750SLinJiawei 31731ea8750SLinJiawei val miscResSel = Module(new MiscResultSelect) 31888825c5cSYinan Xu miscResSel.io.func := func(4, 0) 319ee8ff153Szfw miscResSel.io.andn := andn 320ee8ff153Szfw miscResSel.io.orn := orn 321ee8ff153Szfw miscResSel.io.xnor := xnor 322ee8ff153Szfw miscResSel.io.and := and 323ee8ff153Szfw miscResSel.io.or := or 324ee8ff153Szfw miscResSel.io.xor := xor 32588825c5cSYinan Xu miscResSel.io.orh48 := orh48 326ee8ff153Szfw miscResSel.io.sextb := sextb 327ee8ff153Szfw miscResSel.io.sexth := sexth 328ee8ff153Szfw miscResSel.io.zexth := zexth 329ee8ff153Szfw miscResSel.io.rev8 := rev8 330ee8ff153Szfw miscResSel.io.orcb := orcb 33188825c5cSYinan Xu miscResSel.io.src := src1 33231ea8750SLinJiawei val miscRes = miscResSel.io.miscRes 33331ea8750SLinJiawei 334184a1958Szfw val wordResSel = Module(new WordResultSelect) 335184a1958Szfw wordResSel.io.func := func 336184a1958Szfw wordResSel.io.addw := addw 337184a1958Szfw wordResSel.io.subw := subw 338184a1958Szfw wordResSel.io.sllw := sllw 339184a1958Szfw wordResSel.io.srlw := srlw 340184a1958Szfw wordResSel.io.sraw := sraw 34128c18878Szfw wordResSel.io.rolw := rolw 34228c18878Szfw wordResSel.io.rorw := rorw 343184a1958Szfw val wordRes = wordResSel.io.wordRes 344ee8ff153Szfw 34531ea8750SLinJiawei val aluResSel = Module(new AluResSel) 34631ea8750SLinJiawei aluResSel.io.func := func 347184a1958Szfw aluResSel.io.addRes := add 348184a1958Szfw aluResSel.io.compareRes := compareRes 349ee8ff153Szfw aluResSel.io.shiftRes := shiftRes 35031ea8750SLinJiawei aluResSel.io.miscRes := miscRes 351184a1958Szfw aluResSel.io.wordRes := wordRes 35231ea8750SLinJiawei val aluRes = aluResSel.io.aluRes 353e18c367fSLinJiawei 354e2203130SLinJiawei io.result := aluRes 355e2203130SLinJiawei io.taken := taken 356e2203130SLinJiawei io.mispredict := (io.pred_taken ^ taken) && io.isBranch 357e2203130SLinJiawei} 358e2203130SLinJiawei 359adb5df20SYinan Xuclass Alu(implicit p: Parameters) extends FUWithRedirect { 360e2203130SLinJiawei 361e2203130SLinJiawei val (src1, src2, func, pc, uop) = ( 362e2203130SLinJiawei io.in.bits.src(0), 363e2203130SLinJiawei io.in.bits.src(1), 364e2203130SLinJiawei io.in.bits.uop.ctrl.fuOpType, 365e2203130SLinJiawei SignExt(io.in.bits.uop.cf.pc, AddrBits), 366e2203130SLinJiawei io.in.bits.uop 367e2203130SLinJiawei ) 368e2203130SLinJiawei 369e2203130SLinJiawei val valid = io.in.valid 370e2203130SLinJiawei val isBranch = ALUOpType.isBranch(func) 371e2203130SLinJiawei val dataModule = Module(new AluDataModule) 372e2203130SLinJiawei 3732bd5334dSYinan Xu dataModule.io.src(0) := src1 3742bd5334dSYinan Xu dataModule.io.src(1) := src2 375e2203130SLinJiawei dataModule.io.func := func 376e2203130SLinJiawei dataModule.io.pred_taken := uop.cf.pred_taken 377e2203130SLinJiawei dataModule.io.isBranch := isBranch 378e2203130SLinJiawei 379e18c367fSLinJiawei redirectOutValid := io.out.valid && isBranch 380151e3043SLinJiawei redirectOut := DontCare 381bfb958a3SYinan Xu redirectOut.level := RedirectLevel.flushAfter 382e18c367fSLinJiawei redirectOut.roqIdx := uop.roqIdx 383cde9280dSLinJiawei redirectOut.ftqIdx := uop.cf.ftqPtr 384cde9280dSLinJiawei redirectOut.ftqOffset := uop.cf.ftqOffset 385e2203130SLinJiawei redirectOut.cfiUpdate.isMisPred := dataModule.io.mispredict 386e2203130SLinJiawei redirectOut.cfiUpdate.taken := dataModule.io.taken 387cde9280dSLinJiawei redirectOut.cfiUpdate.predTaken := uop.cf.pred_taken 388151e3043SLinJiawei 389e18c367fSLinJiawei io.in.ready := io.out.ready 390e18c367fSLinJiawei io.out.valid := valid 391e18c367fSLinJiawei io.out.bits.uop <> io.in.bits.uop 392e2203130SLinJiawei io.out.bits.data := dataModule.io.result 393e18c367fSLinJiawei} 394