2017-07-23 17:31:04 +02:00
|
|
|
// See LICENSE.SiFive for license details.
|
|
|
|
|
2018-01-12 21:29:27 +01:00
|
|
|
package freechips.rocketchip.subsystem
|
2017-07-23 17:31:04 +02:00
|
|
|
|
|
|
|
import Chisel._
|
|
|
|
import freechips.rocketchip.config.{Field, Parameters}
|
|
|
|
import freechips.rocketchip.diplomacy._
|
|
|
|
import freechips.rocketchip.tilelink._
|
2018-02-21 02:09:30 +01:00
|
|
|
import freechips.rocketchip.util._
|
2017-07-23 17:31:04 +02:00
|
|
|
|
|
|
|
case class PeripheryBusParams(
|
|
|
|
beatBytes: Int,
|
|
|
|
blockBytes: Int,
|
2017-07-25 09:55:55 +02:00
|
|
|
frequency: BigInt = BigInt(100000000) // 100 MHz as default bus frequency
|
2018-02-15 23:01:49 +01:00
|
|
|
) extends HasTLBusParams
|
2017-07-23 17:31:04 +02:00
|
|
|
|
2017-09-09 03:33:44 +02:00
|
|
|
case object PeripheryBusKey extends Field[PeripheryBusParams]
|
2017-07-23 17:31:04 +02:00
|
|
|
|
2018-02-15 23:01:49 +01:00
|
|
|
class PeripheryBus(params: PeripheryBusParams, val crossing: SubsystemClockCrossing = SynchronousCrossing())
|
2018-02-21 02:09:30 +01:00
|
|
|
(implicit p: Parameters) extends TLBusWrapper(params, "periphery_bus")
|
2018-02-15 23:01:49 +01:00
|
|
|
with HasTLXbarPhy
|
|
|
|
with HasCrossing {
|
|
|
|
|
|
|
|
private def bufferTo(buffer: BufferParams): TLOutwardNode =
|
|
|
|
TLBuffer(buffer) :*= delayNode :*= outwardNode
|
|
|
|
|
2018-02-17 00:58:55 +01:00
|
|
|
private def bufferTo(buffers: Int): TLOutwardNode =
|
|
|
|
TLBuffer.chain(buffers).foldRight(delayNode)(_ :*= _) :*= outwardNode
|
|
|
|
|
2018-02-15 23:01:49 +01:00
|
|
|
private def fragmentTo(minSize: Int, maxSize: Int, buffer: BufferParams): TLOutwardNode =
|
|
|
|
TLFragmenter(minSize, maxSize) :*= bufferTo(buffer)
|
|
|
|
|
|
|
|
private def fixedWidthTo(buffer: BufferParams): TLOutwardNode =
|
|
|
|
TLWidthWidget(params.beatBytes) :*= bufferTo(buffer)
|
2017-08-08 02:30:24 +02:00
|
|
|
|
2018-02-22 03:22:06 +01:00
|
|
|
def toSlave[D,U,E,B <: Data](
|
2018-02-15 23:01:49 +01:00
|
|
|
name: Option[String] = None,
|
|
|
|
buffer: BufferParams = BufferParams.none)
|
2018-02-22 03:22:06 +01:00
|
|
|
(gen: => NodeHandle[
|
|
|
|
TLClientPortParameters,TLManagerPortParameters,TLEdgeIn,TLBundle,
|
|
|
|
D,U,E,B] = TLIdentity.gen): OutwardNodeHandle[D,U,E,B] = {
|
2018-02-21 02:09:30 +01:00
|
|
|
to("slave" named name) { gen :*= bufferTo(buffer) }
|
2017-07-23 17:31:04 +02:00
|
|
|
}
|
|
|
|
|
2018-02-22 03:22:06 +01:00
|
|
|
def toVariableWidthSlave[D,U,E,B <: Data](
|
2018-02-15 23:01:49 +01:00
|
|
|
name: Option[String] = None,
|
|
|
|
buffer: BufferParams = BufferParams.none)
|
2018-02-22 03:22:06 +01:00
|
|
|
(gen: => NodeHandle[
|
|
|
|
TLClientPortParameters,TLManagerPortParameters,TLEdgeIn,TLBundle,
|
|
|
|
D,U,E,B] = TLIdentity.gen): OutwardNodeHandle[D,U,E,B] = {
|
2018-02-21 02:09:30 +01:00
|
|
|
to("slave" named name) {
|
2018-02-15 23:01:49 +01:00
|
|
|
gen :*= fragmentTo(params.beatBytes, params.blockBytes, buffer)
|
|
|
|
}
|
2017-07-23 17:31:04 +02:00
|
|
|
}
|
|
|
|
|
2018-02-22 03:22:06 +01:00
|
|
|
def toFixedWidthSlave[D,U,E,B <: Data](
|
2018-02-15 23:01:49 +01:00
|
|
|
name: Option[String] = None,
|
|
|
|
buffer: BufferParams = BufferParams.none)
|
2018-02-22 03:22:06 +01:00
|
|
|
(gen: => NodeHandle[
|
|
|
|
TLClientPortParameters,TLManagerPortParameters,TLEdgeIn,TLBundle,
|
|
|
|
D,U,E,B] = TLIdentity.gen): OutwardNodeHandle[D,U,E,B] = {
|
2018-02-21 02:09:30 +01:00
|
|
|
to("slave" named name) { gen :*= fixedWidthTo(buffer) }
|
2018-02-15 23:01:49 +01:00
|
|
|
}
|
|
|
|
|
2018-02-22 03:22:06 +01:00
|
|
|
def toFixedWidthSingleBeatSlave[D,U,E,B <: Data](
|
2018-02-15 23:01:49 +01:00
|
|
|
widthBytes: Int,
|
|
|
|
name: Option[String] = None,
|
|
|
|
buffer: BufferParams = BufferParams.none)
|
2018-02-22 03:22:06 +01:00
|
|
|
(gen: => NodeHandle[
|
|
|
|
TLClientPortParameters,TLManagerPortParameters,TLEdgeIn,TLBundle,
|
|
|
|
D,U,E,B] = TLIdentity.gen): OutwardNodeHandle[D,U,E,B] = {
|
2018-02-21 02:09:30 +01:00
|
|
|
to("slave" named name) {
|
2018-02-15 23:01:49 +01:00
|
|
|
gen :*= TLFragmenter(widthBytes, params.blockBytes) :*= fixedWidthTo(buffer)
|
|
|
|
}
|
2017-07-23 17:31:04 +02:00
|
|
|
}
|
2017-10-23 18:39:01 +02:00
|
|
|
|
2018-02-15 23:01:49 +01:00
|
|
|
def toLargeBurstSlave(
|
|
|
|
maxXferBytes: Int,
|
|
|
|
name: Option[String] = None,
|
|
|
|
buffer: BufferParams = BufferParams.none)
|
|
|
|
(gen: => TLNode): TLOutwardNode = {
|
2018-02-21 02:09:30 +01:00
|
|
|
to("slave" named name) {
|
2018-02-15 23:01:49 +01:00
|
|
|
gen :*= fragmentTo(params.beatBytes, maxXferBytes, buffer)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-02-22 03:22:06 +01:00
|
|
|
def toFixedWidthPort[D,U,E,B <: Data](
|
|
|
|
name: Option[String] = None,
|
|
|
|
buffer: BufferParams = BufferParams.none)
|
|
|
|
(gen: => NodeHandle[TLClientPortParameters,TLManagerPortParameters,TLEdgeIn,TLBundle,D,U,E,B]): OutwardNodeHandle[D,U,E,B] = {
|
|
|
|
to("port" named name) { gen := fixedWidthTo(buffer) }
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-02-15 23:01:49 +01:00
|
|
|
def fromSystemBus(
|
|
|
|
arithmetic: Boolean = true,
|
|
|
|
buffer: BufferParams = BufferParams.default)
|
|
|
|
(gen: => TLOutwardNode) {
|
2018-02-21 02:09:30 +01:00
|
|
|
from("sbus") {
|
2018-02-15 23:01:49 +01:00
|
|
|
(inwardNode
|
|
|
|
:*= TLBuffer(buffer)
|
|
|
|
:*= TLAtomicAutomata(arithmetic = arithmetic)
|
|
|
|
:*= gen)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
def fromOtherMaster(
|
|
|
|
name: Option[String] = None,
|
|
|
|
buffer: BufferParams = BufferParams.none)
|
|
|
|
(gen: => TLNode): TLInwardNode = {
|
2018-02-21 02:09:30 +01:00
|
|
|
from("master" named name) { inwardNode :*= TLBuffer(buffer) :*= gen }
|
2018-02-15 23:01:49 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-02-17 00:58:55 +01:00
|
|
|
def toTile(
|
|
|
|
name: Option[String] = None,
|
|
|
|
buffers: Int = 0)
|
|
|
|
(gen: => TLNode): TLOutwardNode = {
|
2018-02-21 02:09:30 +01:00
|
|
|
to("tile" named name) {
|
2018-02-15 23:01:49 +01:00
|
|
|
FlipRendering { implicit p =>
|
2018-02-17 00:58:55 +01:00
|
|
|
gen :*= bufferTo(buffers)
|
2017-10-23 18:39:01 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2017-07-23 17:31:04 +02:00
|
|
|
}
|