1cafb3558SLinJiaweipackage xiangshan.backend.fu 2cafb3558SLinJiawei 3cafb3558SLinJiaweiimport chisel3._ 4cafb3558SLinJiaweiimport chisel3.util._ 5cafb3558SLinJiaweiimport xiangshan._ 6b9fd1892SLinJiaweiimport utils._ 7cafb3558SLinJiaweiimport xiangshan.backend._ 8cafb3558SLinJiaweiimport xiangshan.backend.fu.FunctionUnit._ 9cafb3558SLinJiawei 10cafb3558SLinJiaweiclass MulDivCtrl extends Bundle{ 11cafb3558SLinJiawei val sign = Bool() 12cafb3558SLinJiawei val isW = Bool() 13cafb3558SLinJiawei val isHi = Bool() // return hi bits of result ? 14cafb3558SLinJiawei} 15cafb3558SLinJiawei 16*e18c367fSLinJiaweiclass ArrayMultiplier(len: Int, latency: Int = 3) 17*e18c367fSLinJiawei extends FunctionUnit( 18*e18c367fSLinJiawei FuConfig(FuType.mul, 2, 0, writeIntRf = true, writeFpRf = false, hasRedirect = false, CertainLatency(latency)), 19*e18c367fSLinJiawei len 20*e18c367fSLinJiawei ) 21*e18c367fSLinJiawei with HasPipelineReg 2212bb47ddSLinJiawei{ 23*e18c367fSLinJiawei val ctrl = IO(Input(new MulDivCtrl)) 243142d695SLinJiawei 253142d695SLinJiawei val (src1, src2) = (io.in.bits.src(0), io.in.bits.src(1)) 26cafb3558SLinJiawei 273142d695SLinJiawei val mulRes = src1.asSInt() * src2.asSInt() 28cafb3558SLinJiawei 29cafb3558SLinJiawei var dataVec = Seq(mulRes.asUInt()) 30*e18c367fSLinJiawei var ctrlVec = Seq(ctrl) 31cafb3558SLinJiawei 32cafb3558SLinJiawei for(i <- 1 to latency){ 33cafb3558SLinJiawei dataVec = dataVec :+ PipelineReg(i)(dataVec(i-1)) 343142d695SLinJiawei ctrlVec = ctrlVec :+ PipelineReg(i)(ctrlVec(i-1)) 35cafb3558SLinJiawei } 36cafb3558SLinJiawei 37cafb3558SLinJiawei val xlen = io.out.bits.data.getWidth 38cafb3558SLinJiawei val res = Mux(ctrlVec.last.isHi, dataVec.last(2*xlen-1, xlen), dataVec.last(xlen-1,0)) 39cafb3558SLinJiawei io.out.bits.data := Mux(ctrlVec.last.isW, SignExt(res(31,0),xlen), res) 40cafb3558SLinJiawei 41*e18c367fSLinJiawei XSDebug(p"validVec:${Binary(Cat(validVec))} flushVec:${Binary(Cat(flushVec))}\n") 42cafb3558SLinJiawei}