xref: /XiangShan/src/main/scala/xiangshan/backend/fu/wrapper/DivUnit.scala (revision 2d12882c44bc634571590c140ebfe61457380501)
1730cfbc0SXuan Hupackage xiangshan.backend.fu.wrapper
2730cfbc0SXuan Hu
383ba63b3SXuan Huimport org.chipsalliance.cde.config.Parameters
4730cfbc0SXuan Huimport chisel3._
5730cfbc0SXuan Huimport chisel3.util.RegEnable
6730cfbc0SXuan Huimport utility.{SignExt, ZeroExt}
7730cfbc0SXuan Huimport xiangshan.DIVOpType
8730cfbc0SXuan Huimport xiangshan.backend.fu.{FuncUnit, MulDivCtrl, SRT16DividerDataModule}
9730cfbc0SXuan Huimport xiangshan.backend.fu.FuConfig
10730cfbc0SXuan Hu
11730cfbc0SXuan Huclass DivUnit(cfg: FuConfig)(implicit p: Parameters) extends FuncUnit(cfg) {
12730cfbc0SXuan Hu
13*2d12882cSxiaofeibao  val xlen = cfg.destDataBits
14730cfbc0SXuan Hu
156a35d972SXuan Hu  val func = io.in.bits.ctrl.fuOpType
16730cfbc0SXuan Hu  val ctrl = Wire(new MulDivCtrl)
17730cfbc0SXuan Hu  ctrl.isW := DIVOpType.isW(func)
18730cfbc0SXuan Hu  ctrl.isHi := DIVOpType.isH(func)
19730cfbc0SXuan Hu  ctrl.sign := DIVOpType.isSign(func)
20730cfbc0SXuan Hu
21730cfbc0SXuan Hu  val divInputCvtFunc: UInt => UInt = (x: UInt) => Mux(
22730cfbc0SXuan Hu    ctrl.isW,
23730cfbc0SXuan Hu    Mux(ctrl.sign,
24730cfbc0SXuan Hu      SignExt(x(31, 0), xlen),
25730cfbc0SXuan Hu      ZeroExt(x(31, 0), xlen)
26730cfbc0SXuan Hu    ),
27730cfbc0SXuan Hu    x
28730cfbc0SXuan Hu  )
29730cfbc0SXuan Hu
306a35d972SXuan Hu  val robIdxReg = RegEnable(io.in.bits.ctrl.robIdx, io.in.fire)
31730cfbc0SXuan Hu  val ctrlReg = RegEnable(ctrl, io.in.fire)
32730cfbc0SXuan Hu
33*2d12882cSxiaofeibao  val divDataModule = Module(new SRT16DividerDataModule(cfg.destDataBits))
34730cfbc0SXuan Hu
356a35d972SXuan Hu  val kill_w = io.in.bits.ctrl.robIdx.needFlush(io.flush)
36730cfbc0SXuan Hu  val kill_r = !divDataModule.io.in_ready && robIdxReg.needFlush(io.flush)
37730cfbc0SXuan Hu
38730cfbc0SXuan Hu  divDataModule.io.valid := io.in.valid
396a35d972SXuan Hu  divDataModule.io.src(0) := divInputCvtFunc(io.in.bits.data.src(0))
406a35d972SXuan Hu  divDataModule.io.src(1) := divInputCvtFunc(io.in.bits.data.src(1))
41730cfbc0SXuan Hu  divDataModule.io.sign := ctrl.sign
42730cfbc0SXuan Hu  divDataModule.io.kill_w := kill_w
43730cfbc0SXuan Hu  divDataModule.io.kill_r := kill_r
44730cfbc0SXuan Hu  divDataModule.io.isHi := ctrlReg.isHi
45730cfbc0SXuan Hu  divDataModule.io.isW := ctrlReg.isW
46730cfbc0SXuan Hu  divDataModule.io.out_ready := io.out.ready
47730cfbc0SXuan Hu
48730cfbc0SXuan Hu  val validNext = divDataModule.io.out_validNext // if high, io.valid will assert next cycle
49730cfbc0SXuan Hu
50730cfbc0SXuan Hu  io.in.ready := divDataModule.io.in_ready
51730cfbc0SXuan Hu  io.out.valid := divDataModule.io.out_valid
526a35d972SXuan Hu  io.out.bits.res.data := divDataModule.io.out_data
53730cfbc0SXuan Hu  connectNonPipedCtrlSingal
54730cfbc0SXuan Hu}
55