1
0

coreplex: add a crossing wrapper to generalize the island pattern

This commit is contained in:
Wesley W. Terpstra 2017-10-19 18:51:22 -07:00
parent 7453186b59
commit 6bc9c9fc6c
2 changed files with 62 additions and 0 deletions

View File

@ -0,0 +1,51 @@
// See LICENSE.SiFive for license details.
package freechips.rocketchip.coreplex
import Chisel._
import freechips.rocketchip.config._
import freechips.rocketchip.diplomacy._
import freechips.rocketchip.tilelink._
trait HasCrossingHelper extends LazyScope
{
this: LazyModule =>
val crossing: CoreplexClockCrossing
def cross(x: TLCrossableNode, name: String): TLOutwardNode = {
val out = x.node.parentsOut.exists(_ eq this) // is the crossing exiting the wrapper?
crossing match {
case SynchronousCrossing(params) => {
val buffer = this { LazyModule(new TLBuffer(params)) }
buffer.suggestName(name + "SynchronousBuffer")
buffer.node := x.node
buffer.node
}
case RationalCrossing(direction) => {
def sourceGen = LazyModule(new TLRationalCrossingSource)
def sinkGen = LazyModule(new TLRationalCrossingSink(direction))
val source = if (out) this { sourceGen } else sourceGen
val sink = if (out) sinkGen else this { sinkGen }
source.suggestName(name + "RationalSource")
sink.suggestName(name + "RationalSink")
source.node := x.node
sink.node := source.node
sink.node
}
case AsynchronousCrossing(depth, sync) => {
def sourceGen = this { LazyModule(new TLAsyncCrossingSource(sync)) }
def sinkGen = LazyModule(new TLAsyncCrossingSink(depth, sync))
val source = if (out) this { sourceGen } else sourceGen
val sink = if (out) sinkGen else this { sinkGen }
source.suggestName(name + "AsynchronousSource")
sink.suggestName(name + "AsynchronousSink")
source.node := x.node
sink.node := source.node
sink.node
}
}
}
// def cross(x: IntCrossableNode, name: String): IntOutwardNode = { x.node }
}
class CrossingWrapper(val crossing: CoreplexClockCrossing)(implicit p: Parameters) extends SimpleLazyModule with HasCrossingHelper

View File

@ -0,0 +1,11 @@
// See LICENSE.SiFive for license details.
package freechips.rocketchip
import freechips.rocketchip.tilelink._
package object coreplex
{
implicit class TLCrossableNode(val node: TLOutwardNode)
implicit class IntCrossableNode(val node: IntOutwardNode)
}