xref: /XiangShan/src/main/scala/xiangshan/backend/fu/Alu.scala (revision 3a6ab23a860d5e58a0dd361d2b2c685dbd41de6b)
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
254aa9ed34Sfdyclass VsetModule(implicit p: Parameters) extends XSModule {
264aa9ed34Sfdy  val io = IO(new Bundle() {
274aa9ed34Sfdy    val lsrc0 = Input(UInt(6.W))
284aa9ed34Sfdy    val ldest = Input(UInt(6.W))
294aa9ed34Sfdy    val src0  = Input(UInt(XLEN.W))
304aa9ed34Sfdy    val src1  = Input(UInt(XLEN.W))
314aa9ed34Sfdy    val func  = Input(FuOpType())
324aa9ed34Sfdy    val vconfig = Input(UInt(16.W))
334aa9ed34Sfdy
344aa9ed34Sfdy    val res   = Output(UInt(XLEN.W))
354aa9ed34Sfdy  })
364aa9ed34Sfdy  val vtype = io.src1(7, 0)
374aa9ed34Sfdy  val vlmul = vtype(2, 0)
384aa9ed34Sfdy  val vsew = vtype(5, 3)
394aa9ed34Sfdy
404aa9ed34Sfdy  val avlImm = Cat(0.U(3.W), io.src1(14, 10))
414aa9ed34Sfdy  val vlLast = io.vconfig(15, 8)
424aa9ed34Sfdy
434aa9ed34Sfdy  val rd = io.ldest
444aa9ed34Sfdy  val rs1 = io.lsrc0
454aa9ed34Sfdy  val vl = WireInit(0.U(XLEN.W))
464aa9ed34Sfdy  val vconfig = WireInit(0.U(XLEN.W))
474aa9ed34Sfdy
484aa9ed34Sfdy  // vlen =  128
494aa9ed34Sfdy  val vlmaxVec = (0 to 7).map(i => if(i < 4) (16 << i).U(8.W) else (16 >> (8 - i)).U(8.W))
504aa9ed34Sfdy  val shamt = vlmul + (~vsew).asUInt + 1.U
514aa9ed34Sfdy  val vlmax = ParallelMux((0 to 7).map(_.U).map(_ === shamt), vlmaxVec)
524aa9ed34Sfdy
534aa9ed34Sfdy  val isVsetivli = io.func === ALUOpType.vsetivli2 || io.func === ALUOpType.vsetivli1
544aa9ed34Sfdy  val vlWhenRs1Not0 = Mux(isVsetivli, Mux(avlImm > vlmax, vlmax, avlImm),
554aa9ed34Sfdy                                      Mux(io.src0 > vlmax, vlmax, io.src0))
564aa9ed34Sfdy  vl := Mux(rs1 =/= 0.U, vlWhenRs1Not0,
574aa9ed34Sfdy          Mux(rd === 0.U, Cat(0.U(56.W), vlLast), vlmax))
584aa9ed34Sfdy
594aa9ed34Sfdy  vconfig := Cat(0.U(48.W), vl(7, 0), vtype)
604aa9ed34Sfdy
614aa9ed34Sfdy  io.res := Mux(io.func === ALUOpType.vsetvli2 || io.func === ALUOpType.vsetvl2 || io.func === ALUOpType.vsetivli2, vl, vconfig)
624aa9ed34Sfdy}
634aa9ed34Sfdy
642225d46eSJiawei Linclass AddModule(implicit p: Parameters) extends XSModule {
6531ea8750SLinJiawei  val io = IO(new Bundle() {
662bd5334dSYinan Xu    val src = Vec(2, Input(UInt(XLEN.W)))
6728c18878Szfw    val srcw = Input(UInt((XLEN/2).W))
6828c18878Szfw    val add = Output(UInt(XLEN.W))
6928c18878Szfw    val addw = Output(UInt((XLEN/2).W))
7031ea8750SLinJiawei  })
7128c18878Szfw  io.add := io.src(0) + io.src(1)
7288825c5cSYinan Xu  // TODO: why this extra adder?
7328c18878Szfw  io.addw := io.srcw + io.src(1)(31,0)
7431ea8750SLinJiawei}
7531ea8750SLinJiawei
762225d46eSJiawei Linclass SubModule(implicit p: Parameters) extends XSModule {
7731ea8750SLinJiawei  val io = IO(new Bundle() {
782bd5334dSYinan Xu    val src = Vec(2, Input(UInt(XLEN.W)))
79184a1958Szfw    val sub = Output(UInt((XLEN+1).W))
8031ea8750SLinJiawei  })
81184a1958Szfw  io.sub := (io.src(0) +& (~io.src(1)).asUInt()) + 1.U
8231ea8750SLinJiawei}
8331ea8750SLinJiawei
842225d46eSJiawei Linclass LeftShiftModule(implicit p: Parameters) extends XSModule {
8531ea8750SLinJiawei  val io = IO(new Bundle() {
8631ea8750SLinJiawei    val shamt = Input(UInt(6.W))
8728c18878Szfw    val revShamt = Input(UInt(6.W))
8831ea8750SLinJiawei    val sllSrc = Input(UInt(XLEN.W))
8931ea8750SLinJiawei    val sll = Output(UInt(XLEN.W))
9028c18878Szfw    val revSll = Output(UInt(XLEN.W))
9131ea8750SLinJiawei  })
92184a1958Szfw  io.sll := io.sllSrc << io.shamt
9328c18878Szfw  io.revSll := io.sllSrc << io.revShamt
94184a1958Szfw}
95184a1958Szfw
96184a1958Szfwclass LeftShiftWordModule(implicit p: Parameters) extends XSModule {
97184a1958Szfw  val io = IO(new Bundle() {
98184a1958Szfw    val shamt = Input(UInt(5.W))
9928c18878Szfw    val revShamt = Input(UInt(5.W))
100184a1958Szfw    val sllSrc = Input(UInt((XLEN/2).W))
101184a1958Szfw    val sllw = Output(UInt((XLEN/2).W))
10228c18878Szfw    val revSllw = Output(UInt((XLEN/2).W))
103184a1958Szfw  })
104184a1958Szfw  io.sllw := io.sllSrc << io.shamt
10528c18878Szfw  io.revSllw := io.sllSrc << io.revShamt
10631ea8750SLinJiawei}
10731ea8750SLinJiawei
1082225d46eSJiawei Linclass RightShiftModule(implicit p: Parameters) extends XSModule {
10931ea8750SLinJiawei  val io = IO(new Bundle() {
11031ea8750SLinJiawei    val shamt = Input(UInt(6.W))
11128c18878Szfw    val revShamt = Input(UInt(6.W))
11231ea8750SLinJiawei    val srlSrc, sraSrc = Input(UInt(XLEN.W))
113184a1958Szfw    val srl, sra = Output(UInt(XLEN.W))
11428c18878Szfw    val revSrl = Output(UInt(XLEN.W))
11531ea8750SLinJiawei  })
116184a1958Szfw  io.srl  := io.srlSrc >> io.shamt
117184a1958Szfw  io.sra  := (io.sraSrc.asSInt() >> io.shamt).asUInt()
11828c18878Szfw  io.revSrl  := io.srlSrc >> io.revShamt
11931ea8750SLinJiawei}
12031ea8750SLinJiawei
121184a1958Szfwclass RightShiftWordModule(implicit p: Parameters) extends XSModule {
122ee8ff153Szfw  val io = IO(new Bundle() {
123184a1958Szfw    val shamt = Input(UInt(5.W))
12428c18878Szfw    val revShamt = Input(UInt(5.W))
125184a1958Szfw    val srlSrc, sraSrc = Input(UInt((XLEN/2).W))
126184a1958Szfw    val srlw, sraw = Output(UInt((XLEN/2).W))
12728c18878Szfw    val revSrlw = Output(UInt((XLEN/2).W))
128ee8ff153Szfw  })
129184a1958Szfw
130184a1958Szfw  io.srlw := io.srlSrc >> io.shamt
131184a1958Szfw  io.sraw := (io.sraSrc.asSInt() >> io.shamt).asUInt()
13228c18878Szfw  io.revSrlw := io.srlSrc >> io.revShamt
133ee8ff153Szfw}
134ee8ff153Szfw
135184a1958Szfw
1362225d46eSJiawei Linclass MiscResultSelect(implicit p: Parameters) extends XSModule {
13731ea8750SLinJiawei  val io = IO(new Bundle() {
138675acc68SYinan Xu    val func = Input(UInt(6.W))
139675acc68SYinan Xu    val and, or, xor, orcb, orh48, sextb, packh, sexth, packw, revb, rev8, pack = Input(UInt(XLEN.W))
14088825c5cSYinan Xu    val src = Input(UInt(XLEN.W))
14131ea8750SLinJiawei    val miscRes = Output(UInt(XLEN.W))
14231ea8750SLinJiawei  })
143ee8ff153Szfw
144675acc68SYinan Xu  val logicRes = VecInit(Seq(
145675acc68SYinan Xu    io.and,
146675acc68SYinan Xu    io.or,
147675acc68SYinan Xu    io.xor,
148675acc68SYinan Xu    io.orcb
149675acc68SYinan Xu  ))(io.func(2, 1))
150675acc68SYinan Xu  val miscRes = VecInit(Seq(io.sextb, io.packh, io.sexth, io.packw))(io.func(1, 0))
151675acc68SYinan Xu  val logicBase = Mux(io.func(3), miscRes, logicRes)
15288825c5cSYinan Xu
153675acc68SYinan Xu  val revRes = VecInit(Seq(io.revb, io.rev8, io.pack, io.orh48))(io.func(1, 0))
154675acc68SYinan Xu  val customRes = VecInit(Seq(
155675acc68SYinan Xu    Cat(0.U(31.W), io.src(31, 0), 0.U(1.W)),
156675acc68SYinan Xu    Cat(0.U(30.W), io.src(31, 0), 0.U(2.W)),
157675acc68SYinan Xu    Cat(0.U(29.W), io.src(31, 0), 0.U(3.W)),
158675acc68SYinan Xu    Cat(0.U(56.W), io.src(15, 8))))(io.func(1, 0))
159675acc68SYinan Xu  val logicAdv = Mux(io.func(3), customRes, revRes)
160ee8ff153Szfw
161675acc68SYinan Xu  val mask = Cat(Fill(15, io.func(0)), 1.U(1.W))
162675acc68SYinan Xu  val maskedLogicRes = mask & logicRes
163675acc68SYinan Xu
164675acc68SYinan Xu  io.miscRes := Mux(io.func(5), maskedLogicRes, Mux(io.func(4), logicAdv, logicBase))
16531ea8750SLinJiawei}
16631ea8750SLinJiawei
167ee8ff153Szfwclass ShiftResultSelect(implicit p: Parameters) extends XSModule {
168ee8ff153Szfw  val io = IO(new Bundle() {
169675acc68SYinan Xu    val func = Input(UInt(4.W))
17028c18878Szfw    val sll, srl, sra, rol, ror, bclr, bset, binv, bext = Input(UInt(XLEN.W))
171ee8ff153Szfw    val shiftRes = Output(UInt(XLEN.W))
172ee8ff153Szfw  })
173ee8ff153Szfw
174675acc68SYinan Xu  // val leftBit  = Mux(io.func(1), io.binv, Mux(io.func(0), io.bset, io.bclr))
175675acc68SYinan Xu  // val leftRes  = Mux(io.func(2), leftBit, io.sll)
176675acc68SYinan Xu  // val rightRes = Mux(io.func(1) && io.func(0), io.sra, Mux(io.func(1), io.bext, io.srl))
177675acc68SYinan Xu  val resultSource = VecInit(Seq(
178675acc68SYinan Xu    io.sll,
179675acc68SYinan Xu    io.sll,
180675acc68SYinan Xu    io.bclr,
181675acc68SYinan Xu    io.bset,
182675acc68SYinan Xu    io.binv,
183675acc68SYinan Xu    io.srl,
184675acc68SYinan Xu    io.bext,
185675acc68SYinan Xu    io.sra
186675acc68SYinan Xu  ))
187675acc68SYinan Xu  val simple = resultSource(io.func(2, 0))
188ee8ff153Szfw
1897b441e5eSYinan Xu  io.shiftRes := Mux(io.func(3), Mux(io.func(1), io.ror, io.rol), simple)
190184a1958Szfw}
191ee8ff153Szfw
192184a1958Szfwclass WordResultSelect(implicit p: Parameters) extends XSModule {
193184a1958Szfw  val io = IO(new Bundle() {
194184a1958Szfw    val func = Input(UInt())
19528c18878Szfw    val sllw, srlw, sraw, rolw, rorw, addw, subw = Input(UInt((XLEN/2).W))
196184a1958Szfw    val wordRes = Output(UInt(XLEN.W))
197184a1958Szfw  })
198ee8ff153Szfw
199675acc68SYinan Xu  val addsubRes = Mux(!io.func(2) && io.func(1), io.subw, io.addw)
200675acc68SYinan Xu  val shiftRes = Mux(io.func(2), Mux(io.func(0), io.rorw, io.rolw),
201675acc68SYinan Xu                  Mux(io.func(1), io.sraw, Mux(io.func(0), io.srlw, io.sllw)))
202675acc68SYinan Xu  val wordRes = Mux(io.func(3), shiftRes, addsubRes)
203184a1958Szfw  io.wordRes := SignExt(wordRes, XLEN)
204ee8ff153Szfw}
205ee8ff153Szfw
206ee8ff153Szfw
2072225d46eSJiawei Linclass AluResSel(implicit p: Parameters) extends XSModule {
20831ea8750SLinJiawei  val io = IO(new Bundle() {
2094aa9ed34Sfdy    val func = Input(UInt(4.W))
2104aa9ed34Sfdy    val addRes, shiftRes, miscRes, compareRes, wordRes, vsetRes = Input(UInt(XLEN.W))
21131ea8750SLinJiawei    val aluRes = Output(UInt(XLEN.W))
21231ea8750SLinJiawei  })
213ee8ff153Szfw
2144aa9ed34Sfdy  val res = Mux(io.func(3), io.vsetRes,
2154aa9ed34Sfdy              Mux(io.func(2, 1) === 0.U, Mux(io.func(0), io.wordRes, io.shiftRes),
2164aa9ed34Sfdy                Mux(!io.func(2), Mux(io.func(0), io.compareRes, io.addRes), io.miscRes)))
217184a1958Szfw  io.aluRes := res
21831ea8750SLinJiawei}
21931ea8750SLinJiawei
2202225d46eSJiawei Linclass AluDataModule(implicit p: Parameters) extends XSModule {
221e2203130SLinJiawei  val io = IO(new Bundle() {
2222bd5334dSYinan Xu    val src = Vec(2, Input(UInt(XLEN.W)))
223e2203130SLinJiawei    val func = Input(FuOpType())
224e2203130SLinJiawei    val result = Output(UInt(XLEN.W))
2254aa9ed34Sfdy    val lsrc0 = Input(UInt(6.W))
2264aa9ed34Sfdy    val ldest = Input(UInt(6.W))
2274aa9ed34Sfdy    val vconfig = Input(UInt(16.W))
228e2203130SLinJiawei  })
2292bd5334dSYinan Xu  val (src1, src2, func) = (io.src(0), io.src(1), io.func)
230e18c367fSLinJiawei
231675acc68SYinan Xu  val shamt = src2(5, 0)
232675acc68SYinan Xu  val revShamt = ~src2(5,0) + 1.U
233675acc68SYinan Xu
234675acc68SYinan Xu  // slliuw, sll
235675acc68SYinan Xu  val leftShiftModule = Module(new LeftShiftModule)
236675acc68SYinan Xu  val sll = leftShiftModule.io.sll
237675acc68SYinan Xu  val revSll = leftShiftModule.io.revSll
238675acc68SYinan Xu  leftShiftModule.io.sllSrc := Cat(Fill(32, func(0)), Fill(32, 1.U)) & src1
239675acc68SYinan Xu  leftShiftModule.io.shamt := shamt
240675acc68SYinan Xu  leftShiftModule.io.revShamt := revShamt
241675acc68SYinan Xu
242675acc68SYinan Xu  // bclr, bset, binv
243675acc68SYinan Xu  val bitShift = 1.U << src2(5, 0)
244675acc68SYinan Xu  val bclr = src1 & ~bitShift
245675acc68SYinan Xu  val bset = src1 | bitShift
246675acc68SYinan Xu  val binv = src1 ^ bitShift
247675acc68SYinan Xu
248675acc68SYinan Xu  // srl, sra, bext
249675acc68SYinan Xu  val rightShiftModule = Module(new RightShiftModule)
250675acc68SYinan Xu  val srl = rightShiftModule.io.srl
251675acc68SYinan Xu  val revSrl = rightShiftModule.io.revSrl
252675acc68SYinan Xu  val sra = rightShiftModule.io.sra
253675acc68SYinan Xu  rightShiftModule.io.shamt := shamt
254675acc68SYinan Xu  rightShiftModule.io.revShamt := revShamt
255675acc68SYinan Xu  rightShiftModule.io.srlSrc := src1
256675acc68SYinan Xu  rightShiftModule.io.sraSrc := src1
257675acc68SYinan Xu  val bext = srl(0)
258675acc68SYinan Xu
259675acc68SYinan Xu  val rol = revSrl | sll
260675acc68SYinan Xu  val ror = srl | revSll
261675acc68SYinan Xu
2624aa9ed34Sfdy  // vset
2634aa9ed34Sfdy  val vsetModule = Module(new VsetModule)
2644aa9ed34Sfdy  vsetModule.io.lsrc0 := io.lsrc0
2654aa9ed34Sfdy  vsetModule.io.ldest := io.ldest
2664aa9ed34Sfdy  vsetModule.io.src0 := io.src(0)
2674aa9ed34Sfdy  vsetModule.io.src1 := io.src(1)
2684aa9ed34Sfdy  vsetModule.io.func := io.func
2694aa9ed34Sfdy  vsetModule.io.vconfig := io.vconfig
2704aa9ed34Sfdy
271675acc68SYinan Xu  // addw
272184a1958Szfw  val addModule = Module(new AddModule)
273675acc68SYinan Xu  addModule.io.srcw := Mux(!func(2) && func(0), ZeroExt(src1(0), XLEN), src1(31, 0))
274675acc68SYinan Xu  val addwResultAll = VecInit(Seq(
275675acc68SYinan Xu    ZeroExt(addModule.io.addw(0), XLEN),
276675acc68SYinan Xu    ZeroExt(addModule.io.addw(7, 0), XLEN),
277675acc68SYinan Xu    ZeroExt(addModule.io.addw(15, 0), XLEN),
278675acc68SYinan Xu    SignExt(addModule.io.addw(15, 0), XLEN)
279675acc68SYinan Xu  ))
280675acc68SYinan Xu  val addw = Mux(func(2), addwResultAll(func(1, 0)), addModule.io.addw)
281675acc68SYinan Xu
282675acc68SYinan Xu  // subw
283675acc68SYinan Xu  val subModule = Module(new SubModule)
284675acc68SYinan Xu  val subw = subModule.io.sub
285675acc68SYinan Xu
286675acc68SYinan Xu  // sllw
287675acc68SYinan Xu  val leftShiftWordModule = Module(new LeftShiftWordModule)
288675acc68SYinan Xu  val sllw = leftShiftWordModule.io.sllw
289675acc68SYinan Xu  val revSllw = leftShiftWordModule.io.revSllw
290675acc68SYinan Xu  leftShiftWordModule.io.sllSrc := src1
291675acc68SYinan Xu  leftShiftWordModule.io.shamt := shamt
292675acc68SYinan Xu  leftShiftWordModule.io.revShamt := revShamt
293675acc68SYinan Xu
294675acc68SYinan Xu  val rightShiftWordModule = Module(new RightShiftWordModule)
295675acc68SYinan Xu  val srlw = rightShiftWordModule.io.srlw
296675acc68SYinan Xu  val revSrlw = rightShiftWordModule.io.revSrlw
297675acc68SYinan Xu  val sraw = rightShiftWordModule.io.sraw
298675acc68SYinan Xu  rightShiftWordModule.io.shamt := shamt
299675acc68SYinan Xu  rightShiftWordModule.io.revShamt := revShamt
300675acc68SYinan Xu  rightShiftWordModule.io.srlSrc := src1
301675acc68SYinan Xu  rightShiftWordModule.io.sraSrc := src1
302675acc68SYinan Xu
303675acc68SYinan Xu  val rolw = revSrlw | sllw
304675acc68SYinan Xu  val rorw = srlw | revSllw
305675acc68SYinan Xu
306675acc68SYinan Xu  // add
307a792bcf1SYinan Xu  val wordMaskAddSource = Cat(Fill(32, func(0)), Fill(32, 1.U)) & src1
308a792bcf1SYinan Xu  val shaddSource = VecInit(Seq(
309a792bcf1SYinan Xu    Cat(wordMaskAddSource(62, 0), 0.U(1.W)),
310a792bcf1SYinan Xu    Cat(wordMaskAddSource(61, 0), 0.U(2.W)),
311a792bcf1SYinan Xu    Cat(wordMaskAddSource(60, 0), 0.U(3.W)),
312a792bcf1SYinan Xu    Cat(wordMaskAddSource(59, 0), 0.U(4.W))
313a792bcf1SYinan Xu  ))
314a792bcf1SYinan Xu  val sraddSource = VecInit(Seq(
315a792bcf1SYinan Xu    ZeroExt(src1(63, 29), XLEN),
31688825c5cSYinan Xu    ZeroExt(src1(63, 30), XLEN),
31788825c5cSYinan Xu    ZeroExt(src1(63, 31), XLEN),
31888825c5cSYinan Xu    ZeroExt(src1(63, 32), XLEN)
31988825c5cSYinan Xu  ))
320a792bcf1SYinan Xu  // TODO: use decoder or other libraries to optimize timing
321a792bcf1SYinan Xu  // Now we assume shadd has the worst timing.
322675acc68SYinan Xu  addModule.io.src(0) := Mux(func(3), shaddSource(func(2, 1)),
323675acc68SYinan Xu    Mux(func(2), sraddSource(func(1, 0)),
324675acc68SYinan Xu    Mux(func(1), ZeroExt(src1(0), XLEN), wordMaskAddSource))
325a792bcf1SYinan Xu  )
326a792bcf1SYinan Xu  addModule.io.src(1) := src2
32788825c5cSYinan Xu  val add = addModule.io.add
328ee8ff153Szfw
329675acc68SYinan Xu  // sub
330184a1958Szfw  val sub  = subModule.io.sub
3312bd5334dSYinan Xu  subModule.io.src(0) := src1
3322bd5334dSYinan Xu  subModule.io.src(1) := src2
3337b441e5eSYinan Xu  val sltu    = !sub(XLEN)
334675acc68SYinan Xu  val slt     = src1(XLEN - 1) ^ src2(XLEN - 1) ^ sltu
335ee8ff153Szfw  val maxMin  = Mux(slt ^ func(0), src2, src1)
3367b441e5eSYinan Xu  val maxMinU = Mux(sltu ^ func(0), src2, src1)
337675acc68SYinan Xu  val compareRes = Mux(func(2), Mux(func(1), maxMin, maxMinU), Mux(func(1), slt, Mux(func(0), sltu, sub)))
338ee8ff153Szfw
339675acc68SYinan Xu  // logic
340675acc68SYinan Xu  val logicSrc2 = Mux(!func(5) && func(0), ~src2, src2)
341675acc68SYinan Xu  val and     = src1 & logicSrc2
342675acc68SYinan Xu  val or      = src1 | logicSrc2
343675acc68SYinan Xu  val xor     = src1 ^ logicSrc2
34473be64b3SJiawei Lin  val orcb    = Cat((0 until 8).map(i => Fill(8, src1(i * 8 + 7, i * 8).orR)).reverse)
345675acc68SYinan Xu  val orh48   = Cat(src1(63, 8), 0.U(8.W)) | src2
346675acc68SYinan Xu
347675acc68SYinan Xu  val sextb = SignExt(src1(7, 0), XLEN)
348675acc68SYinan Xu  val packh = Cat(src2(7,0), src1(7,0))
349675acc68SYinan Xu  val sexth = SignExt(src1(15, 0), XLEN)
350675acc68SYinan Xu  val packw = SignExt(Cat(src2(15, 0), src1(15, 0)), XLEN)
351675acc68SYinan Xu
35273be64b3SJiawei Lin  val revb = Cat((0 until 8).map(i => Reverse(src1(8 * i + 7, 8 * i))).reverse)
353675acc68SYinan Xu  val pack = Cat(src2(31, 0), src1(31, 0))
354675acc68SYinan Xu  val rev8 = Cat((0 until 8).map(i => src1(8 * i + 7, 8 * i)))
355675acc68SYinan Xu
356ee8ff153Szfw
357184a1958Szfw  // Result Select
358184a1958Szfw  val shiftResSel = Module(new ShiftResultSelect)
359675acc68SYinan Xu  shiftResSel.io.func := func(3, 0)
360184a1958Szfw  shiftResSel.io.sll  := sll
361184a1958Szfw  shiftResSel.io.srl  := srl
362184a1958Szfw  shiftResSel.io.sra  := sra
36328c18878Szfw  shiftResSel.io.rol  := rol
36428c18878Szfw  shiftResSel.io.ror  := ror
365184a1958Szfw  shiftResSel.io.bclr := bclr
366184a1958Szfw  shiftResSel.io.binv := binv
367184a1958Szfw  shiftResSel.io.bset := bset
368184a1958Szfw  shiftResSel.io.bext := bext
369184a1958Szfw  val shiftRes = shiftResSel.io.shiftRes
37031ea8750SLinJiawei
37131ea8750SLinJiawei  val miscResSel = Module(new MiscResultSelect)
372675acc68SYinan Xu  miscResSel.io.func    := func(5, 0)
373ee8ff153Szfw  miscResSel.io.and     := and
374ee8ff153Szfw  miscResSel.io.or      := or
375ee8ff153Szfw  miscResSel.io.xor     := xor
376675acc68SYinan Xu  miscResSel.io.orcb    := orcb
37788825c5cSYinan Xu  miscResSel.io.orh48   := orh48
378ee8ff153Szfw  miscResSel.io.sextb   := sextb
379675acc68SYinan Xu  miscResSel.io.packh   := packh
380ee8ff153Szfw  miscResSel.io.sexth   := sexth
381675acc68SYinan Xu  miscResSel.io.packw   := packw
382675acc68SYinan Xu  miscResSel.io.revb    := revb
383ee8ff153Szfw  miscResSel.io.rev8    := rev8
384675acc68SYinan Xu  miscResSel.io.pack    := pack
38588825c5cSYinan Xu  miscResSel.io.src     := src1
38631ea8750SLinJiawei  val miscRes = miscResSel.io.miscRes
38731ea8750SLinJiawei
388184a1958Szfw  val wordResSel = Module(new WordResultSelect)
389184a1958Szfw  wordResSel.io.func := func
390184a1958Szfw  wordResSel.io.addw := addw
391184a1958Szfw  wordResSel.io.subw := subw
392184a1958Szfw  wordResSel.io.sllw := sllw
393184a1958Szfw  wordResSel.io.srlw := srlw
394184a1958Szfw  wordResSel.io.sraw := sraw
39528c18878Szfw  wordResSel.io.rolw := rolw
39628c18878Szfw  wordResSel.io.rorw := rorw
397184a1958Szfw  val wordRes = wordResSel.io.wordRes
398ee8ff153Szfw
39931ea8750SLinJiawei  val aluResSel = Module(new AluResSel)
4004aa9ed34Sfdy  aluResSel.io.func := func(7, 4)
401184a1958Szfw  aluResSel.io.addRes := add
402184a1958Szfw  aluResSel.io.compareRes := compareRes
403ee8ff153Szfw  aluResSel.io.shiftRes := shiftRes
40431ea8750SLinJiawei  aluResSel.io.miscRes := miscRes
405184a1958Szfw  aluResSel.io.wordRes := wordRes
4064aa9ed34Sfdy  aluResSel.io.vsetRes := vsetModule.io.res
40731ea8750SLinJiawei  val aluRes = aluResSel.io.aluRes
408e18c367fSLinJiawei
409e2203130SLinJiawei  io.result := aluRes
410e2203130SLinJiawei}
411e2203130SLinJiawei
412adb5df20SYinan Xuclass Alu(implicit p: Parameters) extends FUWithRedirect {
413e2203130SLinJiawei
414675acc68SYinan Xu  val uop = io.in.bits.uop
415e2203130SLinJiawei
416e2203130SLinJiawei  val dataModule = Module(new AluDataModule)
417*3a6ab23aSczw  val bru = Module(new Branch()(p))
418*3a6ab23aSczw
419*3a6ab23aSczw  bru.io.in <> io.in
420*3a6ab23aSczw  bru.io.in.bits.uop <> io.in.bits.uop
421*3a6ab23aSczw  bru.io.redirectIn <> io.redirectIn
422*3a6ab23aSczw  bru.io.out.ready := io.out.ready
423e2203130SLinJiawei
424675acc68SYinan Xu  dataModule.io.src := io.in.bits.src.take(2)
425675acc68SYinan Xu  dataModule.io.func := io.in.bits.uop.ctrl.fuOpType
4264aa9ed34Sfdy  dataModule.io.lsrc0 := uop.ctrl.lsrc(0)
4274aa9ed34Sfdy  dataModule.io.ldest := uop.ctrl.ldest
4284aa9ed34Sfdy  dataModule.io.vconfig := uop.ctrl.vconfig
429e2203130SLinJiawei
430*3a6ab23aSczw  redirectOutValid := bru.redirectOutValid
431*3a6ab23aSczw  redirectOut <> bru.redirectOut
432151e3043SLinJiawei
433e18c367fSLinJiawei  io.in.ready := io.out.ready
434675acc68SYinan Xu  io.out.valid := io.in.valid
435e18c367fSLinJiawei  io.out.bits.uop <> io.in.bits.uop
436e2203130SLinJiawei  io.out.bits.data := dataModule.io.result
437e18c367fSLinJiawei}
438