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