diff --git a/src/main/scala/coreplex/FrontBus.scala b/src/main/scala/coreplex/FrontBus.scala index 47de22b0..79634165 100644 --- a/src/main/scala/coreplex/FrontBus.scala +++ b/src/main/scala/coreplex/FrontBus.scala @@ -23,7 +23,8 @@ class FrontBus(params: FrontBusParams)(implicit p: Parameters) extends TLBusWrap fromSyncPorts(params, buffers, name) def fromSyncPorts(params: BufferParams = BufferParams.default, buffers: Int = 1, name: Option[String] = None): TLInwardNode = { - val (in, out) = bufferChain(buffers, params, name) + require(params == BufferParams.default, "Only BufferParams.default supported for FrontBus at this time.") + val (in, out) = bufferChain(buffers, name) inwardNode :=* out in } diff --git a/src/main/scala/coreplex/SystemBus.scala b/src/main/scala/coreplex/SystemBus.scala index f1e16512..f3022731 100644 --- a/src/main/scala/coreplex/SystemBus.scala +++ b/src/main/scala/coreplex/SystemBus.scala @@ -38,7 +38,7 @@ class SystemBus(params: SystemBusParams)(implicit p: Parameters) extends TLBusWr def toSplitSlaves: TLOutwardNode = outwardSplitNode def toPeripheryBus(nBuffers: Int): TLOutwardNode = { - val (in, out) = bufferChain(nBuffers, name = Some("PeripheryBus")) + val (in, out) = bufferChain(nBuffers, name = Some("pbus")) in := pbus_fixer.node out } diff --git a/src/main/scala/tilelink/Buffer.scala b/src/main/scala/tilelink/Buffer.scala index 09b76b0a..3a8869de 100644 --- a/src/main/scala/tilelink/Buffer.scala +++ b/src/main/scala/tilelink/Buffer.scala @@ -77,3 +77,28 @@ object TLBuffer buffer.node } } + +class TLBufferChain(depth: Int)(implicit p: Parameters) extends LazyModule { + + val nodeIn = TLInputNode() + val nodeOut = TLOutputNode() + + val buf_chain = if (depth > 0) { + val chain = List.fill(depth)(LazyModule(new TLBuffer(BufferParams.default))) + + (chain.init zip chain.tail) foreach { case(prev, next) => next.node :=* prev.node } + chain + } else { + List(LazyModule(new TLBuffer(BufferParams.none))) + } + + buf_chain.head.node :=* nodeIn + nodeOut :=* buf_chain.last.node + + lazy val module = new LazyModuleImp(this) { + val io = new Bundle { + val in = nodeIn.bundleIn + val out = nodeOut.bundleOut + } + } +} diff --git a/src/main/scala/tilelink/Bus.scala b/src/main/scala/tilelink/Bus.scala index 98b07003..d9a7f364 100644 --- a/src/main/scala/tilelink/Bus.scala +++ b/src/main/scala/tilelink/Bus.scala @@ -67,17 +67,10 @@ abstract class TLBusWrapper(params: TLBusParams, val busName: String)(implicit p protected def inwardNode: TLInwardNode = xbar.node protected def inwardBufNode: TLInwardNode = master_buffer.node - protected def bufferChain(depth: Int, params: BufferParams = BufferParams.default, name: Option[String] = None): (TLInwardNode, TLOutwardNode) = { - if (depth > 0) { - val chain = List.fill(depth)(LazyModule(new TLBuffer(params))) - name.foreach { n => chain.zipWithIndex foreach { case(b, i) => b.suggestName(s"${busName}_${n}_${i}_TLBuffer") } } - (chain.init zip chain.tail) foreach { case(prev, next) => next.node :=* prev.node } - (chain.head.node, chain.last.node) - } else { - val dummy = LazyModule(new TLBuffer(BufferParams.none)) - name.foreach { n => dummy.suggestName(s"${busName}_${n}_empty_TLBuffer")} - (dummy.node, dummy.node) - } + protected def bufferChain(depth: Int, name: Option[String] = None): (TLInwardNode, TLOutwardNode) = { + val chain = LazyModule(new TLBufferChain(depth)) + name.foreach { n => chain.suggestName(s"${busName}_${n}_TLBufferChain")} + (chain.nodeIn, chain.nodeOut) } def bufferFromMasters: TLInwardNode = inwardBufNode