diff --git a/src/main/scala/uncore/axi4/Buffer.scala b/src/main/scala/uncore/axi4/Buffer.scala index ee3304dd..1658e8b0 100644 --- a/src/main/scala/uncore/axi4/Buffer.scala +++ b/src/main/scala/uncore/axi4/Buffer.scala @@ -4,22 +4,26 @@ package uncore.axi4 import Chisel._ import chisel3.internal.sourceinfo.SourceInfo +import chisel3.util.IrrevocableIO import config._ import diplomacy._ import scala.math.{min,max} // pipe is only used if a queue has depth = 1 -class AXI4Buffer(aw: Int = 2, w: Int = 2, b: Int = 2, ar: Int = 2, r: Int = 2, pipe: Boolean = true)(implicit p: Parameters) extends LazyModule +class AXI4Buffer( + aw: BufferParams, + w: BufferParams, + b: BufferParams, + ar: BufferParams, + r: BufferParams)(implicit p: Parameters) extends LazyModule { - require (aw >= 0) - require (w >= 0) - require (b >= 0) - require (ar >= 0) - require (r >= 0) + def this(aw: BufferParams, br: BufferParams)(implicit p: Parameters) = this(aw, aw, br, aw, br) + def this(x: BufferParams)(implicit p: Parameters) = this(x, x) + def this()(implicit p: Parameters) = this(BufferParams.default) val node = AXI4AdapterNode( masterFn = { p => p }, - slaveFn = { p => p.copy(minLatency = p.minLatency + min(1,min(aw,ar)) + min(1,min(r,b))) }) + slaveFn = { p => p.copy(minLatency = p.minLatency + min(aw.latency,ar.latency) + min(r.latency,b.latency)) }) lazy val module = new LazyModuleImp(this) { val io = new Bundle { @@ -27,12 +31,20 @@ class AXI4Buffer(aw: Int = 2, w: Int = 2, b: Int = 2, ar: Int = 2, r: Int = 2, p val out = node.bundleOut } + def buffer[T <: Data](config: BufferParams, data: IrrevocableIO[T]): IrrevocableIO[T] = { + if (config.isDefined) { + Queue.irrevocable(data, config.depth, pipe=config.pipe, flow=config.flow) + } else { + data + } + } + ((io.in zip io.out) zip (node.edgesIn zip node.edgesOut)) foreach { case ((in, out), (edgeIn, edgeOut)) => - if (aw>0) { out.aw <> Queue(in .aw, aw, pipe && aw<2) } else { out.aw <> in .aw } - if (w >0) { out.w <> Queue(in .w, w, pipe && w <2) } else { out.w <> in .w } - if (b >0) { in .b <> Queue(out.b, b, pipe && b <2) } else { in .b <> out.b } - if (ar>0) { out.ar <> Queue(in .ar, ar, pipe && ar<2) } else { out.ar <> in .ar } - if (r >0) { in .r <> Queue(out.r, r, pipe && r <2) } else { in .r <> out.r } + out.aw <> buffer(aw, in .aw) + out.w <> buffer(w, in .w) + in .b <> buffer(b, out.b) + out.ar <> buffer(ar, in .ar) + in .r <> buffer(r, out.r) } } } @@ -40,13 +52,16 @@ class AXI4Buffer(aw: Int = 2, w: Int = 2, b: Int = 2, ar: Int = 2, r: Int = 2, p object AXI4Buffer { // applied to the AXI4 source node; y.node := AXI4Buffer(x.node) - def apply() (x: AXI4OutwardNode)(implicit p: Parameters, sourceInfo: SourceInfo): AXI4OutwardNode = apply(2)(x) - def apply(entries: Int) (x: AXI4OutwardNode)(implicit p: Parameters, sourceInfo: SourceInfo): AXI4OutwardNode = apply(entries, true)(x) - def apply(entries: Int, pipe: Boolean) (x: AXI4OutwardNode)(implicit p: Parameters, sourceInfo: SourceInfo): AXI4OutwardNode = apply(entries, entries, pipe)(x) - def apply(aw: Int, br: Int) (x: AXI4OutwardNode)(implicit p: Parameters, sourceInfo: SourceInfo): AXI4OutwardNode = apply(aw, br, true)(x) - def apply(aw: Int, br: Int, pipe: Boolean)(x: AXI4OutwardNode)(implicit p: Parameters, sourceInfo: SourceInfo): AXI4OutwardNode = apply(aw, aw, br, aw, br, pipe)(x) - def apply(aw: Int, w: Int, b: Int, ar: Int, r: Int, pipe: Boolean = true)(x: AXI4OutwardNode)(implicit p: Parameters, sourceInfo: SourceInfo): AXI4OutwardNode = { - val buffer = LazyModule(new AXI4Buffer(aw, w, b, ar, r, pipe)) + def apply() (x: AXI4OutwardNode)(implicit p: Parameters, sourceInfo: SourceInfo): AXI4OutwardNode = apply(BufferParams.default)(x) + def apply(z: BufferParams) (x: AXI4OutwardNode)(implicit p: Parameters, sourceInfo: SourceInfo): AXI4OutwardNode = apply(z, z)(x) + def apply(aw: BufferParams, br: BufferParams)(x: AXI4OutwardNode)(implicit p: Parameters, sourceInfo: SourceInfo): AXI4OutwardNode = apply(aw, aw, br, aw, br)(x) + def apply( + aw: BufferParams, + w: BufferParams, + b: BufferParams, + ar: BufferParams, + r: BufferParams)(x: AXI4OutwardNode)(implicit p: Parameters, sourceInfo: SourceInfo): AXI4OutwardNode = { + val buffer = LazyModule(new AXI4Buffer(aw, w, b, ar, r)) buffer.node := x buffer.node }