xref: /XiangShan/src/main/scala/xiangshan/backend/fu/Alu.scala (revision fe528fd64820115f11edd2eb9d2ea08665ef7ba7)
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._
24*fe528fd6Ssinsanctionimport 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  })
43184a1958Szfw  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
79184a1958Szfw  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
93184a1958Szfw  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
129ee8ff153Szfwclass ShiftResultSelect(implicit p: Parameters) extends XSModule {
130ee8ff153Szfw  val io = IO(new Bundle() {
131675acc68SYinan Xu    val func = Input(UInt(4.W))
13228c18878Szfw    val sll, srl, sra, rol, ror, bclr, bset, binv, bext = Input(UInt(XLEN.W))
133ee8ff153Szfw    val shiftRes = Output(UInt(XLEN.W))
134ee8ff153Szfw  })
135ee8ff153Szfw
136675acc68SYinan Xu  // val leftBit  = Mux(io.func(1), io.binv, Mux(io.func(0), io.bset, io.bclr))
137675acc68SYinan Xu  // val leftRes  = Mux(io.func(2), leftBit, io.sll)
138675acc68SYinan Xu  // val rightRes = Mux(io.func(1) && io.func(0), io.sra, Mux(io.func(1), io.bext, io.srl))
139675acc68SYinan Xu  val resultSource = VecInit(Seq(
140675acc68SYinan Xu    io.sll,
141675acc68SYinan Xu    io.sll,
142675acc68SYinan Xu    io.bclr,
143675acc68SYinan Xu    io.bset,
144675acc68SYinan Xu    io.binv,
145675acc68SYinan Xu    io.srl,
146675acc68SYinan Xu    io.bext,
147675acc68SYinan Xu    io.sra
148675acc68SYinan Xu  ))
149675acc68SYinan Xu  val simple = resultSource(io.func(2, 0))
150ee8ff153Szfw
1517b441e5eSYinan Xu  io.shiftRes := Mux(io.func(3), Mux(io.func(1), io.ror, io.rol), simple)
152184a1958Szfw}
153ee8ff153Szfw
154184a1958Szfwclass WordResultSelect(implicit p: Parameters) extends XSModule {
155184a1958Szfw  val io = IO(new Bundle() {
156184a1958Szfw    val func = Input(UInt())
15728c18878Szfw    val sllw, srlw, sraw, rolw, rorw, addw, subw = Input(UInt((XLEN/2).W))
158184a1958Szfw    val wordRes = Output(UInt(XLEN.W))
159184a1958Szfw  })
160ee8ff153Szfw
161675acc68SYinan Xu  val addsubRes = Mux(!io.func(2) && io.func(1), io.subw, io.addw)
162675acc68SYinan Xu  val shiftRes = Mux(io.func(2), Mux(io.func(0), io.rorw, io.rolw),
163675acc68SYinan Xu                  Mux(io.func(1), io.sraw, Mux(io.func(0), io.srlw, io.sllw)))
164675acc68SYinan Xu  val wordRes = Mux(io.func(3), shiftRes, addsubRes)
165184a1958Szfw  io.wordRes := SignExt(wordRes, XLEN)
166ee8ff153Szfw}
167ee8ff153Szfw
168ee8ff153Szfw
1692225d46eSJiawei Linclass AluResSel(implicit p: Parameters) extends XSModule {
17031ea8750SLinJiawei  val io = IO(new Bundle() {
171edace9bfSxiwenx    val func = Input(UInt(3.W))
172edace9bfSxiwenx    val addRes, shiftRes, miscRes, compareRes, wordRes = Input(UInt(XLEN.W))
17331ea8750SLinJiawei    val aluRes = Output(UInt(XLEN.W))
17431ea8750SLinJiawei  })
175ee8ff153Szfw
176edace9bfSxiwenx  val res = Mux(io.func(2, 1) === 0.U, Mux(io.func(0), io.wordRes, io.shiftRes),
177edace9bfSxiwenx            Mux(!io.func(2), Mux(io.func(0), io.compareRes, io.addRes), io.miscRes))
178184a1958Szfw  io.aluRes := res
17931ea8750SLinJiawei}
18031ea8750SLinJiawei
1812225d46eSJiawei Linclass AluDataModule(implicit p: Parameters) extends XSModule {
182e2203130SLinJiawei  val io = IO(new Bundle() {
1832bd5334dSYinan Xu    val src = Vec(2, Input(UInt(XLEN.W)))
184e2203130SLinJiawei    val func = Input(FuOpType())
185e2203130SLinJiawei    val result = Output(UInt(XLEN.W))
186e2203130SLinJiawei  })
1872bd5334dSYinan Xu  val (src1, src2, func) = (io.src(0), io.src(1), io.func)
188e18c367fSLinJiawei
189675acc68SYinan Xu  val shamt = src2(5, 0)
190675acc68SYinan Xu  val revShamt = ~src2(5,0) + 1.U
191675acc68SYinan Xu
192675acc68SYinan Xu  // slliuw, sll
193675acc68SYinan Xu  val leftShiftModule = Module(new LeftShiftModule)
194675acc68SYinan Xu  val sll = leftShiftModule.io.sll
195675acc68SYinan Xu  val revSll = leftShiftModule.io.revSll
196675acc68SYinan Xu  leftShiftModule.io.sllSrc := Cat(Fill(32, func(0)), Fill(32, 1.U)) & src1
197675acc68SYinan Xu  leftShiftModule.io.shamt := shamt
198675acc68SYinan Xu  leftShiftModule.io.revShamt := revShamt
199675acc68SYinan Xu
200675acc68SYinan Xu  // bclr, bset, binv
201675acc68SYinan Xu  val bitShift = 1.U << src2(5, 0)
202675acc68SYinan Xu  val bclr = src1 & ~bitShift
203675acc68SYinan Xu  val bset = src1 | bitShift
204675acc68SYinan Xu  val binv = src1 ^ bitShift
205675acc68SYinan Xu
206675acc68SYinan Xu  // srl, sra, bext
207675acc68SYinan Xu  val rightShiftModule = Module(new RightShiftModule)
208675acc68SYinan Xu  val srl = rightShiftModule.io.srl
209675acc68SYinan Xu  val revSrl = rightShiftModule.io.revSrl
210675acc68SYinan Xu  val sra = rightShiftModule.io.sra
211675acc68SYinan Xu  rightShiftModule.io.shamt := shamt
212675acc68SYinan Xu  rightShiftModule.io.revShamt := revShamt
213675acc68SYinan Xu  rightShiftModule.io.srlSrc := src1
214675acc68SYinan Xu  rightShiftModule.io.sraSrc := src1
215675acc68SYinan Xu  val bext = srl(0)
216675acc68SYinan Xu
217675acc68SYinan Xu  val rol = revSrl | sll
218675acc68SYinan Xu  val ror = srl | revSll
219675acc68SYinan Xu
220675acc68SYinan Xu  // addw
221184a1958Szfw  val addModule = Module(new AddModule)
222675acc68SYinan Xu  addModule.io.srcw := Mux(!func(2) && func(0), ZeroExt(src1(0), XLEN), src1(31, 0))
223675acc68SYinan Xu  val addwResultAll = VecInit(Seq(
224675acc68SYinan Xu    ZeroExt(addModule.io.addw(0), XLEN),
225675acc68SYinan Xu    ZeroExt(addModule.io.addw(7, 0), XLEN),
226675acc68SYinan Xu    ZeroExt(addModule.io.addw(15, 0), XLEN),
227675acc68SYinan Xu    SignExt(addModule.io.addw(15, 0), XLEN)
228675acc68SYinan Xu  ))
229675acc68SYinan Xu  val addw = Mux(func(2), addwResultAll(func(1, 0)), addModule.io.addw)
230675acc68SYinan Xu
231675acc68SYinan Xu  // subw
232675acc68SYinan Xu  val subModule = Module(new SubModule)
233675acc68SYinan Xu  val subw = subModule.io.sub
234675acc68SYinan Xu
235675acc68SYinan Xu  // sllw
236675acc68SYinan Xu  val leftShiftWordModule = Module(new LeftShiftWordModule)
237675acc68SYinan Xu  val sllw = leftShiftWordModule.io.sllw
238675acc68SYinan Xu  val revSllw = leftShiftWordModule.io.revSllw
239675acc68SYinan Xu  leftShiftWordModule.io.sllSrc := src1
240675acc68SYinan Xu  leftShiftWordModule.io.shamt := shamt
241675acc68SYinan Xu  leftShiftWordModule.io.revShamt := revShamt
242675acc68SYinan Xu
243675acc68SYinan Xu  val rightShiftWordModule = Module(new RightShiftWordModule)
244675acc68SYinan Xu  val srlw = rightShiftWordModule.io.srlw
245675acc68SYinan Xu  val revSrlw = rightShiftWordModule.io.revSrlw
246675acc68SYinan Xu  val sraw = rightShiftWordModule.io.sraw
247675acc68SYinan Xu  rightShiftWordModule.io.shamt := shamt
248675acc68SYinan Xu  rightShiftWordModule.io.revShamt := revShamt
249675acc68SYinan Xu  rightShiftWordModule.io.srlSrc := src1
250675acc68SYinan Xu  rightShiftWordModule.io.sraSrc := src1
251675acc68SYinan Xu
252675acc68SYinan Xu  val rolw = revSrlw | sllw
253675acc68SYinan Xu  val rorw = srlw | revSllw
254675acc68SYinan Xu
255675acc68SYinan Xu  // add
256a792bcf1SYinan Xu  val wordMaskAddSource = Cat(Fill(32, func(0)), Fill(32, 1.U)) & src1
257a792bcf1SYinan Xu  val shaddSource = VecInit(Seq(
258a792bcf1SYinan Xu    Cat(wordMaskAddSource(62, 0), 0.U(1.W)),
259a792bcf1SYinan Xu    Cat(wordMaskAddSource(61, 0), 0.U(2.W)),
260a792bcf1SYinan Xu    Cat(wordMaskAddSource(60, 0), 0.U(3.W)),
261a792bcf1SYinan Xu    Cat(wordMaskAddSource(59, 0), 0.U(4.W))
262a792bcf1SYinan Xu  ))
263a792bcf1SYinan Xu  val sraddSource = VecInit(Seq(
264a792bcf1SYinan Xu    ZeroExt(src1(63, 29), XLEN),
26588825c5cSYinan Xu    ZeroExt(src1(63, 30), XLEN),
26688825c5cSYinan Xu    ZeroExt(src1(63, 31), XLEN),
26788825c5cSYinan Xu    ZeroExt(src1(63, 32), XLEN)
26888825c5cSYinan Xu  ))
269a792bcf1SYinan Xu  // TODO: use decoder or other libraries to optimize timing
270a792bcf1SYinan Xu  // Now we assume shadd has the worst timing.
271675acc68SYinan Xu  addModule.io.src(0) := Mux(func(3), shaddSource(func(2, 1)),
272675acc68SYinan Xu    Mux(func(2), sraddSource(func(1, 0)),
273*fe528fd6Ssinsanction    Mux(func(1), Mux(func(0), SignExt(src2(11, 0), XLEN), ZeroExt(src1(0), XLEN)), wordMaskAddSource))
274a792bcf1SYinan Xu  )
275*fe528fd6Ssinsanction  addModule.io.src(1) := Mux(func(3, 0) === "b0011".U, Cat(src2(63, 12), 0.U(12.W)), src2)
27688825c5cSYinan Xu  val add = addModule.io.add
277ee8ff153Szfw
278675acc68SYinan Xu  // sub
279184a1958Szfw  val sub  = subModule.io.sub
2802bd5334dSYinan Xu  subModule.io.src(0) := src1
2812bd5334dSYinan Xu  subModule.io.src(1) := src2
2827b441e5eSYinan Xu  val sltu    = !sub(XLEN)
283675acc68SYinan Xu  val slt     = src1(XLEN - 1) ^ src2(XLEN - 1) ^ sltu
284ee8ff153Szfw  val maxMin  = Mux(slt ^ func(0), src2, src1)
2857b441e5eSYinan Xu  val maxMinU = Mux(sltu ^ func(0), src2, src1)
286675acc68SYinan Xu  val compareRes = Mux(func(2), Mux(func(1), maxMin, maxMinU), Mux(func(1), slt, Mux(func(0), sltu, sub)))
287ee8ff153Szfw
288675acc68SYinan Xu  // logic
289675acc68SYinan Xu  val logicSrc2 = Mux(!func(5) && func(0), ~src2, src2)
290675acc68SYinan Xu  val and     = src1 & logicSrc2
291675acc68SYinan Xu  val or      = src1 | logicSrc2
292675acc68SYinan Xu  val xor     = src1 ^ logicSrc2
29373be64b3SJiawei Lin  val orcb    = Cat((0 until 8).map(i => Fill(8, src1(i * 8 + 7, i * 8).orR)).reverse)
294675acc68SYinan Xu  val orh48   = Cat(src1(63, 8), 0.U(8.W)) | src2
295675acc68SYinan Xu
296675acc68SYinan Xu  val sextb = SignExt(src1(7, 0), XLEN)
297675acc68SYinan Xu  val packh = Cat(src2(7,0), src1(7,0))
298675acc68SYinan Xu  val sexth = SignExt(src1(15, 0), XLEN)
299675acc68SYinan Xu  val packw = SignExt(Cat(src2(15, 0), src1(15, 0)), XLEN)
300675acc68SYinan Xu
30173be64b3SJiawei Lin  val revb = Cat((0 until 8).map(i => Reverse(src1(8 * i + 7, 8 * i))).reverse)
302675acc68SYinan Xu  val pack = Cat(src2(31, 0), src1(31, 0))
303675acc68SYinan Xu  val rev8 = Cat((0 until 8).map(i => src1(8 * i + 7, 8 * i)))
304675acc68SYinan Xu
305ee8ff153Szfw
306184a1958Szfw  // Result Select
307184a1958Szfw  val shiftResSel = Module(new ShiftResultSelect)
308675acc68SYinan Xu  shiftResSel.io.func := func(3, 0)
309184a1958Szfw  shiftResSel.io.sll  := sll
310184a1958Szfw  shiftResSel.io.srl  := srl
311184a1958Szfw  shiftResSel.io.sra  := sra
31228c18878Szfw  shiftResSel.io.rol  := rol
31328c18878Szfw  shiftResSel.io.ror  := ror
314184a1958Szfw  shiftResSel.io.bclr := bclr
315184a1958Szfw  shiftResSel.io.binv := binv
316184a1958Szfw  shiftResSel.io.bset := bset
317184a1958Szfw  shiftResSel.io.bext := bext
318184a1958Szfw  val shiftRes = shiftResSel.io.shiftRes
31931ea8750SLinJiawei
32031ea8750SLinJiawei  val miscResSel = Module(new MiscResultSelect)
321675acc68SYinan Xu  miscResSel.io.func    := func(5, 0)
322ee8ff153Szfw  miscResSel.io.and     := and
323ee8ff153Szfw  miscResSel.io.or      := or
324ee8ff153Szfw  miscResSel.io.xor     := xor
325675acc68SYinan Xu  miscResSel.io.orcb    := orcb
32688825c5cSYinan Xu  miscResSel.io.orh48   := orh48
327ee8ff153Szfw  miscResSel.io.sextb   := sextb
328675acc68SYinan Xu  miscResSel.io.packh   := packh
329ee8ff153Szfw  miscResSel.io.sexth   := sexth
330675acc68SYinan Xu  miscResSel.io.packw   := packw
331675acc68SYinan Xu  miscResSel.io.revb    := revb
332ee8ff153Szfw  miscResSel.io.rev8    := rev8
333675acc68SYinan Xu  miscResSel.io.pack    := pack
33488825c5cSYinan Xu  miscResSel.io.src     := src1
33531ea8750SLinJiawei  val miscRes = miscResSel.io.miscRes
33631ea8750SLinJiawei
337184a1958Szfw  val wordResSel = Module(new WordResultSelect)
338184a1958Szfw  wordResSel.io.func := func
339184a1958Szfw  wordResSel.io.addw := addw
340184a1958Szfw  wordResSel.io.subw := subw
341184a1958Szfw  wordResSel.io.sllw := sllw
342184a1958Szfw  wordResSel.io.srlw := srlw
343184a1958Szfw  wordResSel.io.sraw := sraw
34428c18878Szfw  wordResSel.io.rolw := rolw
34528c18878Szfw  wordResSel.io.rorw := rorw
346184a1958Szfw  val wordRes = wordResSel.io.wordRes
347ee8ff153Szfw
34831ea8750SLinJiawei  val aluResSel = Module(new AluResSel)
349edace9bfSxiwenx  aluResSel.io.func := func(6, 4)
350184a1958Szfw  aluResSel.io.addRes := add
351184a1958Szfw  aluResSel.io.compareRes := compareRes
352ee8ff153Szfw  aluResSel.io.shiftRes := shiftRes
35331ea8750SLinJiawei  aluResSel.io.miscRes := miscRes
354184a1958Szfw  aluResSel.io.wordRes := wordRes
35531ea8750SLinJiawei  val aluRes = aluResSel.io.aluRes
356e18c367fSLinJiawei
357e2203130SLinJiawei  io.result := aluRes
358*fe528fd6Ssinsanction
359*fe528fd6Ssinsanction  XSDebug(func === ALUOpType.lui32add, p"[alu] func lui32: src1=${Hexadecimal(src1)} src2=${Hexadecimal(src2)} alures=${Hexadecimal(aluRes)}\n")
360*fe528fd6Ssinsanction  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")
361e2203130SLinJiawei}
362