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 254aa9ed34Sfdyclass VsetModule(implicit p: Parameters) extends XSModule { 264aa9ed34Sfdy val io = IO(new Bundle() { 274aa9ed34Sfdy val lsrc0 = Input(UInt(6.W)) 284aa9ed34Sfdy val ldest = Input(UInt(6.W)) 294aa9ed34Sfdy val src0 = Input(UInt(XLEN.W)) 304aa9ed34Sfdy val src1 = Input(UInt(XLEN.W)) 314aa9ed34Sfdy val func = Input(FuOpType()) 324aa9ed34Sfdy val vconfig = Input(UInt(16.W)) 334aa9ed34Sfdy 344aa9ed34Sfdy val res = Output(UInt(XLEN.W)) 354aa9ed34Sfdy }) 364aa9ed34Sfdy val vtype = io.src1(7, 0) 374aa9ed34Sfdy val vlmul = vtype(2, 0) 384aa9ed34Sfdy val vsew = vtype(5, 3) 394aa9ed34Sfdy 404aa9ed34Sfdy val avlImm = Cat(0.U(3.W), io.src1(14, 10)) 414aa9ed34Sfdy val vlLast = io.vconfig(15, 8) 424aa9ed34Sfdy 434aa9ed34Sfdy val rd = io.ldest 444aa9ed34Sfdy val rs1 = io.lsrc0 454aa9ed34Sfdy val vl = WireInit(0.U(XLEN.W)) 464aa9ed34Sfdy val vconfig = WireInit(0.U(XLEN.W)) 474aa9ed34Sfdy 484aa9ed34Sfdy // vlen = 128 494aa9ed34Sfdy val vlmaxVec = (0 to 7).map(i => if(i < 4) (16 << i).U(8.W) else (16 >> (8 - i)).U(8.W)) 504aa9ed34Sfdy val shamt = vlmul + (~vsew).asUInt + 1.U 514aa9ed34Sfdy val vlmax = ParallelMux((0 to 7).map(_.U).map(_ === shamt), vlmaxVec) 524aa9ed34Sfdy 534aa9ed34Sfdy val isVsetivli = io.func === ALUOpType.vsetivli2 || io.func === ALUOpType.vsetivli1 544aa9ed34Sfdy val vlWhenRs1Not0 = Mux(isVsetivli, Mux(avlImm > vlmax, vlmax, avlImm), 554aa9ed34Sfdy Mux(io.src0 > vlmax, vlmax, io.src0)) 564aa9ed34Sfdy vl := Mux(rs1 =/= 0.U, vlWhenRs1Not0, 574aa9ed34Sfdy Mux(rd === 0.U, Cat(0.U(56.W), vlLast), vlmax)) 584aa9ed34Sfdy 594aa9ed34Sfdy vconfig := Cat(0.U(48.W), vl(7, 0), vtype) 604aa9ed34Sfdy 614aa9ed34Sfdy io.res := Mux(io.func === ALUOpType.vsetvli2 || io.func === ALUOpType.vsetvl2 || io.func === ALUOpType.vsetivli2, vl, vconfig) 624aa9ed34Sfdy} 634aa9ed34Sfdy 642225d46eSJiawei Linclass AddModule(implicit p: Parameters) extends XSModule { 6531ea8750SLinJiawei val io = IO(new Bundle() { 662bd5334dSYinan Xu val src = Vec(2, Input(UInt(XLEN.W))) 6728c18878Szfw val srcw = Input(UInt((XLEN/2).W)) 6828c18878Szfw val add = Output(UInt(XLEN.W)) 6928c18878Szfw val addw = Output(UInt((XLEN/2).W)) 7031ea8750SLinJiawei }) 7128c18878Szfw io.add := io.src(0) + io.src(1) 7288825c5cSYinan Xu // TODO: why this extra adder? 7328c18878Szfw io.addw := io.srcw + io.src(1)(31,0) 7431ea8750SLinJiawei} 7531ea8750SLinJiawei 762225d46eSJiawei Linclass SubModule(implicit p: Parameters) extends XSModule { 7731ea8750SLinJiawei val io = IO(new Bundle() { 782bd5334dSYinan Xu val src = Vec(2, Input(UInt(XLEN.W))) 79184a1958Szfw val sub = Output(UInt((XLEN+1).W)) 8031ea8750SLinJiawei }) 81184a1958Szfw io.sub := (io.src(0) +& (~io.src(1)).asUInt()) + 1.U 8231ea8750SLinJiawei} 8331ea8750SLinJiawei 842225d46eSJiawei Linclass LeftShiftModule(implicit p: Parameters) extends XSModule { 8531ea8750SLinJiawei val io = IO(new Bundle() { 8631ea8750SLinJiawei val shamt = Input(UInt(6.W)) 8728c18878Szfw val revShamt = Input(UInt(6.W)) 8831ea8750SLinJiawei val sllSrc = Input(UInt(XLEN.W)) 8931ea8750SLinJiawei val sll = Output(UInt(XLEN.W)) 9028c18878Szfw val revSll = Output(UInt(XLEN.W)) 9131ea8750SLinJiawei }) 92184a1958Szfw io.sll := io.sllSrc << io.shamt 9328c18878Szfw io.revSll := io.sllSrc << io.revShamt 94184a1958Szfw} 95184a1958Szfw 96184a1958Szfwclass LeftShiftWordModule(implicit p: Parameters) extends XSModule { 97184a1958Szfw val io = IO(new Bundle() { 98184a1958Szfw val shamt = Input(UInt(5.W)) 9928c18878Szfw val revShamt = Input(UInt(5.W)) 100184a1958Szfw val sllSrc = Input(UInt((XLEN/2).W)) 101184a1958Szfw val sllw = Output(UInt((XLEN/2).W)) 10228c18878Szfw val revSllw = Output(UInt((XLEN/2).W)) 103184a1958Szfw }) 104184a1958Szfw io.sllw := io.sllSrc << io.shamt 10528c18878Szfw io.revSllw := io.sllSrc << io.revShamt 10631ea8750SLinJiawei} 10731ea8750SLinJiawei 1082225d46eSJiawei Linclass RightShiftModule(implicit p: Parameters) extends XSModule { 10931ea8750SLinJiawei val io = IO(new Bundle() { 11031ea8750SLinJiawei val shamt = Input(UInt(6.W)) 11128c18878Szfw val revShamt = Input(UInt(6.W)) 11231ea8750SLinJiawei val srlSrc, sraSrc = Input(UInt(XLEN.W)) 113184a1958Szfw val srl, sra = Output(UInt(XLEN.W)) 11428c18878Szfw val revSrl = Output(UInt(XLEN.W)) 11531ea8750SLinJiawei }) 116184a1958Szfw io.srl := io.srlSrc >> io.shamt 117184a1958Szfw io.sra := (io.sraSrc.asSInt() >> io.shamt).asUInt() 11828c18878Szfw io.revSrl := io.srlSrc >> io.revShamt 11931ea8750SLinJiawei} 12031ea8750SLinJiawei 121184a1958Szfwclass RightShiftWordModule(implicit p: Parameters) extends XSModule { 122ee8ff153Szfw val io = IO(new Bundle() { 123184a1958Szfw val shamt = Input(UInt(5.W)) 12428c18878Szfw val revShamt = Input(UInt(5.W)) 125184a1958Szfw val srlSrc, sraSrc = Input(UInt((XLEN/2).W)) 126184a1958Szfw val srlw, sraw = Output(UInt((XLEN/2).W)) 12728c18878Szfw val revSrlw = Output(UInt((XLEN/2).W)) 128ee8ff153Szfw }) 129184a1958Szfw 130184a1958Szfw io.srlw := io.srlSrc >> io.shamt 131184a1958Szfw io.sraw := (io.sraSrc.asSInt() >> io.shamt).asUInt() 13228c18878Szfw io.revSrlw := io.srlSrc >> io.revShamt 133ee8ff153Szfw} 134ee8ff153Szfw 135184a1958Szfw 1362225d46eSJiawei Linclass MiscResultSelect(implicit p: Parameters) extends XSModule { 13731ea8750SLinJiawei val io = IO(new Bundle() { 138675acc68SYinan Xu val func = Input(UInt(6.W)) 139675acc68SYinan Xu val and, or, xor, orcb, orh48, sextb, packh, sexth, packw, revb, rev8, pack = Input(UInt(XLEN.W)) 14088825c5cSYinan Xu val src = Input(UInt(XLEN.W)) 14131ea8750SLinJiawei val miscRes = Output(UInt(XLEN.W)) 14231ea8750SLinJiawei }) 143ee8ff153Szfw 144675acc68SYinan Xu val logicRes = VecInit(Seq( 145675acc68SYinan Xu io.and, 146675acc68SYinan Xu io.or, 147675acc68SYinan Xu io.xor, 148675acc68SYinan Xu io.orcb 149675acc68SYinan Xu ))(io.func(2, 1)) 150675acc68SYinan Xu val miscRes = VecInit(Seq(io.sextb, io.packh, io.sexth, io.packw))(io.func(1, 0)) 151675acc68SYinan Xu val logicBase = Mux(io.func(3), miscRes, logicRes) 15288825c5cSYinan Xu 153675acc68SYinan Xu val revRes = VecInit(Seq(io.revb, io.rev8, io.pack, io.orh48))(io.func(1, 0)) 154675acc68SYinan Xu val customRes = VecInit(Seq( 155675acc68SYinan Xu Cat(0.U(31.W), io.src(31, 0), 0.U(1.W)), 156675acc68SYinan Xu Cat(0.U(30.W), io.src(31, 0), 0.U(2.W)), 157675acc68SYinan Xu Cat(0.U(29.W), io.src(31, 0), 0.U(3.W)), 158675acc68SYinan Xu Cat(0.U(56.W), io.src(15, 8))))(io.func(1, 0)) 159675acc68SYinan Xu val logicAdv = Mux(io.func(3), customRes, revRes) 160ee8ff153Szfw 161675acc68SYinan Xu val mask = Cat(Fill(15, io.func(0)), 1.U(1.W)) 162675acc68SYinan Xu val maskedLogicRes = mask & logicRes 163675acc68SYinan Xu 164675acc68SYinan Xu io.miscRes := Mux(io.func(5), maskedLogicRes, Mux(io.func(4), logicAdv, logicBase)) 16531ea8750SLinJiawei} 16631ea8750SLinJiawei 167ee8ff153Szfwclass ShiftResultSelect(implicit p: Parameters) extends XSModule { 168ee8ff153Szfw val io = IO(new Bundle() { 169675acc68SYinan Xu val func = Input(UInt(4.W)) 17028c18878Szfw val sll, srl, sra, rol, ror, bclr, bset, binv, bext = Input(UInt(XLEN.W)) 171ee8ff153Szfw val shiftRes = Output(UInt(XLEN.W)) 172ee8ff153Szfw }) 173ee8ff153Szfw 174675acc68SYinan Xu // val leftBit = Mux(io.func(1), io.binv, Mux(io.func(0), io.bset, io.bclr)) 175675acc68SYinan Xu // val leftRes = Mux(io.func(2), leftBit, io.sll) 176675acc68SYinan Xu // val rightRes = Mux(io.func(1) && io.func(0), io.sra, Mux(io.func(1), io.bext, io.srl)) 177675acc68SYinan Xu val resultSource = VecInit(Seq( 178675acc68SYinan Xu io.sll, 179675acc68SYinan Xu io.sll, 180675acc68SYinan Xu io.bclr, 181675acc68SYinan Xu io.bset, 182675acc68SYinan Xu io.binv, 183675acc68SYinan Xu io.srl, 184675acc68SYinan Xu io.bext, 185675acc68SYinan Xu io.sra 186675acc68SYinan Xu )) 187675acc68SYinan Xu val simple = resultSource(io.func(2, 0)) 188ee8ff153Szfw 1897b441e5eSYinan Xu io.shiftRes := Mux(io.func(3), Mux(io.func(1), io.ror, io.rol), simple) 190184a1958Szfw} 191ee8ff153Szfw 192184a1958Szfwclass WordResultSelect(implicit p: Parameters) extends XSModule { 193184a1958Szfw val io = IO(new Bundle() { 194184a1958Szfw val func = Input(UInt()) 19528c18878Szfw val sllw, srlw, sraw, rolw, rorw, addw, subw = Input(UInt((XLEN/2).W)) 196184a1958Szfw val wordRes = Output(UInt(XLEN.W)) 197184a1958Szfw }) 198ee8ff153Szfw 199675acc68SYinan Xu val addsubRes = Mux(!io.func(2) && io.func(1), io.subw, io.addw) 200675acc68SYinan Xu val shiftRes = Mux(io.func(2), Mux(io.func(0), io.rorw, io.rolw), 201675acc68SYinan Xu Mux(io.func(1), io.sraw, Mux(io.func(0), io.srlw, io.sllw))) 202675acc68SYinan Xu val wordRes = Mux(io.func(3), shiftRes, addsubRes) 203184a1958Szfw io.wordRes := SignExt(wordRes, XLEN) 204ee8ff153Szfw} 205ee8ff153Szfw 206ee8ff153Szfw 2072225d46eSJiawei Linclass AluResSel(implicit p: Parameters) extends XSModule { 20831ea8750SLinJiawei val io = IO(new Bundle() { 2094aa9ed34Sfdy val func = Input(UInt(4.W)) 2104aa9ed34Sfdy val addRes, shiftRes, miscRes, compareRes, wordRes, vsetRes = Input(UInt(XLEN.W)) 21131ea8750SLinJiawei val aluRes = Output(UInt(XLEN.W)) 21231ea8750SLinJiawei }) 213ee8ff153Szfw 2144aa9ed34Sfdy val res = Mux(io.func(3), io.vsetRes, 2154aa9ed34Sfdy Mux(io.func(2, 1) === 0.U, Mux(io.func(0), io.wordRes, io.shiftRes), 2164aa9ed34Sfdy Mux(!io.func(2), Mux(io.func(0), io.compareRes, io.addRes), io.miscRes))) 217184a1958Szfw io.aluRes := res 21831ea8750SLinJiawei} 21931ea8750SLinJiawei 2202225d46eSJiawei Linclass AluDataModule(implicit p: Parameters) extends XSModule { 221e2203130SLinJiawei val io = IO(new Bundle() { 2222bd5334dSYinan Xu val src = Vec(2, Input(UInt(XLEN.W))) 223e2203130SLinJiawei val func = Input(FuOpType()) 224e2203130SLinJiawei val result = Output(UInt(XLEN.W)) 2254aa9ed34Sfdy val lsrc0 = Input(UInt(6.W)) 2264aa9ed34Sfdy val ldest = Input(UInt(6.W)) 2274aa9ed34Sfdy val vconfig = Input(UInt(16.W)) 228e2203130SLinJiawei }) 2292bd5334dSYinan Xu val (src1, src2, func) = (io.src(0), io.src(1), io.func) 230e18c367fSLinJiawei 231675acc68SYinan Xu val shamt = src2(5, 0) 232675acc68SYinan Xu val revShamt = ~src2(5,0) + 1.U 233675acc68SYinan Xu 234675acc68SYinan Xu // slliuw, sll 235675acc68SYinan Xu val leftShiftModule = Module(new LeftShiftModule) 236675acc68SYinan Xu val sll = leftShiftModule.io.sll 237675acc68SYinan Xu val revSll = leftShiftModule.io.revSll 238675acc68SYinan Xu leftShiftModule.io.sllSrc := Cat(Fill(32, func(0)), Fill(32, 1.U)) & src1 239675acc68SYinan Xu leftShiftModule.io.shamt := shamt 240675acc68SYinan Xu leftShiftModule.io.revShamt := revShamt 241675acc68SYinan Xu 242675acc68SYinan Xu // bclr, bset, binv 243675acc68SYinan Xu val bitShift = 1.U << src2(5, 0) 244675acc68SYinan Xu val bclr = src1 & ~bitShift 245675acc68SYinan Xu val bset = src1 | bitShift 246675acc68SYinan Xu val binv = src1 ^ bitShift 247675acc68SYinan Xu 248675acc68SYinan Xu // srl, sra, bext 249675acc68SYinan Xu val rightShiftModule = Module(new RightShiftModule) 250675acc68SYinan Xu val srl = rightShiftModule.io.srl 251675acc68SYinan Xu val revSrl = rightShiftModule.io.revSrl 252675acc68SYinan Xu val sra = rightShiftModule.io.sra 253675acc68SYinan Xu rightShiftModule.io.shamt := shamt 254675acc68SYinan Xu rightShiftModule.io.revShamt := revShamt 255675acc68SYinan Xu rightShiftModule.io.srlSrc := src1 256675acc68SYinan Xu rightShiftModule.io.sraSrc := src1 257675acc68SYinan Xu val bext = srl(0) 258675acc68SYinan Xu 259675acc68SYinan Xu val rol = revSrl | sll 260675acc68SYinan Xu val ror = srl | revSll 261675acc68SYinan Xu 2624aa9ed34Sfdy // vset 2634aa9ed34Sfdy val vsetModule = Module(new VsetModule) 2644aa9ed34Sfdy vsetModule.io.lsrc0 := io.lsrc0 2654aa9ed34Sfdy vsetModule.io.ldest := io.ldest 2664aa9ed34Sfdy vsetModule.io.src0 := io.src(0) 2674aa9ed34Sfdy vsetModule.io.src1 := io.src(1) 2684aa9ed34Sfdy vsetModule.io.func := io.func 2694aa9ed34Sfdy vsetModule.io.vconfig := io.vconfig 2704aa9ed34Sfdy 271675acc68SYinan Xu // addw 272184a1958Szfw val addModule = Module(new AddModule) 273675acc68SYinan Xu addModule.io.srcw := Mux(!func(2) && func(0), ZeroExt(src1(0), XLEN), src1(31, 0)) 274675acc68SYinan Xu val addwResultAll = VecInit(Seq( 275675acc68SYinan Xu ZeroExt(addModule.io.addw(0), XLEN), 276675acc68SYinan Xu ZeroExt(addModule.io.addw(7, 0), XLEN), 277675acc68SYinan Xu ZeroExt(addModule.io.addw(15, 0), XLEN), 278675acc68SYinan Xu SignExt(addModule.io.addw(15, 0), XLEN) 279675acc68SYinan Xu )) 280675acc68SYinan Xu val addw = Mux(func(2), addwResultAll(func(1, 0)), addModule.io.addw) 281675acc68SYinan Xu 282675acc68SYinan Xu // subw 283675acc68SYinan Xu val subModule = Module(new SubModule) 284675acc68SYinan Xu val subw = subModule.io.sub 285675acc68SYinan Xu 286675acc68SYinan Xu // sllw 287675acc68SYinan Xu val leftShiftWordModule = Module(new LeftShiftWordModule) 288675acc68SYinan Xu val sllw = leftShiftWordModule.io.sllw 289675acc68SYinan Xu val revSllw = leftShiftWordModule.io.revSllw 290675acc68SYinan Xu leftShiftWordModule.io.sllSrc := src1 291675acc68SYinan Xu leftShiftWordModule.io.shamt := shamt 292675acc68SYinan Xu leftShiftWordModule.io.revShamt := revShamt 293675acc68SYinan Xu 294675acc68SYinan Xu val rightShiftWordModule = Module(new RightShiftWordModule) 295675acc68SYinan Xu val srlw = rightShiftWordModule.io.srlw 296675acc68SYinan Xu val revSrlw = rightShiftWordModule.io.revSrlw 297675acc68SYinan Xu val sraw = rightShiftWordModule.io.sraw 298675acc68SYinan Xu rightShiftWordModule.io.shamt := shamt 299675acc68SYinan Xu rightShiftWordModule.io.revShamt := revShamt 300675acc68SYinan Xu rightShiftWordModule.io.srlSrc := src1 301675acc68SYinan Xu rightShiftWordModule.io.sraSrc := src1 302675acc68SYinan Xu 303675acc68SYinan Xu val rolw = revSrlw | sllw 304675acc68SYinan Xu val rorw = srlw | revSllw 305675acc68SYinan Xu 306675acc68SYinan Xu // add 307a792bcf1SYinan Xu val wordMaskAddSource = Cat(Fill(32, func(0)), Fill(32, 1.U)) & src1 308a792bcf1SYinan Xu val shaddSource = VecInit(Seq( 309a792bcf1SYinan Xu Cat(wordMaskAddSource(62, 0), 0.U(1.W)), 310a792bcf1SYinan Xu Cat(wordMaskAddSource(61, 0), 0.U(2.W)), 311a792bcf1SYinan Xu Cat(wordMaskAddSource(60, 0), 0.U(3.W)), 312a792bcf1SYinan Xu Cat(wordMaskAddSource(59, 0), 0.U(4.W)) 313a792bcf1SYinan Xu )) 314a792bcf1SYinan Xu val sraddSource = VecInit(Seq( 315a792bcf1SYinan Xu ZeroExt(src1(63, 29), XLEN), 31688825c5cSYinan Xu ZeroExt(src1(63, 30), XLEN), 31788825c5cSYinan Xu ZeroExt(src1(63, 31), XLEN), 31888825c5cSYinan Xu ZeroExt(src1(63, 32), XLEN) 31988825c5cSYinan Xu )) 320a792bcf1SYinan Xu // TODO: use decoder or other libraries to optimize timing 321a792bcf1SYinan Xu // Now we assume shadd has the worst timing. 322675acc68SYinan Xu addModule.io.src(0) := Mux(func(3), shaddSource(func(2, 1)), 323675acc68SYinan Xu Mux(func(2), sraddSource(func(1, 0)), 324675acc68SYinan Xu Mux(func(1), ZeroExt(src1(0), XLEN), wordMaskAddSource)) 325a792bcf1SYinan Xu ) 326a792bcf1SYinan Xu addModule.io.src(1) := src2 32788825c5cSYinan Xu val add = addModule.io.add 328ee8ff153Szfw 329675acc68SYinan Xu // sub 330184a1958Szfw val sub = subModule.io.sub 3312bd5334dSYinan Xu subModule.io.src(0) := src1 3322bd5334dSYinan Xu subModule.io.src(1) := src2 3337b441e5eSYinan Xu val sltu = !sub(XLEN) 334675acc68SYinan Xu val slt = src1(XLEN - 1) ^ src2(XLEN - 1) ^ sltu 335ee8ff153Szfw val maxMin = Mux(slt ^ func(0), src2, src1) 3367b441e5eSYinan Xu val maxMinU = Mux(sltu ^ func(0), src2, src1) 337675acc68SYinan Xu val compareRes = Mux(func(2), Mux(func(1), maxMin, maxMinU), Mux(func(1), slt, Mux(func(0), sltu, sub))) 338ee8ff153Szfw 339675acc68SYinan Xu // logic 340675acc68SYinan Xu val logicSrc2 = Mux(!func(5) && func(0), ~src2, src2) 341675acc68SYinan Xu val and = src1 & logicSrc2 342675acc68SYinan Xu val or = src1 | logicSrc2 343675acc68SYinan Xu val xor = src1 ^ logicSrc2 34473be64b3SJiawei Lin val orcb = Cat((0 until 8).map(i => Fill(8, src1(i * 8 + 7, i * 8).orR)).reverse) 345675acc68SYinan Xu val orh48 = Cat(src1(63, 8), 0.U(8.W)) | src2 346675acc68SYinan Xu 347675acc68SYinan Xu val sextb = SignExt(src1(7, 0), XLEN) 348675acc68SYinan Xu val packh = Cat(src2(7,0), src1(7,0)) 349675acc68SYinan Xu val sexth = SignExt(src1(15, 0), XLEN) 350675acc68SYinan Xu val packw = SignExt(Cat(src2(15, 0), src1(15, 0)), XLEN) 351675acc68SYinan Xu 35273be64b3SJiawei Lin val revb = Cat((0 until 8).map(i => Reverse(src1(8 * i + 7, 8 * i))).reverse) 353675acc68SYinan Xu val pack = Cat(src2(31, 0), src1(31, 0)) 354675acc68SYinan Xu val rev8 = Cat((0 until 8).map(i => src1(8 * i + 7, 8 * i))) 355675acc68SYinan Xu 356ee8ff153Szfw 357184a1958Szfw // Result Select 358184a1958Szfw val shiftResSel = Module(new ShiftResultSelect) 359675acc68SYinan Xu shiftResSel.io.func := func(3, 0) 360184a1958Szfw shiftResSel.io.sll := sll 361184a1958Szfw shiftResSel.io.srl := srl 362184a1958Szfw shiftResSel.io.sra := sra 36328c18878Szfw shiftResSel.io.rol := rol 36428c18878Szfw shiftResSel.io.ror := ror 365184a1958Szfw shiftResSel.io.bclr := bclr 366184a1958Szfw shiftResSel.io.binv := binv 367184a1958Szfw shiftResSel.io.bset := bset 368184a1958Szfw shiftResSel.io.bext := bext 369184a1958Szfw val shiftRes = shiftResSel.io.shiftRes 37031ea8750SLinJiawei 37131ea8750SLinJiawei val miscResSel = Module(new MiscResultSelect) 372675acc68SYinan Xu miscResSel.io.func := func(5, 0) 373ee8ff153Szfw miscResSel.io.and := and 374ee8ff153Szfw miscResSel.io.or := or 375ee8ff153Szfw miscResSel.io.xor := xor 376675acc68SYinan Xu miscResSel.io.orcb := orcb 37788825c5cSYinan Xu miscResSel.io.orh48 := orh48 378ee8ff153Szfw miscResSel.io.sextb := sextb 379675acc68SYinan Xu miscResSel.io.packh := packh 380ee8ff153Szfw miscResSel.io.sexth := sexth 381675acc68SYinan Xu miscResSel.io.packw := packw 382675acc68SYinan Xu miscResSel.io.revb := revb 383ee8ff153Szfw miscResSel.io.rev8 := rev8 384675acc68SYinan Xu miscResSel.io.pack := pack 38588825c5cSYinan Xu miscResSel.io.src := src1 38631ea8750SLinJiawei val miscRes = miscResSel.io.miscRes 38731ea8750SLinJiawei 388184a1958Szfw val wordResSel = Module(new WordResultSelect) 389184a1958Szfw wordResSel.io.func := func 390184a1958Szfw wordResSel.io.addw := addw 391184a1958Szfw wordResSel.io.subw := subw 392184a1958Szfw wordResSel.io.sllw := sllw 393184a1958Szfw wordResSel.io.srlw := srlw 394184a1958Szfw wordResSel.io.sraw := sraw 39528c18878Szfw wordResSel.io.rolw := rolw 39628c18878Szfw wordResSel.io.rorw := rorw 397184a1958Szfw val wordRes = wordResSel.io.wordRes 398ee8ff153Szfw 39931ea8750SLinJiawei val aluResSel = Module(new AluResSel) 4004aa9ed34Sfdy aluResSel.io.func := func(7, 4) 401184a1958Szfw aluResSel.io.addRes := add 402184a1958Szfw aluResSel.io.compareRes := compareRes 403ee8ff153Szfw aluResSel.io.shiftRes := shiftRes 40431ea8750SLinJiawei aluResSel.io.miscRes := miscRes 405184a1958Szfw aluResSel.io.wordRes := wordRes 4064aa9ed34Sfdy aluResSel.io.vsetRes := vsetModule.io.res 40731ea8750SLinJiawei val aluRes = aluResSel.io.aluRes 408e18c367fSLinJiawei 409e2203130SLinJiawei io.result := aluRes 410e2203130SLinJiawei} 411e2203130SLinJiawei 412adb5df20SYinan Xuclass Alu(implicit p: Parameters) extends FUWithRedirect { 413e2203130SLinJiawei 414675acc68SYinan Xu val uop = io.in.bits.uop 415e2203130SLinJiawei 416e2203130SLinJiawei val dataModule = Module(new AluDataModule) 417*3a6ab23aSczw val bru = Module(new Branch()(p)) 418*3a6ab23aSczw 419*3a6ab23aSczw bru.io.in <> io.in 420*3a6ab23aSczw bru.io.in.bits.uop <> io.in.bits.uop 421*3a6ab23aSczw bru.io.redirectIn <> io.redirectIn 422*3a6ab23aSczw bru.io.out.ready := io.out.ready 423e2203130SLinJiawei 424675acc68SYinan Xu dataModule.io.src := io.in.bits.src.take(2) 425675acc68SYinan Xu dataModule.io.func := io.in.bits.uop.ctrl.fuOpType 4264aa9ed34Sfdy dataModule.io.lsrc0 := uop.ctrl.lsrc(0) 4274aa9ed34Sfdy dataModule.io.ldest := uop.ctrl.ldest 4284aa9ed34Sfdy dataModule.io.vconfig := uop.ctrl.vconfig 429e2203130SLinJiawei 430*3a6ab23aSczw redirectOutValid := bru.redirectOutValid 431*3a6ab23aSczw redirectOut <> bru.redirectOut 432151e3043SLinJiawei 433e18c367fSLinJiawei io.in.ready := io.out.ready 434675acc68SYinan Xu io.out.valid := io.in.valid 435e18c367fSLinJiawei io.out.bits.uop <> io.in.bits.uop 436e2203130SLinJiawei io.out.bits.data := dataModule.io.result 437e18c367fSLinJiawei} 438