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._ 223c02ee8fSwakafaimport utility.{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() { 170*edace9bfSxiwenx val func = Input(UInt(3.W)) 171*edace9bfSxiwenx val addRes, shiftRes, miscRes, compareRes, wordRes = Input(UInt(XLEN.W)) 17231ea8750SLinJiawei val aluRes = Output(UInt(XLEN.W)) 17331ea8750SLinJiawei }) 174ee8ff153Szfw 175*edace9bfSxiwenx val res = Mux(io.func(2, 1) === 0.U, Mux(io.func(0), io.wordRes, io.shiftRes), 176*edace9bfSxiwenx 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 result = Output(UInt(XLEN.W)) 185e2203130SLinJiawei }) 1862bd5334dSYinan Xu val (src1, src2, func) = (io.src(0), io.src(1), io.func) 187e18c367fSLinJiawei 188675acc68SYinan Xu val shamt = src2(5, 0) 189675acc68SYinan Xu val revShamt = ~src2(5,0) + 1.U 190675acc68SYinan Xu 191675acc68SYinan Xu // slliuw, sll 192675acc68SYinan Xu val leftShiftModule = Module(new LeftShiftModule) 193675acc68SYinan Xu val sll = leftShiftModule.io.sll 194675acc68SYinan Xu val revSll = leftShiftModule.io.revSll 195675acc68SYinan Xu leftShiftModule.io.sllSrc := Cat(Fill(32, func(0)), Fill(32, 1.U)) & src1 196675acc68SYinan Xu leftShiftModule.io.shamt := shamt 197675acc68SYinan Xu leftShiftModule.io.revShamt := revShamt 198675acc68SYinan Xu 199675acc68SYinan Xu // bclr, bset, binv 200675acc68SYinan Xu val bitShift = 1.U << src2(5, 0) 201675acc68SYinan Xu val bclr = src1 & ~bitShift 202675acc68SYinan Xu val bset = src1 | bitShift 203675acc68SYinan Xu val binv = src1 ^ bitShift 204675acc68SYinan Xu 205675acc68SYinan Xu // srl, sra, bext 206675acc68SYinan Xu val rightShiftModule = Module(new RightShiftModule) 207675acc68SYinan Xu val srl = rightShiftModule.io.srl 208675acc68SYinan Xu val revSrl = rightShiftModule.io.revSrl 209675acc68SYinan Xu val sra = rightShiftModule.io.sra 210675acc68SYinan Xu rightShiftModule.io.shamt := shamt 211675acc68SYinan Xu rightShiftModule.io.revShamt := revShamt 212675acc68SYinan Xu rightShiftModule.io.srlSrc := src1 213675acc68SYinan Xu rightShiftModule.io.sraSrc := src1 214675acc68SYinan Xu val bext = srl(0) 215675acc68SYinan Xu 216675acc68SYinan Xu val rol = revSrl | sll 217675acc68SYinan Xu val ror = srl | revSll 218675acc68SYinan Xu 219675acc68SYinan Xu // addw 220184a1958Szfw val addModule = Module(new AddModule) 221675acc68SYinan Xu addModule.io.srcw := Mux(!func(2) && func(0), ZeroExt(src1(0), XLEN), src1(31, 0)) 222675acc68SYinan Xu val addwResultAll = VecInit(Seq( 223675acc68SYinan Xu ZeroExt(addModule.io.addw(0), XLEN), 224675acc68SYinan Xu ZeroExt(addModule.io.addw(7, 0), XLEN), 225675acc68SYinan Xu ZeroExt(addModule.io.addw(15, 0), XLEN), 226675acc68SYinan Xu SignExt(addModule.io.addw(15, 0), XLEN) 227675acc68SYinan Xu )) 228675acc68SYinan Xu val addw = Mux(func(2), addwResultAll(func(1, 0)), addModule.io.addw) 229675acc68SYinan Xu 230675acc68SYinan Xu // subw 231675acc68SYinan Xu val subModule = Module(new SubModule) 232675acc68SYinan Xu val subw = subModule.io.sub 233675acc68SYinan Xu 234675acc68SYinan Xu // sllw 235675acc68SYinan Xu val leftShiftWordModule = Module(new LeftShiftWordModule) 236675acc68SYinan Xu val sllw = leftShiftWordModule.io.sllw 237675acc68SYinan Xu val revSllw = leftShiftWordModule.io.revSllw 238675acc68SYinan Xu leftShiftWordModule.io.sllSrc := src1 239675acc68SYinan Xu leftShiftWordModule.io.shamt := shamt 240675acc68SYinan Xu leftShiftWordModule.io.revShamt := revShamt 241675acc68SYinan Xu 242675acc68SYinan Xu val rightShiftWordModule = Module(new RightShiftWordModule) 243675acc68SYinan Xu val srlw = rightShiftWordModule.io.srlw 244675acc68SYinan Xu val revSrlw = rightShiftWordModule.io.revSrlw 245675acc68SYinan Xu val sraw = rightShiftWordModule.io.sraw 246675acc68SYinan Xu rightShiftWordModule.io.shamt := shamt 247675acc68SYinan Xu rightShiftWordModule.io.revShamt := revShamt 248675acc68SYinan Xu rightShiftWordModule.io.srlSrc := src1 249675acc68SYinan Xu rightShiftWordModule.io.sraSrc := src1 250675acc68SYinan Xu 251675acc68SYinan Xu val rolw = revSrlw | sllw 252675acc68SYinan Xu val rorw = srlw | revSllw 253675acc68SYinan Xu 254675acc68SYinan Xu // add 255a792bcf1SYinan Xu val wordMaskAddSource = Cat(Fill(32, func(0)), Fill(32, 1.U)) & src1 256a792bcf1SYinan Xu val shaddSource = VecInit(Seq( 257a792bcf1SYinan Xu Cat(wordMaskAddSource(62, 0), 0.U(1.W)), 258a792bcf1SYinan Xu Cat(wordMaskAddSource(61, 0), 0.U(2.W)), 259a792bcf1SYinan Xu Cat(wordMaskAddSource(60, 0), 0.U(3.W)), 260a792bcf1SYinan Xu Cat(wordMaskAddSource(59, 0), 0.U(4.W)) 261a792bcf1SYinan Xu )) 262a792bcf1SYinan Xu val sraddSource = VecInit(Seq( 263a792bcf1SYinan Xu ZeroExt(src1(63, 29), XLEN), 26488825c5cSYinan Xu ZeroExt(src1(63, 30), XLEN), 26588825c5cSYinan Xu ZeroExt(src1(63, 31), XLEN), 26688825c5cSYinan Xu ZeroExt(src1(63, 32), XLEN) 26788825c5cSYinan Xu )) 268a792bcf1SYinan Xu // TODO: use decoder or other libraries to optimize timing 269a792bcf1SYinan Xu // Now we assume shadd has the worst timing. 270675acc68SYinan Xu addModule.io.src(0) := Mux(func(3), shaddSource(func(2, 1)), 271675acc68SYinan Xu Mux(func(2), sraddSource(func(1, 0)), 272675acc68SYinan Xu Mux(func(1), ZeroExt(src1(0), XLEN), wordMaskAddSource)) 273a792bcf1SYinan Xu ) 274a792bcf1SYinan Xu addModule.io.src(1) := src2 27588825c5cSYinan Xu val add = addModule.io.add 276ee8ff153Szfw 277675acc68SYinan Xu // sub 278184a1958Szfw val sub = subModule.io.sub 2792bd5334dSYinan Xu subModule.io.src(0) := src1 2802bd5334dSYinan Xu subModule.io.src(1) := src2 2817b441e5eSYinan Xu val sltu = !sub(XLEN) 282675acc68SYinan Xu val slt = src1(XLEN - 1) ^ src2(XLEN - 1) ^ sltu 283ee8ff153Szfw val maxMin = Mux(slt ^ func(0), src2, src1) 2847b441e5eSYinan Xu val maxMinU = Mux(sltu ^ func(0), src2, src1) 285675acc68SYinan Xu val compareRes = Mux(func(2), Mux(func(1), maxMin, maxMinU), Mux(func(1), slt, Mux(func(0), sltu, sub))) 286ee8ff153Szfw 287675acc68SYinan Xu // logic 288675acc68SYinan Xu val logicSrc2 = Mux(!func(5) && func(0), ~src2, src2) 289675acc68SYinan Xu val and = src1 & logicSrc2 290675acc68SYinan Xu val or = src1 | logicSrc2 291675acc68SYinan Xu val xor = src1 ^ logicSrc2 29273be64b3SJiawei Lin val orcb = Cat((0 until 8).map(i => Fill(8, src1(i * 8 + 7, i * 8).orR)).reverse) 293675acc68SYinan Xu val orh48 = Cat(src1(63, 8), 0.U(8.W)) | src2 294675acc68SYinan Xu 295675acc68SYinan Xu val sextb = SignExt(src1(7, 0), XLEN) 296675acc68SYinan Xu val packh = Cat(src2(7,0), src1(7,0)) 297675acc68SYinan Xu val sexth = SignExt(src1(15, 0), XLEN) 298675acc68SYinan Xu val packw = SignExt(Cat(src2(15, 0), src1(15, 0)), XLEN) 299675acc68SYinan Xu 30073be64b3SJiawei Lin val revb = Cat((0 until 8).map(i => Reverse(src1(8 * i + 7, 8 * i))).reverse) 301675acc68SYinan Xu val pack = Cat(src2(31, 0), src1(31, 0)) 302675acc68SYinan Xu val rev8 = Cat((0 until 8).map(i => src1(8 * i + 7, 8 * i))) 303675acc68SYinan Xu 304ee8ff153Szfw 305184a1958Szfw // Result Select 306184a1958Szfw val shiftResSel = Module(new ShiftResultSelect) 307675acc68SYinan Xu shiftResSel.io.func := func(3, 0) 308184a1958Szfw shiftResSel.io.sll := sll 309184a1958Szfw shiftResSel.io.srl := srl 310184a1958Szfw shiftResSel.io.sra := sra 31128c18878Szfw shiftResSel.io.rol := rol 31228c18878Szfw shiftResSel.io.ror := ror 313184a1958Szfw shiftResSel.io.bclr := bclr 314184a1958Szfw shiftResSel.io.binv := binv 315184a1958Szfw shiftResSel.io.bset := bset 316184a1958Szfw shiftResSel.io.bext := bext 317184a1958Szfw val shiftRes = shiftResSel.io.shiftRes 31831ea8750SLinJiawei 31931ea8750SLinJiawei val miscResSel = Module(new MiscResultSelect) 320675acc68SYinan Xu miscResSel.io.func := func(5, 0) 321ee8ff153Szfw miscResSel.io.and := and 322ee8ff153Szfw miscResSel.io.or := or 323ee8ff153Szfw miscResSel.io.xor := xor 324675acc68SYinan Xu miscResSel.io.orcb := orcb 32588825c5cSYinan Xu miscResSel.io.orh48 := orh48 326ee8ff153Szfw miscResSel.io.sextb := sextb 327675acc68SYinan Xu miscResSel.io.packh := packh 328ee8ff153Szfw miscResSel.io.sexth := sexth 329675acc68SYinan Xu miscResSel.io.packw := packw 330675acc68SYinan Xu miscResSel.io.revb := revb 331ee8ff153Szfw miscResSel.io.rev8 := rev8 332675acc68SYinan Xu miscResSel.io.pack := pack 33388825c5cSYinan Xu miscResSel.io.src := src1 33431ea8750SLinJiawei val miscRes = miscResSel.io.miscRes 33531ea8750SLinJiawei 336184a1958Szfw val wordResSel = Module(new WordResultSelect) 337184a1958Szfw wordResSel.io.func := func 338184a1958Szfw wordResSel.io.addw := addw 339184a1958Szfw wordResSel.io.subw := subw 340184a1958Szfw wordResSel.io.sllw := sllw 341184a1958Szfw wordResSel.io.srlw := srlw 342184a1958Szfw wordResSel.io.sraw := sraw 34328c18878Szfw wordResSel.io.rolw := rolw 34428c18878Szfw wordResSel.io.rorw := rorw 345184a1958Szfw val wordRes = wordResSel.io.wordRes 346ee8ff153Szfw 34731ea8750SLinJiawei val aluResSel = Module(new AluResSel) 348*edace9bfSxiwenx aluResSel.io.func := func(6, 4) 349184a1958Szfw aluResSel.io.addRes := add 350184a1958Szfw aluResSel.io.compareRes := compareRes 351ee8ff153Szfw aluResSel.io.shiftRes := shiftRes 35231ea8750SLinJiawei aluResSel.io.miscRes := miscRes 353184a1958Szfw aluResSel.io.wordRes := wordRes 35431ea8750SLinJiawei val aluRes = aluResSel.io.aluRes 355e18c367fSLinJiawei 356e2203130SLinJiawei io.result := aluRes 357e2203130SLinJiawei} 358e2203130SLinJiawei 359adb5df20SYinan Xuclass Alu(implicit p: Parameters) extends FUWithRedirect { 360e2203130SLinJiawei 361675acc68SYinan Xu val uop = io.in.bits.uop 362e2203130SLinJiawei 363e2203130SLinJiawei val dataModule = Module(new AluDataModule) 3643a6ab23aSczw val bru = Module(new Branch()(p)) 365*edace9bfSxiwenx val vset = Module(new Vset()(p)) 3663a6ab23aSczw 3673a6ab23aSczw bru.io.in <> io.in 3683a6ab23aSczw bru.io.in.bits.uop <> io.in.bits.uop 3693a6ab23aSczw bru.io.redirectIn <> io.redirectIn 3703a6ab23aSczw bru.io.out.ready := io.out.ready 371e2203130SLinJiawei 372*edace9bfSxiwenx vset.io.in <> io.in 373*edace9bfSxiwenx vset.io.in.bits.uop <> io.in.bits.uop 374*edace9bfSxiwenx vset.io.redirectIn <> io.redirectIn 375*edace9bfSxiwenx vset.io.out.ready := io.out.ready 376*edace9bfSxiwenx 377675acc68SYinan Xu dataModule.io.src := io.in.bits.src.take(2) 378675acc68SYinan Xu dataModule.io.func := io.in.bits.uop.ctrl.fuOpType 379e2203130SLinJiawei 3803a6ab23aSczw redirectOutValid := bru.redirectOutValid 3813a6ab23aSczw redirectOut <> bru.redirectOut 382151e3043SLinJiawei 383e18c367fSLinJiawei io.in.ready := io.out.ready 384675acc68SYinan Xu io.out.valid := io.in.valid 385e18c367fSLinJiawei io.out.bits.uop <> io.in.bits.uop 386*edace9bfSxiwenx io.out.bits.data := Mux(vset.io.out.valid, vset.io.out.bits.data, dataModule.io.result) 387e18c367fSLinJiawei} 388