xref: /XiangShan/src/main/scala/xiangshan/backend/fu/Alu.scala (revision 545d7be08861a078dc54ccc114bf1792e894ab54)
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