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._ 22*bb2f3f51STang Haojinimport utility.{LookupTree, LookupTreeDefault, ParallelMux, SignExt, XSDebug, 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 }) 42935edac4STang Haojin 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 78935edac4STang Haojin 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 92935edac4STang Haojin 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 128545d7be0SYangyu Chenclass ConditionalZeroModule(implicit p: Parameters) extends XSModule { 129545d7be0SYangyu Chen val io = IO(new Bundle() { 130545d7be0SYangyu Chen val condition = Input(UInt(XLEN.W)) 131545d7be0SYangyu Chen val value = Input(UInt(XLEN.W)) 132545d7be0SYangyu Chen val isNez = Input(Bool()) 133545d7be0SYangyu Chen val condRes = Output(UInt(XLEN.W)) 134545d7be0SYangyu Chen }) 135545d7be0SYangyu Chen 136545d7be0SYangyu Chen val condition_zero = io.condition === 0.U 137545d7be0SYangyu Chen val use_zero = !io.isNez && condition_zero || 138545d7be0SYangyu Chen io.isNez && !condition_zero 139545d7be0SYangyu Chen 140545d7be0SYangyu Chen io.condRes := Mux(use_zero, 0.U, io.value) 141545d7be0SYangyu Chen} 142545d7be0SYangyu Chen 143ee8ff153Szfwclass ShiftResultSelect(implicit p: Parameters) extends XSModule { 144ee8ff153Szfw val io = IO(new Bundle() { 145675acc68SYinan Xu val func = Input(UInt(4.W)) 14628c18878Szfw val sll, srl, sra, rol, ror, bclr, bset, binv, bext = Input(UInt(XLEN.W)) 147ee8ff153Szfw val shiftRes = Output(UInt(XLEN.W)) 148ee8ff153Szfw }) 149ee8ff153Szfw 150675acc68SYinan Xu // val leftBit = Mux(io.func(1), io.binv, Mux(io.func(0), io.bset, io.bclr)) 151675acc68SYinan Xu // val leftRes = Mux(io.func(2), leftBit, io.sll) 152675acc68SYinan Xu // val rightRes = Mux(io.func(1) && io.func(0), io.sra, Mux(io.func(1), io.bext, io.srl)) 153675acc68SYinan Xu val resultSource = VecInit(Seq( 154675acc68SYinan Xu io.sll, 155675acc68SYinan Xu io.sll, 156675acc68SYinan Xu io.bclr, 157675acc68SYinan Xu io.bset, 158675acc68SYinan Xu io.binv, 159675acc68SYinan Xu io.srl, 160675acc68SYinan Xu io.bext, 161675acc68SYinan Xu io.sra 162675acc68SYinan Xu )) 163675acc68SYinan Xu val simple = resultSource(io.func(2, 0)) 164ee8ff153Szfw 1657b441e5eSYinan Xu io.shiftRes := Mux(io.func(3), Mux(io.func(1), io.ror, io.rol), simple) 166184a1958Szfw} 167ee8ff153Szfw 168184a1958Szfwclass WordResultSelect(implicit p: Parameters) extends XSModule { 169184a1958Szfw val io = IO(new Bundle() { 170184a1958Szfw val func = Input(UInt()) 17128c18878Szfw val sllw, srlw, sraw, rolw, rorw, addw, subw = Input(UInt((XLEN/2).W)) 172184a1958Szfw val wordRes = Output(UInt(XLEN.W)) 173184a1958Szfw }) 174ee8ff153Szfw 17554711376Ssinsanction val addsubRes = Mux(!io.func(2) && io.func(1) && !io.func(0), io.subw, io.addw) 176675acc68SYinan Xu val shiftRes = Mux(io.func(2), Mux(io.func(0), io.rorw, io.rolw), 177675acc68SYinan Xu Mux(io.func(1), io.sraw, Mux(io.func(0), io.srlw, io.sllw))) 178675acc68SYinan Xu val wordRes = Mux(io.func(3), shiftRes, addsubRes) 179184a1958Szfw io.wordRes := SignExt(wordRes, XLEN) 180ee8ff153Szfw} 181ee8ff153Szfw 182ee8ff153Szfw 1832225d46eSJiawei Linclass AluResSel(implicit p: Parameters) extends XSModule { 18431ea8750SLinJiawei val io = IO(new Bundle() { 185edace9bfSxiwenx val func = Input(UInt(3.W)) 186545d7be0SYangyu Chen val addRes, shiftRes, miscRes, compareRes, wordRes, condRes = Input(UInt(XLEN.W)) 18731ea8750SLinJiawei val aluRes = Output(UInt(XLEN.W)) 18831ea8750SLinJiawei }) 189ee8ff153Szfw 190edace9bfSxiwenx val res = Mux(io.func(2, 1) === 0.U, Mux(io.func(0), io.wordRes, io.shiftRes), 191545d7be0SYangyu Chen Mux(!io.func(2), Mux(io.func(0), io.compareRes, io.addRes), 192545d7be0SYangyu Chen Mux(io.func(1, 0) === 3.U, io.condRes, io.miscRes))) 193184a1958Szfw io.aluRes := res 19431ea8750SLinJiawei} 19531ea8750SLinJiawei 1962225d46eSJiawei Linclass AluDataModule(implicit p: Parameters) extends XSModule { 197e2203130SLinJiawei val io = IO(new Bundle() { 1982bd5334dSYinan Xu val src = Vec(2, Input(UInt(XLEN.W))) 199e2203130SLinJiawei val func = Input(FuOpType()) 200e2203130SLinJiawei val result = Output(UInt(XLEN.W)) 201e2203130SLinJiawei }) 2022bd5334dSYinan Xu val (src1, src2, func) = (io.src(0), io.src(1), io.func) 203e18c367fSLinJiawei 204675acc68SYinan Xu val shamt = src2(5, 0) 205675acc68SYinan Xu val revShamt = ~src2(5,0) + 1.U 206675acc68SYinan Xu 207675acc68SYinan Xu // slliuw, sll 208675acc68SYinan Xu val leftShiftModule = Module(new LeftShiftModule) 209675acc68SYinan Xu val sll = leftShiftModule.io.sll 210675acc68SYinan Xu val revSll = leftShiftModule.io.revSll 211675acc68SYinan Xu leftShiftModule.io.sllSrc := Cat(Fill(32, func(0)), Fill(32, 1.U)) & src1 212675acc68SYinan Xu leftShiftModule.io.shamt := shamt 213675acc68SYinan Xu leftShiftModule.io.revShamt := revShamt 214675acc68SYinan Xu 215675acc68SYinan Xu // bclr, bset, binv 216675acc68SYinan Xu val bitShift = 1.U << src2(5, 0) 217675acc68SYinan Xu val bclr = src1 & ~bitShift 218675acc68SYinan Xu val bset = src1 | bitShift 219675acc68SYinan Xu val binv = src1 ^ bitShift 220675acc68SYinan Xu 221675acc68SYinan Xu // srl, sra, bext 222675acc68SYinan Xu val rightShiftModule = Module(new RightShiftModule) 223675acc68SYinan Xu val srl = rightShiftModule.io.srl 224675acc68SYinan Xu val revSrl = rightShiftModule.io.revSrl 225675acc68SYinan Xu val sra = rightShiftModule.io.sra 226675acc68SYinan Xu rightShiftModule.io.shamt := shamt 227675acc68SYinan Xu rightShiftModule.io.revShamt := revShamt 228675acc68SYinan Xu rightShiftModule.io.srlSrc := src1 229675acc68SYinan Xu rightShiftModule.io.sraSrc := src1 230675acc68SYinan Xu val bext = srl(0) 231675acc68SYinan Xu 232675acc68SYinan Xu val rol = revSrl | sll 233675acc68SYinan Xu val ror = srl | revSll 234675acc68SYinan Xu 235675acc68SYinan Xu // addw 236184a1958Szfw val addModule = Module(new AddModule) 23754711376Ssinsanction addModule.io.srcw := Mux(!func(2) && func(0), Mux(func(1), SignExt(src2(11, 0), XLEN), ZeroExt(src1(0), XLEN)), src1(31, 0)) 238675acc68SYinan Xu val addwResultAll = VecInit(Seq( 239675acc68SYinan Xu ZeroExt(addModule.io.addw(0), XLEN), 240675acc68SYinan Xu ZeroExt(addModule.io.addw(7, 0), XLEN), 241675acc68SYinan Xu ZeroExt(addModule.io.addw(15, 0), XLEN), 242675acc68SYinan Xu SignExt(addModule.io.addw(15, 0), XLEN) 243675acc68SYinan Xu )) 244675acc68SYinan Xu val addw = Mux(func(2), addwResultAll(func(1, 0)), addModule.io.addw) 245675acc68SYinan Xu 246675acc68SYinan Xu // subw 247675acc68SYinan Xu val subModule = Module(new SubModule) 248675acc68SYinan Xu val subw = subModule.io.sub 249675acc68SYinan Xu 250675acc68SYinan Xu // sllw 251675acc68SYinan Xu val leftShiftWordModule = Module(new LeftShiftWordModule) 252675acc68SYinan Xu val sllw = leftShiftWordModule.io.sllw 253675acc68SYinan Xu val revSllw = leftShiftWordModule.io.revSllw 254675acc68SYinan Xu leftShiftWordModule.io.sllSrc := src1 255675acc68SYinan Xu leftShiftWordModule.io.shamt := shamt 256675acc68SYinan Xu leftShiftWordModule.io.revShamt := revShamt 257675acc68SYinan Xu 258675acc68SYinan Xu val rightShiftWordModule = Module(new RightShiftWordModule) 259675acc68SYinan Xu val srlw = rightShiftWordModule.io.srlw 260675acc68SYinan Xu val revSrlw = rightShiftWordModule.io.revSrlw 261675acc68SYinan Xu val sraw = rightShiftWordModule.io.sraw 262675acc68SYinan Xu rightShiftWordModule.io.shamt := shamt 263675acc68SYinan Xu rightShiftWordModule.io.revShamt := revShamt 264675acc68SYinan Xu rightShiftWordModule.io.srlSrc := src1 265675acc68SYinan Xu rightShiftWordModule.io.sraSrc := src1 266675acc68SYinan Xu 267675acc68SYinan Xu val rolw = revSrlw | sllw 268675acc68SYinan Xu val rorw = srlw | revSllw 269675acc68SYinan Xu 270675acc68SYinan Xu // add 271a792bcf1SYinan Xu val wordMaskAddSource = Cat(Fill(32, func(0)), Fill(32, 1.U)) & src1 272a792bcf1SYinan Xu val shaddSource = VecInit(Seq( 273a792bcf1SYinan Xu Cat(wordMaskAddSource(62, 0), 0.U(1.W)), 274a792bcf1SYinan Xu Cat(wordMaskAddSource(61, 0), 0.U(2.W)), 275a792bcf1SYinan Xu Cat(wordMaskAddSource(60, 0), 0.U(3.W)), 276a792bcf1SYinan Xu Cat(wordMaskAddSource(59, 0), 0.U(4.W)) 277a792bcf1SYinan Xu )) 278a792bcf1SYinan Xu val sraddSource = VecInit(Seq( 279a792bcf1SYinan Xu ZeroExt(src1(63, 29), XLEN), 28088825c5cSYinan Xu ZeroExt(src1(63, 30), XLEN), 28188825c5cSYinan Xu ZeroExt(src1(63, 31), XLEN), 28288825c5cSYinan Xu ZeroExt(src1(63, 32), XLEN) 28388825c5cSYinan Xu )) 284a792bcf1SYinan Xu // TODO: use decoder or other libraries to optimize timing 285a792bcf1SYinan Xu // Now we assume shadd has the worst timing. 286675acc68SYinan Xu addModule.io.src(0) := Mux(func(3), shaddSource(func(2, 1)), 287675acc68SYinan Xu Mux(func(2), sraddSource(func(1, 0)), 288fe528fd6Ssinsanction Mux(func(1), Mux(func(0), SignExt(src2(11, 0), XLEN), ZeroExt(src1(0), XLEN)), wordMaskAddSource)) 289a792bcf1SYinan Xu ) 290fe528fd6Ssinsanction addModule.io.src(1) := Mux(func(3, 0) === "b0011".U, Cat(src2(63, 12), 0.U(12.W)), src2) 29188825c5cSYinan Xu val add = addModule.io.add 292ee8ff153Szfw 293675acc68SYinan Xu // sub 294184a1958Szfw val sub = subModule.io.sub 2952bd5334dSYinan Xu subModule.io.src(0) := src1 2962bd5334dSYinan Xu subModule.io.src(1) := src2 2977b441e5eSYinan Xu val sltu = !sub(XLEN) 298675acc68SYinan Xu val slt = src1(XLEN - 1) ^ src2(XLEN - 1) ^ sltu 299ee8ff153Szfw val maxMin = Mux(slt ^ func(0), src2, src1) 3007b441e5eSYinan Xu val maxMinU = Mux(sltu ^ func(0), src2, src1) 301675acc68SYinan Xu val compareRes = Mux(func(2), Mux(func(1), maxMin, maxMinU), Mux(func(1), slt, Mux(func(0), sltu, sub))) 302ee8ff153Szfw 303675acc68SYinan Xu // logic 304675acc68SYinan Xu val logicSrc2 = Mux(!func(5) && func(0), ~src2, src2) 305675acc68SYinan Xu val and = src1 & logicSrc2 306675acc68SYinan Xu val or = src1 | logicSrc2 307675acc68SYinan Xu val xor = src1 ^ logicSrc2 30873be64b3SJiawei Lin val orcb = Cat((0 until 8).map(i => Fill(8, src1(i * 8 + 7, i * 8).orR)).reverse) 309675acc68SYinan Xu val orh48 = Cat(src1(63, 8), 0.U(8.W)) | src2 310675acc68SYinan Xu 311675acc68SYinan Xu val sextb = SignExt(src1(7, 0), XLEN) 312675acc68SYinan Xu val packh = Cat(src2(7,0), src1(7,0)) 313675acc68SYinan Xu val sexth = SignExt(src1(15, 0), XLEN) 314675acc68SYinan Xu val packw = SignExt(Cat(src2(15, 0), src1(15, 0)), XLEN) 315675acc68SYinan Xu 31673be64b3SJiawei Lin val revb = Cat((0 until 8).map(i => Reverse(src1(8 * i + 7, 8 * i))).reverse) 317675acc68SYinan Xu val pack = Cat(src2(31, 0), src1(31, 0)) 318675acc68SYinan Xu val rev8 = Cat((0 until 8).map(i => src1(8 * i + 7, 8 * i))) 319675acc68SYinan Xu 320ee8ff153Szfw 321184a1958Szfw // Result Select 322184a1958Szfw val shiftResSel = Module(new ShiftResultSelect) 323675acc68SYinan Xu shiftResSel.io.func := func(3, 0) 324184a1958Szfw shiftResSel.io.sll := sll 325184a1958Szfw shiftResSel.io.srl := srl 326184a1958Szfw shiftResSel.io.sra := sra 32728c18878Szfw shiftResSel.io.rol := rol 32828c18878Szfw shiftResSel.io.ror := ror 329184a1958Szfw shiftResSel.io.bclr := bclr 330184a1958Szfw shiftResSel.io.binv := binv 331184a1958Szfw shiftResSel.io.bset := bset 332184a1958Szfw shiftResSel.io.bext := bext 333184a1958Szfw val shiftRes = shiftResSel.io.shiftRes 33431ea8750SLinJiawei 33531ea8750SLinJiawei val miscResSel = Module(new MiscResultSelect) 336675acc68SYinan Xu miscResSel.io.func := func(5, 0) 337ee8ff153Szfw miscResSel.io.and := and 338ee8ff153Szfw miscResSel.io.or := or 339ee8ff153Szfw miscResSel.io.xor := xor 340675acc68SYinan Xu miscResSel.io.orcb := orcb 34188825c5cSYinan Xu miscResSel.io.orh48 := orh48 342ee8ff153Szfw miscResSel.io.sextb := sextb 343675acc68SYinan Xu miscResSel.io.packh := packh 344ee8ff153Szfw miscResSel.io.sexth := sexth 345675acc68SYinan Xu miscResSel.io.packw := packw 346675acc68SYinan Xu miscResSel.io.revb := revb 347ee8ff153Szfw miscResSel.io.rev8 := rev8 348675acc68SYinan Xu miscResSel.io.pack := pack 34988825c5cSYinan Xu miscResSel.io.src := src1 35031ea8750SLinJiawei val miscRes = miscResSel.io.miscRes 35131ea8750SLinJiawei 352545d7be0SYangyu Chen val condModule = Module(new ConditionalZeroModule) 353545d7be0SYangyu Chen condModule.io.value := src1 354545d7be0SYangyu Chen condModule.io.condition := src2 355545d7be0SYangyu Chen condModule.io.isNez := func(1) 356545d7be0SYangyu Chen val condRes = condModule.io.condRes 357545d7be0SYangyu Chen 358545d7be0SYangyu Chen 359184a1958Szfw val wordResSel = Module(new WordResultSelect) 360184a1958Szfw wordResSel.io.func := func 361184a1958Szfw wordResSel.io.addw := addw 362184a1958Szfw wordResSel.io.subw := subw 363184a1958Szfw wordResSel.io.sllw := sllw 364184a1958Szfw wordResSel.io.srlw := srlw 365184a1958Szfw wordResSel.io.sraw := sraw 36628c18878Szfw wordResSel.io.rolw := rolw 36728c18878Szfw wordResSel.io.rorw := rorw 368184a1958Szfw val wordRes = wordResSel.io.wordRes 369ee8ff153Szfw 37031ea8750SLinJiawei val aluResSel = Module(new AluResSel) 371edace9bfSxiwenx aluResSel.io.func := func(6, 4) 372184a1958Szfw aluResSel.io.addRes := add 373184a1958Szfw aluResSel.io.compareRes := compareRes 374ee8ff153Szfw aluResSel.io.shiftRes := shiftRes 37531ea8750SLinJiawei aluResSel.io.miscRes := miscRes 376184a1958Szfw aluResSel.io.wordRes := wordRes 377545d7be0SYangyu Chen aluResSel.io.condRes := condRes 37831ea8750SLinJiawei val aluRes = aluResSel.io.aluRes 379e18c367fSLinJiawei 380e2203130SLinJiawei io.result := aluRes 381fe528fd6Ssinsanction 382fe528fd6Ssinsanction XSDebug(func === ALUOpType.lui32add, p"[alu] func lui32: src1=${Hexadecimal(src1)} src2=${Hexadecimal(src2)} alures=${Hexadecimal(aluRes)}\n") 383fe528fd6Ssinsanction 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") 38454711376Ssinsanction 38554711376Ssinsanction XSDebug(func === ALUOpType.lui32addw, p"[alu] func lui32w: src1=${Hexadecimal(src1)} src2=${Hexadecimal(src2)} alures=${Hexadecimal(aluRes)}\n") 38654711376Ssinsanction 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") 387e2203130SLinJiawei} 388