1
0
mirror of https://github.com/antonblanchard/chiselwatt.git synced 2026-04-19 01:18:05 +00:00
Files
antonblanchard.chiselwatt/src/main/scala/SimpleMultiplier.scala
Anton Blanchard f138ab7c7c Initial import
2020-01-30 05:20:07 +11:00

80 lines
1.7 KiB
Scala

import chisel3._
import chisel3.util.{Valid, Decoupled}
import Helpers._
class MultiplierInput(val bits: Int) extends Bundle {
val a = UInt(bits.W)
val b = UInt(bits.W)
val is32bit = Bool()
val signed = Bool()
val high = Bool()
}
class SimpleMultiplier(val bits: Int) extends Module {
val io = IO(new Bundle {
val in = Flipped(Decoupled(new MultiplierInput(bits)))
val out = Output(Valid(UInt(bits.W)))
})
val a = Reg(UInt((2*bits).W))
val b = Reg(UInt((2*bits).W))
val is32bit = Reg(Bool())
val high = Reg(Bool())
val res = Reg(UInt((2*bits).W))
val busy = RegInit(false.B)
io.in.ready := !busy
when (io.in.valid && !busy) {
when (io.in.bits.is32bit) {
when (io.in.bits.signed) {
a := io.in.bits.a.signExtend(32, 2*bits)
b := io.in.bits.b.signExtend(32, 2*bits)
} .otherwise {
a := io.in.bits.a(31, 0)
b := io.in.bits.b(31, 0)
}
} .otherwise {
when (io.in.bits.signed) {
a := io.in.bits.a.signExtend(64, 2*bits)
b := io.in.bits.b.signExtend(64, 2*bits)
} .otherwise {
a := io.in.bits.a
b := io.in.bits.b
}
}
is32bit := io.in.bits.is32bit
high := io.in.bits.high
res := 0.U
busy := true.B
}
when (busy) {
when (a(0) === 1.U) {
res := res + b
}
b := b << 1
a := a >> 1
}
io.out.bits := res
when (high) {
when (is32bit) {
io.out.bits := res(63, 32) ## res(63, 32)
} .otherwise {
io.out.bits := res(127, 64)
}
}
io.out.valid := (a === 0.U) && busy
when (io.out.valid) {
busy := false.B
}
}
object SimpleMultiplierObj extends App {
chisel3.Driver.execute(Array[String](), () => new SimpleMultiplier(64))
}