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 198891a219SYinan Xuimport org.chipsalliance.cde.config.Parameters 20e18c367fSLinJiaweiimport chisel3._ 21e18c367fSLinJiaweiimport chisel3.util._ 223c02ee8fSwakafaimport utility.{LookupTree, LookupTreeDefault, ParallelMux, SignExt, ZeroExt} 23e18c367fSLinJiaweiimport xiangshan._ 24fe528fd6Ssinsanctionimport utils._ 25e18c367fSLinJiawei 262225d46eSJiawei Linclass AddModule(implicit p: Parameters) extends XSModule { 2731ea8750SLinJiawei val io = IO(new Bundle() { 282bd5334dSYinan Xu val src = Vec(2, Input(UInt(XLEN.W))) 2928c18878Szfw val srcw = Input(UInt((XLEN/2).W)) 3028c18878Szfw val add = Output(UInt(XLEN.W)) 3128c18878Szfw val addw = Output(UInt((XLEN/2).W)) 3231ea8750SLinJiawei }) 3328c18878Szfw io.add := io.src(0) + io.src(1) 3488825c5cSYinan Xu // TODO: why this extra adder? 3528c18878Szfw io.addw := io.srcw + io.src(1)(31,0) 3631ea8750SLinJiawei} 3731ea8750SLinJiawei 382225d46eSJiawei Linclass SubModule(implicit p: Parameters) extends XSModule { 3931ea8750SLinJiawei val io = IO(new Bundle() { 402bd5334dSYinan Xu val src = Vec(2, Input(UInt(XLEN.W))) 41184a1958Szfw val sub = Output(UInt((XLEN+1).W)) 4231ea8750SLinJiawei }) 43935edac4STang Haojin io.sub := (io.src(0) +& (~io.src(1)).asUInt) + 1.U 4431ea8750SLinJiawei} 4531ea8750SLinJiawei 462225d46eSJiawei Linclass LeftShiftModule(implicit p: Parameters) extends XSModule { 4731ea8750SLinJiawei val io = IO(new Bundle() { 4831ea8750SLinJiawei val shamt = Input(UInt(6.W)) 4928c18878Szfw val revShamt = Input(UInt(6.W)) 5031ea8750SLinJiawei val sllSrc = Input(UInt(XLEN.W)) 5131ea8750SLinJiawei val sll = Output(UInt(XLEN.W)) 5228c18878Szfw val revSll = Output(UInt(XLEN.W)) 5331ea8750SLinJiawei }) 54184a1958Szfw io.sll := io.sllSrc << io.shamt 5528c18878Szfw io.revSll := io.sllSrc << io.revShamt 56184a1958Szfw} 57184a1958Szfw 58184a1958Szfwclass LeftShiftWordModule(implicit p: Parameters) extends XSModule { 59184a1958Szfw val io = IO(new Bundle() { 60184a1958Szfw val shamt = Input(UInt(5.W)) 6128c18878Szfw val revShamt = Input(UInt(5.W)) 62184a1958Szfw val sllSrc = Input(UInt((XLEN/2).W)) 63184a1958Szfw val sllw = Output(UInt((XLEN/2).W)) 6428c18878Szfw val revSllw = Output(UInt((XLEN/2).W)) 65184a1958Szfw }) 66184a1958Szfw io.sllw := io.sllSrc << io.shamt 6728c18878Szfw io.revSllw := io.sllSrc << io.revShamt 6831ea8750SLinJiawei} 6931ea8750SLinJiawei 702225d46eSJiawei Linclass RightShiftModule(implicit p: Parameters) extends XSModule { 7131ea8750SLinJiawei val io = IO(new Bundle() { 7231ea8750SLinJiawei val shamt = Input(UInt(6.W)) 7328c18878Szfw val revShamt = Input(UInt(6.W)) 7431ea8750SLinJiawei val srlSrc, sraSrc = Input(UInt(XLEN.W)) 75184a1958Szfw val srl, sra = Output(UInt(XLEN.W)) 7628c18878Szfw val revSrl = Output(UInt(XLEN.W)) 7731ea8750SLinJiawei }) 78184a1958Szfw io.srl := io.srlSrc >> io.shamt 79935edac4STang Haojin io.sra := (io.sraSrc.asSInt >> io.shamt).asUInt 8028c18878Szfw io.revSrl := io.srlSrc >> io.revShamt 8131ea8750SLinJiawei} 8231ea8750SLinJiawei 83184a1958Szfwclass RightShiftWordModule(implicit p: Parameters) extends XSModule { 84ee8ff153Szfw val io = IO(new Bundle() { 85184a1958Szfw val shamt = Input(UInt(5.W)) 8628c18878Szfw val revShamt = Input(UInt(5.W)) 87184a1958Szfw val srlSrc, sraSrc = Input(UInt((XLEN/2).W)) 88184a1958Szfw val srlw, sraw = Output(UInt((XLEN/2).W)) 8928c18878Szfw val revSrlw = Output(UInt((XLEN/2).W)) 90ee8ff153Szfw }) 91184a1958Szfw 92184a1958Szfw io.srlw := io.srlSrc >> io.shamt 93935edac4STang Haojin io.sraw := (io.sraSrc.asSInt >> io.shamt).asUInt 9428c18878Szfw io.revSrlw := io.srlSrc >> io.revShamt 95ee8ff153Szfw} 96ee8ff153Szfw 97184a1958Szfw 982225d46eSJiawei Linclass MiscResultSelect(implicit p: Parameters) extends XSModule { 9931ea8750SLinJiawei val io = IO(new Bundle() { 100675acc68SYinan Xu val func = Input(UInt(6.W)) 101675acc68SYinan Xu val and, or, xor, orcb, orh48, sextb, packh, sexth, packw, revb, rev8, pack = Input(UInt(XLEN.W)) 10288825c5cSYinan Xu val src = Input(UInt(XLEN.W)) 10331ea8750SLinJiawei val miscRes = Output(UInt(XLEN.W)) 10431ea8750SLinJiawei }) 105ee8ff153Szfw 106675acc68SYinan Xu val logicRes = VecInit(Seq( 107675acc68SYinan Xu io.and, 108675acc68SYinan Xu io.or, 109675acc68SYinan Xu io.xor, 110675acc68SYinan Xu io.orcb 111675acc68SYinan Xu ))(io.func(2, 1)) 112675acc68SYinan Xu val miscRes = VecInit(Seq(io.sextb, io.packh, io.sexth, io.packw))(io.func(1, 0)) 113675acc68SYinan Xu val logicBase = Mux(io.func(3), miscRes, logicRes) 11488825c5cSYinan Xu 115675acc68SYinan Xu val revRes = VecInit(Seq(io.revb, io.rev8, io.pack, io.orh48))(io.func(1, 0)) 116675acc68SYinan Xu val customRes = VecInit(Seq( 117675acc68SYinan Xu Cat(0.U(31.W), io.src(31, 0), 0.U(1.W)), 118675acc68SYinan Xu Cat(0.U(30.W), io.src(31, 0), 0.U(2.W)), 119675acc68SYinan Xu Cat(0.U(29.W), io.src(31, 0), 0.U(3.W)), 120675acc68SYinan Xu Cat(0.U(56.W), io.src(15, 8))))(io.func(1, 0)) 121675acc68SYinan Xu val logicAdv = Mux(io.func(3), customRes, revRes) 122ee8ff153Szfw 123675acc68SYinan Xu val mask = Cat(Fill(15, io.func(0)), 1.U(1.W)) 124675acc68SYinan Xu val maskedLogicRes = mask & logicRes 125675acc68SYinan Xu 126675acc68SYinan Xu io.miscRes := Mux(io.func(5), maskedLogicRes, Mux(io.func(4), logicAdv, logicBase)) 12731ea8750SLinJiawei} 12831ea8750SLinJiawei 129*545d7be0SYangyu Chenclass ConditionalZeroModule(implicit p: Parameters) extends XSModule { 130*545d7be0SYangyu Chen val io = IO(new Bundle() { 131*545d7be0SYangyu Chen val condition = Input(UInt(XLEN.W)) 132*545d7be0SYangyu Chen val value = Input(UInt(XLEN.W)) 133*545d7be0SYangyu Chen val isNez = Input(Bool()) 134*545d7be0SYangyu Chen val condRes = Output(UInt(XLEN.W)) 135*545d7be0SYangyu Chen }) 136*545d7be0SYangyu Chen 137*545d7be0SYangyu Chen val condition_zero = io.condition === 0.U 138*545d7be0SYangyu Chen val use_zero = !io.isNez && condition_zero || 139*545d7be0SYangyu Chen io.isNez && !condition_zero 140*545d7be0SYangyu Chen 141*545d7be0SYangyu Chen io.condRes := Mux(use_zero, 0.U, io.value) 142*545d7be0SYangyu Chen} 143*545d7be0SYangyu Chen 144ee8ff153Szfwclass ShiftResultSelect(implicit p: Parameters) extends XSModule { 145ee8ff153Szfw val io = IO(new Bundle() { 146675acc68SYinan Xu val func = Input(UInt(4.W)) 14728c18878Szfw val sll, srl, sra, rol, ror, bclr, bset, binv, bext = Input(UInt(XLEN.W)) 148ee8ff153Szfw val shiftRes = Output(UInt(XLEN.W)) 149ee8ff153Szfw }) 150ee8ff153Szfw 151675acc68SYinan Xu // val leftBit = Mux(io.func(1), io.binv, Mux(io.func(0), io.bset, io.bclr)) 152675acc68SYinan Xu // val leftRes = Mux(io.func(2), leftBit, io.sll) 153675acc68SYinan Xu // val rightRes = Mux(io.func(1) && io.func(0), io.sra, Mux(io.func(1), io.bext, io.srl)) 154675acc68SYinan Xu val resultSource = VecInit(Seq( 155675acc68SYinan Xu io.sll, 156675acc68SYinan Xu io.sll, 157675acc68SYinan Xu io.bclr, 158675acc68SYinan Xu io.bset, 159675acc68SYinan Xu io.binv, 160675acc68SYinan Xu io.srl, 161675acc68SYinan Xu io.bext, 162675acc68SYinan Xu io.sra 163675acc68SYinan Xu )) 164675acc68SYinan Xu val simple = resultSource(io.func(2, 0)) 165ee8ff153Szfw 1667b441e5eSYinan Xu io.shiftRes := Mux(io.func(3), Mux(io.func(1), io.ror, io.rol), simple) 167184a1958Szfw} 168ee8ff153Szfw 169184a1958Szfwclass WordResultSelect(implicit p: Parameters) extends XSModule { 170184a1958Szfw val io = IO(new Bundle() { 171184a1958Szfw val func = Input(UInt()) 17228c18878Szfw val sllw, srlw, sraw, rolw, rorw, addw, subw = Input(UInt((XLEN/2).W)) 173184a1958Szfw val wordRes = Output(UInt(XLEN.W)) 174184a1958Szfw }) 175ee8ff153Szfw 17654711376Ssinsanction val addsubRes = Mux(!io.func(2) && io.func(1) && !io.func(0), io.subw, io.addw) 177675acc68SYinan Xu val shiftRes = Mux(io.func(2), Mux(io.func(0), io.rorw, io.rolw), 178675acc68SYinan Xu Mux(io.func(1), io.sraw, Mux(io.func(0), io.srlw, io.sllw))) 179675acc68SYinan Xu val wordRes = Mux(io.func(3), shiftRes, addsubRes) 180184a1958Szfw io.wordRes := SignExt(wordRes, XLEN) 181ee8ff153Szfw} 182ee8ff153Szfw 183ee8ff153Szfw 1842225d46eSJiawei Linclass AluResSel(implicit p: Parameters) extends XSModule { 18531ea8750SLinJiawei val io = IO(new Bundle() { 186edace9bfSxiwenx val func = Input(UInt(3.W)) 187*545d7be0SYangyu Chen val addRes, shiftRes, miscRes, compareRes, wordRes, condRes = Input(UInt(XLEN.W)) 18831ea8750SLinJiawei val aluRes = Output(UInt(XLEN.W)) 18931ea8750SLinJiawei }) 190ee8ff153Szfw 191edace9bfSxiwenx val res = Mux(io.func(2, 1) === 0.U, Mux(io.func(0), io.wordRes, io.shiftRes), 192*545d7be0SYangyu Chen Mux(!io.func(2), Mux(io.func(0), io.compareRes, io.addRes), 193*545d7be0SYangyu Chen Mux(io.func(1, 0) === 3.U, io.condRes, io.miscRes))) 194184a1958Szfw io.aluRes := res 19531ea8750SLinJiawei} 19631ea8750SLinJiawei 1972225d46eSJiawei Linclass AluDataModule(implicit p: Parameters) extends XSModule { 198e2203130SLinJiawei val io = IO(new Bundle() { 1992bd5334dSYinan Xu val src = Vec(2, Input(UInt(XLEN.W))) 200e2203130SLinJiawei val func = Input(FuOpType()) 201e2203130SLinJiawei val result = Output(UInt(XLEN.W)) 202e2203130SLinJiawei }) 2032bd5334dSYinan Xu val (src1, src2, func) = (io.src(0), io.src(1), io.func) 204e18c367fSLinJiawei 205675acc68SYinan Xu val shamt = src2(5, 0) 206675acc68SYinan Xu val revShamt = ~src2(5,0) + 1.U 207675acc68SYinan Xu 208675acc68SYinan Xu // slliuw, sll 209675acc68SYinan Xu val leftShiftModule = Module(new LeftShiftModule) 210675acc68SYinan Xu val sll = leftShiftModule.io.sll 211675acc68SYinan Xu val revSll = leftShiftModule.io.revSll 212675acc68SYinan Xu leftShiftModule.io.sllSrc := Cat(Fill(32, func(0)), Fill(32, 1.U)) & src1 213675acc68SYinan Xu leftShiftModule.io.shamt := shamt 214675acc68SYinan Xu leftShiftModule.io.revShamt := revShamt 215675acc68SYinan Xu 216675acc68SYinan Xu // bclr, bset, binv 217675acc68SYinan Xu val bitShift = 1.U << src2(5, 0) 218675acc68SYinan Xu val bclr = src1 & ~bitShift 219675acc68SYinan Xu val bset = src1 | bitShift 220675acc68SYinan Xu val binv = src1 ^ bitShift 221675acc68SYinan Xu 222675acc68SYinan Xu // srl, sra, bext 223675acc68SYinan Xu val rightShiftModule = Module(new RightShiftModule) 224675acc68SYinan Xu val srl = rightShiftModule.io.srl 225675acc68SYinan Xu val revSrl = rightShiftModule.io.revSrl 226675acc68SYinan Xu val sra = rightShiftModule.io.sra 227675acc68SYinan Xu rightShiftModule.io.shamt := shamt 228675acc68SYinan Xu rightShiftModule.io.revShamt := revShamt 229675acc68SYinan Xu rightShiftModule.io.srlSrc := src1 230675acc68SYinan Xu rightShiftModule.io.sraSrc := src1 231675acc68SYinan Xu val bext = srl(0) 232675acc68SYinan Xu 233675acc68SYinan Xu val rol = revSrl | sll 234675acc68SYinan Xu val ror = srl | revSll 235675acc68SYinan Xu 236675acc68SYinan Xu // addw 237184a1958Szfw val addModule = Module(new AddModule) 23854711376Ssinsanction addModule.io.srcw := Mux(!func(2) && func(0), Mux(func(1), SignExt(src2(11, 0), XLEN), ZeroExt(src1(0), XLEN)), src1(31, 0)) 239675acc68SYinan Xu val addwResultAll = VecInit(Seq( 240675acc68SYinan Xu ZeroExt(addModule.io.addw(0), XLEN), 241675acc68SYinan Xu ZeroExt(addModule.io.addw(7, 0), XLEN), 242675acc68SYinan Xu ZeroExt(addModule.io.addw(15, 0), XLEN), 243675acc68SYinan Xu SignExt(addModule.io.addw(15, 0), XLEN) 244675acc68SYinan Xu )) 245675acc68SYinan Xu val addw = Mux(func(2), addwResultAll(func(1, 0)), addModule.io.addw) 246675acc68SYinan Xu 247675acc68SYinan Xu // subw 248675acc68SYinan Xu val subModule = Module(new SubModule) 249675acc68SYinan Xu val subw = subModule.io.sub 250675acc68SYinan Xu 251675acc68SYinan Xu // sllw 252675acc68SYinan Xu val leftShiftWordModule = Module(new LeftShiftWordModule) 253675acc68SYinan Xu val sllw = leftShiftWordModule.io.sllw 254675acc68SYinan Xu val revSllw = leftShiftWordModule.io.revSllw 255675acc68SYinan Xu leftShiftWordModule.io.sllSrc := src1 256675acc68SYinan Xu leftShiftWordModule.io.shamt := shamt 257675acc68SYinan Xu leftShiftWordModule.io.revShamt := revShamt 258675acc68SYinan Xu 259675acc68SYinan Xu val rightShiftWordModule = Module(new RightShiftWordModule) 260675acc68SYinan Xu val srlw = rightShiftWordModule.io.srlw 261675acc68SYinan Xu val revSrlw = rightShiftWordModule.io.revSrlw 262675acc68SYinan Xu val sraw = rightShiftWordModule.io.sraw 263675acc68SYinan Xu rightShiftWordModule.io.shamt := shamt 264675acc68SYinan Xu rightShiftWordModule.io.revShamt := revShamt 265675acc68SYinan Xu rightShiftWordModule.io.srlSrc := src1 266675acc68SYinan Xu rightShiftWordModule.io.sraSrc := src1 267675acc68SYinan Xu 268675acc68SYinan Xu val rolw = revSrlw | sllw 269675acc68SYinan Xu val rorw = srlw | revSllw 270675acc68SYinan Xu 271675acc68SYinan Xu // add 272a792bcf1SYinan Xu val wordMaskAddSource = Cat(Fill(32, func(0)), Fill(32, 1.U)) & src1 273a792bcf1SYinan Xu val shaddSource = VecInit(Seq( 274a792bcf1SYinan Xu Cat(wordMaskAddSource(62, 0), 0.U(1.W)), 275a792bcf1SYinan Xu Cat(wordMaskAddSource(61, 0), 0.U(2.W)), 276a792bcf1SYinan Xu Cat(wordMaskAddSource(60, 0), 0.U(3.W)), 277a792bcf1SYinan Xu Cat(wordMaskAddSource(59, 0), 0.U(4.W)) 278a792bcf1SYinan Xu )) 279a792bcf1SYinan Xu val sraddSource = VecInit(Seq( 280a792bcf1SYinan Xu ZeroExt(src1(63, 29), XLEN), 28188825c5cSYinan Xu ZeroExt(src1(63, 30), XLEN), 28288825c5cSYinan Xu ZeroExt(src1(63, 31), XLEN), 28388825c5cSYinan Xu ZeroExt(src1(63, 32), XLEN) 28488825c5cSYinan Xu )) 285a792bcf1SYinan Xu // TODO: use decoder or other libraries to optimize timing 286a792bcf1SYinan Xu // Now we assume shadd has the worst timing. 287675acc68SYinan Xu addModule.io.src(0) := Mux(func(3), shaddSource(func(2, 1)), 288675acc68SYinan Xu Mux(func(2), sraddSource(func(1, 0)), 289fe528fd6Ssinsanction Mux(func(1), Mux(func(0), SignExt(src2(11, 0), XLEN), ZeroExt(src1(0), XLEN)), wordMaskAddSource)) 290a792bcf1SYinan Xu ) 291fe528fd6Ssinsanction addModule.io.src(1) := Mux(func(3, 0) === "b0011".U, Cat(src2(63, 12), 0.U(12.W)), src2) 29288825c5cSYinan Xu val add = addModule.io.add 293ee8ff153Szfw 294675acc68SYinan Xu // sub 295184a1958Szfw val sub = subModule.io.sub 2962bd5334dSYinan Xu subModule.io.src(0) := src1 2972bd5334dSYinan Xu subModule.io.src(1) := src2 2987b441e5eSYinan Xu val sltu = !sub(XLEN) 299675acc68SYinan Xu val slt = src1(XLEN - 1) ^ src2(XLEN - 1) ^ sltu 300ee8ff153Szfw val maxMin = Mux(slt ^ func(0), src2, src1) 3017b441e5eSYinan Xu val maxMinU = Mux(sltu ^ func(0), src2, src1) 302675acc68SYinan Xu val compareRes = Mux(func(2), Mux(func(1), maxMin, maxMinU), Mux(func(1), slt, Mux(func(0), sltu, sub))) 303ee8ff153Szfw 304675acc68SYinan Xu // logic 305675acc68SYinan Xu val logicSrc2 = Mux(!func(5) && func(0), ~src2, src2) 306675acc68SYinan Xu val and = src1 & logicSrc2 307675acc68SYinan Xu val or = src1 | logicSrc2 308675acc68SYinan Xu val xor = src1 ^ logicSrc2 30973be64b3SJiawei Lin val orcb = Cat((0 until 8).map(i => Fill(8, src1(i * 8 + 7, i * 8).orR)).reverse) 310675acc68SYinan Xu val orh48 = Cat(src1(63, 8), 0.U(8.W)) | src2 311675acc68SYinan Xu 312675acc68SYinan Xu val sextb = SignExt(src1(7, 0), XLEN) 313675acc68SYinan Xu val packh = Cat(src2(7,0), src1(7,0)) 314675acc68SYinan Xu val sexth = SignExt(src1(15, 0), XLEN) 315675acc68SYinan Xu val packw = SignExt(Cat(src2(15, 0), src1(15, 0)), XLEN) 316675acc68SYinan Xu 31773be64b3SJiawei Lin val revb = Cat((0 until 8).map(i => Reverse(src1(8 * i + 7, 8 * i))).reverse) 318675acc68SYinan Xu val pack = Cat(src2(31, 0), src1(31, 0)) 319675acc68SYinan Xu val rev8 = Cat((0 until 8).map(i => src1(8 * i + 7, 8 * i))) 320675acc68SYinan Xu 321ee8ff153Szfw 322184a1958Szfw // Result Select 323184a1958Szfw val shiftResSel = Module(new ShiftResultSelect) 324675acc68SYinan Xu shiftResSel.io.func := func(3, 0) 325184a1958Szfw shiftResSel.io.sll := sll 326184a1958Szfw shiftResSel.io.srl := srl 327184a1958Szfw shiftResSel.io.sra := sra 32828c18878Szfw shiftResSel.io.rol := rol 32928c18878Szfw shiftResSel.io.ror := ror 330184a1958Szfw shiftResSel.io.bclr := bclr 331184a1958Szfw shiftResSel.io.binv := binv 332184a1958Szfw shiftResSel.io.bset := bset 333184a1958Szfw shiftResSel.io.bext := bext 334184a1958Szfw val shiftRes = shiftResSel.io.shiftRes 33531ea8750SLinJiawei 33631ea8750SLinJiawei val miscResSel = Module(new MiscResultSelect) 337675acc68SYinan Xu miscResSel.io.func := func(5, 0) 338ee8ff153Szfw miscResSel.io.and := and 339ee8ff153Szfw miscResSel.io.or := or 340ee8ff153Szfw miscResSel.io.xor := xor 341675acc68SYinan Xu miscResSel.io.orcb := orcb 34288825c5cSYinan Xu miscResSel.io.orh48 := orh48 343ee8ff153Szfw miscResSel.io.sextb := sextb 344675acc68SYinan Xu miscResSel.io.packh := packh 345ee8ff153Szfw miscResSel.io.sexth := sexth 346675acc68SYinan Xu miscResSel.io.packw := packw 347675acc68SYinan Xu miscResSel.io.revb := revb 348ee8ff153Szfw miscResSel.io.rev8 := rev8 349675acc68SYinan Xu miscResSel.io.pack := pack 35088825c5cSYinan Xu miscResSel.io.src := src1 35131ea8750SLinJiawei val miscRes = miscResSel.io.miscRes 35231ea8750SLinJiawei 353*545d7be0SYangyu Chen val condModule = Module(new ConditionalZeroModule) 354*545d7be0SYangyu Chen condModule.io.value := src1 355*545d7be0SYangyu Chen condModule.io.condition := src2 356*545d7be0SYangyu Chen condModule.io.isNez := func(1) 357*545d7be0SYangyu Chen val condRes = condModule.io.condRes 358*545d7be0SYangyu Chen 359*545d7be0SYangyu Chen 360184a1958Szfw val wordResSel = Module(new WordResultSelect) 361184a1958Szfw wordResSel.io.func := func 362184a1958Szfw wordResSel.io.addw := addw 363184a1958Szfw wordResSel.io.subw := subw 364184a1958Szfw wordResSel.io.sllw := sllw 365184a1958Szfw wordResSel.io.srlw := srlw 366184a1958Szfw wordResSel.io.sraw := sraw 36728c18878Szfw wordResSel.io.rolw := rolw 36828c18878Szfw wordResSel.io.rorw := rorw 369184a1958Szfw val wordRes = wordResSel.io.wordRes 370ee8ff153Szfw 37131ea8750SLinJiawei val aluResSel = Module(new AluResSel) 372edace9bfSxiwenx aluResSel.io.func := func(6, 4) 373184a1958Szfw aluResSel.io.addRes := add 374184a1958Szfw aluResSel.io.compareRes := compareRes 375ee8ff153Szfw aluResSel.io.shiftRes := shiftRes 37631ea8750SLinJiawei aluResSel.io.miscRes := miscRes 377184a1958Szfw aluResSel.io.wordRes := wordRes 378*545d7be0SYangyu Chen aluResSel.io.condRes := condRes 37931ea8750SLinJiawei val aluRes = aluResSel.io.aluRes 380e18c367fSLinJiawei 381e2203130SLinJiawei io.result := aluRes 382fe528fd6Ssinsanction 383fe528fd6Ssinsanction XSDebug(func === ALUOpType.lui32add, p"[alu] func lui32: src1=${Hexadecimal(src1)} src2=${Hexadecimal(src2)} alures=${Hexadecimal(aluRes)}\n") 384fe528fd6Ssinsanction XSDebug(func === ALUOpType.lui32add, p"[alu] func lui32: add_src1=${Hexadecimal(addModule.io.src(0))} add_src2=${Hexadecimal(addModule.io.src(1))} addres=${Hexadecimal(add)}\n") 38554711376Ssinsanction 38654711376Ssinsanction XSDebug(func === ALUOpType.lui32addw, p"[alu] func lui32w: src1=${Hexadecimal(src1)} src2=${Hexadecimal(src2)} alures=${Hexadecimal(aluRes)}\n") 38754711376Ssinsanction XSDebug(func === ALUOpType.lui32addw, p"[alu] func lui32w: add_src1=${Hexadecimal(addModule.io.srcw)} add_src2=${Hexadecimal(addModule.io.src(1)(31,0))} addres=${Hexadecimal(addw)}\n") 388e2203130SLinJiawei} 389