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