xref: /XiangShan/src/main/scala/xiangshan/backend/fu/Alu.scala (revision edace9bf42d3629aa254e3670e6fee86346313e8)
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._
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  })
42184a1958Szfw  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
78184a1958Szfw  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
92184a1958Szfw  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
128ee8ff153Szfwclass ShiftResultSelect(implicit p: Parameters) extends XSModule {
129ee8ff153Szfw  val io = IO(new Bundle() {
130675acc68SYinan Xu    val func = Input(UInt(4.W))
13128c18878Szfw    val sll, srl, sra, rol, ror, bclr, bset, binv, bext = Input(UInt(XLEN.W))
132ee8ff153Szfw    val shiftRes = Output(UInt(XLEN.W))
133ee8ff153Szfw  })
134ee8ff153Szfw
135675acc68SYinan Xu  // val leftBit  = Mux(io.func(1), io.binv, Mux(io.func(0), io.bset, io.bclr))
136675acc68SYinan Xu  // val leftRes  = Mux(io.func(2), leftBit, io.sll)
137675acc68SYinan Xu  // val rightRes = Mux(io.func(1) && io.func(0), io.sra, Mux(io.func(1), io.bext, io.srl))
138675acc68SYinan Xu  val resultSource = VecInit(Seq(
139675acc68SYinan Xu    io.sll,
140675acc68SYinan Xu    io.sll,
141675acc68SYinan Xu    io.bclr,
142675acc68SYinan Xu    io.bset,
143675acc68SYinan Xu    io.binv,
144675acc68SYinan Xu    io.srl,
145675acc68SYinan Xu    io.bext,
146675acc68SYinan Xu    io.sra
147675acc68SYinan Xu  ))
148675acc68SYinan Xu  val simple = resultSource(io.func(2, 0))
149ee8ff153Szfw
1507b441e5eSYinan Xu  io.shiftRes := Mux(io.func(3), Mux(io.func(1), io.ror, io.rol), simple)
151184a1958Szfw}
152ee8ff153Szfw
153184a1958Szfwclass WordResultSelect(implicit p: Parameters) extends XSModule {
154184a1958Szfw  val io = IO(new Bundle() {
155184a1958Szfw    val func = Input(UInt())
15628c18878Szfw    val sllw, srlw, sraw, rolw, rorw, addw, subw = Input(UInt((XLEN/2).W))
157184a1958Szfw    val wordRes = Output(UInt(XLEN.W))
158184a1958Szfw  })
159ee8ff153Szfw
160675acc68SYinan Xu  val addsubRes = Mux(!io.func(2) && io.func(1), io.subw, io.addw)
161675acc68SYinan Xu  val shiftRes = Mux(io.func(2), Mux(io.func(0), io.rorw, io.rolw),
162675acc68SYinan Xu                  Mux(io.func(1), io.sraw, Mux(io.func(0), io.srlw, io.sllw)))
163675acc68SYinan Xu  val wordRes = Mux(io.func(3), shiftRes, addsubRes)
164184a1958Szfw  io.wordRes := SignExt(wordRes, XLEN)
165ee8ff153Szfw}
166ee8ff153Szfw
167ee8ff153Szfw
1682225d46eSJiawei Linclass AluResSel(implicit p: Parameters) extends XSModule {
16931ea8750SLinJiawei  val io = IO(new Bundle() {
170*edace9bfSxiwenx    val func = Input(UInt(3.W))
171*edace9bfSxiwenx    val addRes, shiftRes, miscRes, compareRes, wordRes = Input(UInt(XLEN.W))
17231ea8750SLinJiawei    val aluRes = Output(UInt(XLEN.W))
17331ea8750SLinJiawei  })
174ee8ff153Szfw
175*edace9bfSxiwenx  val res = Mux(io.func(2, 1) === 0.U, Mux(io.func(0), io.wordRes, io.shiftRes),
176*edace9bfSxiwenx            Mux(!io.func(2), Mux(io.func(0), io.compareRes, io.addRes), io.miscRes))
177184a1958Szfw  io.aluRes := res
17831ea8750SLinJiawei}
17931ea8750SLinJiawei
1802225d46eSJiawei Linclass AluDataModule(implicit p: Parameters) extends XSModule {
181e2203130SLinJiawei  val io = IO(new Bundle() {
1822bd5334dSYinan Xu    val src = Vec(2, Input(UInt(XLEN.W)))
183e2203130SLinJiawei    val func = Input(FuOpType())
184e2203130SLinJiawei    val result = Output(UInt(XLEN.W))
185e2203130SLinJiawei  })
1862bd5334dSYinan Xu  val (src1, src2, func) = (io.src(0), io.src(1), io.func)
187e18c367fSLinJiawei
188675acc68SYinan Xu  val shamt = src2(5, 0)
189675acc68SYinan Xu  val revShamt = ~src2(5,0) + 1.U
190675acc68SYinan Xu
191675acc68SYinan Xu  // slliuw, sll
192675acc68SYinan Xu  val leftShiftModule = Module(new LeftShiftModule)
193675acc68SYinan Xu  val sll = leftShiftModule.io.sll
194675acc68SYinan Xu  val revSll = leftShiftModule.io.revSll
195675acc68SYinan Xu  leftShiftModule.io.sllSrc := Cat(Fill(32, func(0)), Fill(32, 1.U)) & src1
196675acc68SYinan Xu  leftShiftModule.io.shamt := shamt
197675acc68SYinan Xu  leftShiftModule.io.revShamt := revShamt
198675acc68SYinan Xu
199675acc68SYinan Xu  // bclr, bset, binv
200675acc68SYinan Xu  val bitShift = 1.U << src2(5, 0)
201675acc68SYinan Xu  val bclr = src1 & ~bitShift
202675acc68SYinan Xu  val bset = src1 | bitShift
203675acc68SYinan Xu  val binv = src1 ^ bitShift
204675acc68SYinan Xu
205675acc68SYinan Xu  // srl, sra, bext
206675acc68SYinan Xu  val rightShiftModule = Module(new RightShiftModule)
207675acc68SYinan Xu  val srl = rightShiftModule.io.srl
208675acc68SYinan Xu  val revSrl = rightShiftModule.io.revSrl
209675acc68SYinan Xu  val sra = rightShiftModule.io.sra
210675acc68SYinan Xu  rightShiftModule.io.shamt := shamt
211675acc68SYinan Xu  rightShiftModule.io.revShamt := revShamt
212675acc68SYinan Xu  rightShiftModule.io.srlSrc := src1
213675acc68SYinan Xu  rightShiftModule.io.sraSrc := src1
214675acc68SYinan Xu  val bext = srl(0)
215675acc68SYinan Xu
216675acc68SYinan Xu  val rol = revSrl | sll
217675acc68SYinan Xu  val ror = srl | revSll
218675acc68SYinan Xu
219675acc68SYinan Xu  // addw
220184a1958Szfw  val addModule = Module(new AddModule)
221675acc68SYinan Xu  addModule.io.srcw := Mux(!func(2) && func(0), ZeroExt(src1(0), XLEN), src1(31, 0))
222675acc68SYinan Xu  val addwResultAll = VecInit(Seq(
223675acc68SYinan Xu    ZeroExt(addModule.io.addw(0), XLEN),
224675acc68SYinan Xu    ZeroExt(addModule.io.addw(7, 0), XLEN),
225675acc68SYinan Xu    ZeroExt(addModule.io.addw(15, 0), XLEN),
226675acc68SYinan Xu    SignExt(addModule.io.addw(15, 0), XLEN)
227675acc68SYinan Xu  ))
228675acc68SYinan Xu  val addw = Mux(func(2), addwResultAll(func(1, 0)), addModule.io.addw)
229675acc68SYinan Xu
230675acc68SYinan Xu  // subw
231675acc68SYinan Xu  val subModule = Module(new SubModule)
232675acc68SYinan Xu  val subw = subModule.io.sub
233675acc68SYinan Xu
234675acc68SYinan Xu  // sllw
235675acc68SYinan Xu  val leftShiftWordModule = Module(new LeftShiftWordModule)
236675acc68SYinan Xu  val sllw = leftShiftWordModule.io.sllw
237675acc68SYinan Xu  val revSllw = leftShiftWordModule.io.revSllw
238675acc68SYinan Xu  leftShiftWordModule.io.sllSrc := src1
239675acc68SYinan Xu  leftShiftWordModule.io.shamt := shamt
240675acc68SYinan Xu  leftShiftWordModule.io.revShamt := revShamt
241675acc68SYinan Xu
242675acc68SYinan Xu  val rightShiftWordModule = Module(new RightShiftWordModule)
243675acc68SYinan Xu  val srlw = rightShiftWordModule.io.srlw
244675acc68SYinan Xu  val revSrlw = rightShiftWordModule.io.revSrlw
245675acc68SYinan Xu  val sraw = rightShiftWordModule.io.sraw
246675acc68SYinan Xu  rightShiftWordModule.io.shamt := shamt
247675acc68SYinan Xu  rightShiftWordModule.io.revShamt := revShamt
248675acc68SYinan Xu  rightShiftWordModule.io.srlSrc := src1
249675acc68SYinan Xu  rightShiftWordModule.io.sraSrc := src1
250675acc68SYinan Xu
251675acc68SYinan Xu  val rolw = revSrlw | sllw
252675acc68SYinan Xu  val rorw = srlw | revSllw
253675acc68SYinan Xu
254675acc68SYinan Xu  // add
255a792bcf1SYinan Xu  val wordMaskAddSource = Cat(Fill(32, func(0)), Fill(32, 1.U)) & src1
256a792bcf1SYinan Xu  val shaddSource = VecInit(Seq(
257a792bcf1SYinan Xu    Cat(wordMaskAddSource(62, 0), 0.U(1.W)),
258a792bcf1SYinan Xu    Cat(wordMaskAddSource(61, 0), 0.U(2.W)),
259a792bcf1SYinan Xu    Cat(wordMaskAddSource(60, 0), 0.U(3.W)),
260a792bcf1SYinan Xu    Cat(wordMaskAddSource(59, 0), 0.U(4.W))
261a792bcf1SYinan Xu  ))
262a792bcf1SYinan Xu  val sraddSource = VecInit(Seq(
263a792bcf1SYinan Xu    ZeroExt(src1(63, 29), XLEN),
26488825c5cSYinan Xu    ZeroExt(src1(63, 30), XLEN),
26588825c5cSYinan Xu    ZeroExt(src1(63, 31), XLEN),
26688825c5cSYinan Xu    ZeroExt(src1(63, 32), XLEN)
26788825c5cSYinan Xu  ))
268a792bcf1SYinan Xu  // TODO: use decoder or other libraries to optimize timing
269a792bcf1SYinan Xu  // Now we assume shadd has the worst timing.
270675acc68SYinan Xu  addModule.io.src(0) := Mux(func(3), shaddSource(func(2, 1)),
271675acc68SYinan Xu    Mux(func(2), sraddSource(func(1, 0)),
272675acc68SYinan Xu    Mux(func(1), ZeroExt(src1(0), XLEN), wordMaskAddSource))
273a792bcf1SYinan Xu  )
274a792bcf1SYinan Xu  addModule.io.src(1) := src2
27588825c5cSYinan Xu  val add = addModule.io.add
276ee8ff153Szfw
277675acc68SYinan Xu  // sub
278184a1958Szfw  val sub  = subModule.io.sub
2792bd5334dSYinan Xu  subModule.io.src(0) := src1
2802bd5334dSYinan Xu  subModule.io.src(1) := src2
2817b441e5eSYinan Xu  val sltu    = !sub(XLEN)
282675acc68SYinan Xu  val slt     = src1(XLEN - 1) ^ src2(XLEN - 1) ^ sltu
283ee8ff153Szfw  val maxMin  = Mux(slt ^ func(0), src2, src1)
2847b441e5eSYinan Xu  val maxMinU = Mux(sltu ^ func(0), src2, src1)
285675acc68SYinan Xu  val compareRes = Mux(func(2), Mux(func(1), maxMin, maxMinU), Mux(func(1), slt, Mux(func(0), sltu, sub)))
286ee8ff153Szfw
287675acc68SYinan Xu  // logic
288675acc68SYinan Xu  val logicSrc2 = Mux(!func(5) && func(0), ~src2, src2)
289675acc68SYinan Xu  val and     = src1 & logicSrc2
290675acc68SYinan Xu  val or      = src1 | logicSrc2
291675acc68SYinan Xu  val xor     = src1 ^ logicSrc2
29273be64b3SJiawei Lin  val orcb    = Cat((0 until 8).map(i => Fill(8, src1(i * 8 + 7, i * 8).orR)).reverse)
293675acc68SYinan Xu  val orh48   = Cat(src1(63, 8), 0.U(8.W)) | src2
294675acc68SYinan Xu
295675acc68SYinan Xu  val sextb = SignExt(src1(7, 0), XLEN)
296675acc68SYinan Xu  val packh = Cat(src2(7,0), src1(7,0))
297675acc68SYinan Xu  val sexth = SignExt(src1(15, 0), XLEN)
298675acc68SYinan Xu  val packw = SignExt(Cat(src2(15, 0), src1(15, 0)), XLEN)
299675acc68SYinan Xu
30073be64b3SJiawei Lin  val revb = Cat((0 until 8).map(i => Reverse(src1(8 * i + 7, 8 * i))).reverse)
301675acc68SYinan Xu  val pack = Cat(src2(31, 0), src1(31, 0))
302675acc68SYinan Xu  val rev8 = Cat((0 until 8).map(i => src1(8 * i + 7, 8 * i)))
303675acc68SYinan Xu
304ee8ff153Szfw
305184a1958Szfw  // Result Select
306184a1958Szfw  val shiftResSel = Module(new ShiftResultSelect)
307675acc68SYinan Xu  shiftResSel.io.func := func(3, 0)
308184a1958Szfw  shiftResSel.io.sll  := sll
309184a1958Szfw  shiftResSel.io.srl  := srl
310184a1958Szfw  shiftResSel.io.sra  := sra
31128c18878Szfw  shiftResSel.io.rol  := rol
31228c18878Szfw  shiftResSel.io.ror  := ror
313184a1958Szfw  shiftResSel.io.bclr := bclr
314184a1958Szfw  shiftResSel.io.binv := binv
315184a1958Szfw  shiftResSel.io.bset := bset
316184a1958Szfw  shiftResSel.io.bext := bext
317184a1958Szfw  val shiftRes = shiftResSel.io.shiftRes
31831ea8750SLinJiawei
31931ea8750SLinJiawei  val miscResSel = Module(new MiscResultSelect)
320675acc68SYinan Xu  miscResSel.io.func    := func(5, 0)
321ee8ff153Szfw  miscResSel.io.and     := and
322ee8ff153Szfw  miscResSel.io.or      := or
323ee8ff153Szfw  miscResSel.io.xor     := xor
324675acc68SYinan Xu  miscResSel.io.orcb    := orcb
32588825c5cSYinan Xu  miscResSel.io.orh48   := orh48
326ee8ff153Szfw  miscResSel.io.sextb   := sextb
327675acc68SYinan Xu  miscResSel.io.packh   := packh
328ee8ff153Szfw  miscResSel.io.sexth   := sexth
329675acc68SYinan Xu  miscResSel.io.packw   := packw
330675acc68SYinan Xu  miscResSel.io.revb    := revb
331ee8ff153Szfw  miscResSel.io.rev8    := rev8
332675acc68SYinan Xu  miscResSel.io.pack    := pack
33388825c5cSYinan Xu  miscResSel.io.src     := src1
33431ea8750SLinJiawei  val miscRes = miscResSel.io.miscRes
33531ea8750SLinJiawei
336184a1958Szfw  val wordResSel = Module(new WordResultSelect)
337184a1958Szfw  wordResSel.io.func := func
338184a1958Szfw  wordResSel.io.addw := addw
339184a1958Szfw  wordResSel.io.subw := subw
340184a1958Szfw  wordResSel.io.sllw := sllw
341184a1958Szfw  wordResSel.io.srlw := srlw
342184a1958Szfw  wordResSel.io.sraw := sraw
34328c18878Szfw  wordResSel.io.rolw := rolw
34428c18878Szfw  wordResSel.io.rorw := rorw
345184a1958Szfw  val wordRes = wordResSel.io.wordRes
346ee8ff153Szfw
34731ea8750SLinJiawei  val aluResSel = Module(new AluResSel)
348*edace9bfSxiwenx  aluResSel.io.func := func(6, 4)
349184a1958Szfw  aluResSel.io.addRes := add
350184a1958Szfw  aluResSel.io.compareRes := compareRes
351ee8ff153Szfw  aluResSel.io.shiftRes := shiftRes
35231ea8750SLinJiawei  aluResSel.io.miscRes := miscRes
353184a1958Szfw  aluResSel.io.wordRes := wordRes
35431ea8750SLinJiawei  val aluRes = aluResSel.io.aluRes
355e18c367fSLinJiawei
356e2203130SLinJiawei  io.result := aluRes
357e2203130SLinJiawei}
358e2203130SLinJiawei
359adb5df20SYinan Xuclass Alu(implicit p: Parameters) extends FUWithRedirect {
360e2203130SLinJiawei
361675acc68SYinan Xu  val uop = io.in.bits.uop
362e2203130SLinJiawei
363e2203130SLinJiawei  val dataModule = Module(new AluDataModule)
3643a6ab23aSczw  val bru = Module(new Branch()(p))
365*edace9bfSxiwenx  val vset = Module(new Vset()(p))
3663a6ab23aSczw
3673a6ab23aSczw  bru.io.in <> io.in
3683a6ab23aSczw  bru.io.in.bits.uop <> io.in.bits.uop
3693a6ab23aSczw  bru.io.redirectIn <> io.redirectIn
3703a6ab23aSczw  bru.io.out.ready := io.out.ready
371e2203130SLinJiawei
372*edace9bfSxiwenx  vset.io.in <> io.in
373*edace9bfSxiwenx  vset.io.in.bits.uop <> io.in.bits.uop
374*edace9bfSxiwenx  vset.io.redirectIn <> io.redirectIn
375*edace9bfSxiwenx  vset.io.out.ready := io.out.ready
376*edace9bfSxiwenx
377675acc68SYinan Xu  dataModule.io.src := io.in.bits.src.take(2)
378675acc68SYinan Xu  dataModule.io.func := io.in.bits.uop.ctrl.fuOpType
379e2203130SLinJiawei
3803a6ab23aSczw  redirectOutValid := bru.redirectOutValid
3813a6ab23aSczw  redirectOut <> bru.redirectOut
382151e3043SLinJiawei
383e18c367fSLinJiawei  io.in.ready := io.out.ready
384675acc68SYinan Xu  io.out.valid := io.in.valid
385e18c367fSLinJiawei  io.out.bits.uop <> io.in.bits.uop
386*edace9bfSxiwenx  io.out.bits.data := Mux(vset.io.out.valid, vset.io.out.bits.data, dataModule.io.result)
387e18c367fSLinJiawei}
388