xref: /XiangShan/src/main/scala/xiangshan/backend/fu/Multiplier.scala (revision e18c367f538130ef8e8c577e982d5e20161011b1)
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}