2014-09-12 15:31:38 -07:00
|
|
|
// See LICENSE for license details.
|
|
|
|
|
2013-07-24 23:22:36 -07:00
|
|
|
package uncore
|
|
|
|
import Chisel._
|
2015-10-21 18:16:44 -07:00
|
|
|
import cde.{Parameters, Field}
|
2013-07-24 23:22:36 -07:00
|
|
|
|
2014-08-08 12:21:57 -07:00
|
|
|
case object LNEndpoints extends Field[Int]
|
2015-03-24 02:06:53 -07:00
|
|
|
case object LNHeaderBits extends Field[Int]
|
2013-07-24 23:22:36 -07:00
|
|
|
|
2014-08-08 12:21:57 -07:00
|
|
|
class PhysicalHeader(n: Int) extends Bundle {
|
|
|
|
val src = UInt(width = log2Up(n))
|
|
|
|
val dst = UInt(width = log2Up(n))
|
2013-07-24 23:22:36 -07:00
|
|
|
}
|
|
|
|
|
2014-08-08 12:21:57 -07:00
|
|
|
class PhysicalNetworkIO[T <: Data](n: Int, dType: T) extends Bundle {
|
|
|
|
val header = new PhysicalHeader(n)
|
2015-08-05 16:47:49 -07:00
|
|
|
val payload = dType.cloneType
|
2015-07-15 18:06:27 -07:00
|
|
|
override def cloneType = new PhysicalNetworkIO(n,dType).asInstanceOf[this.type]
|
2013-07-24 23:22:36 -07:00
|
|
|
}
|
|
|
|
|
2014-08-08 12:21:57 -07:00
|
|
|
class BasicCrossbarIO[T <: Data](n: Int, dType: T) extends Bundle {
|
2016-05-26 16:10:42 -07:00
|
|
|
val in = Vec(n, Decoupled(new PhysicalNetworkIO(n,dType))).flip
|
|
|
|
val out = Vec(n, Decoupled(new PhysicalNetworkIO(n,dType)))
|
2014-01-21 12:20:55 -08:00
|
|
|
}
|
2013-07-24 23:22:36 -07:00
|
|
|
|
2014-08-08 12:21:57 -07:00
|
|
|
abstract class PhysicalNetwork extends Module
|
|
|
|
|
2016-05-26 16:10:42 -07:00
|
|
|
case class CrossbarConfig[T <: Data](n: Int, dType: T, count: Int = 1, needsLock: Option[PhysicalNetworkIO[T] => Bool] = None)
|
2014-08-08 12:21:57 -07:00
|
|
|
|
2016-05-26 16:10:42 -07:00
|
|
|
abstract class AbstractCrossbar[T <: Data](conf: CrossbarConfig[T]) extends PhysicalNetwork {
|
|
|
|
val io = new BasicCrossbarIO(conf.n, conf.dType)
|
|
|
|
}
|
|
|
|
|
|
|
|
class BasicBus[T <: Data](conf: CrossbarConfig[T]) extends AbstractCrossbar(conf) {
|
|
|
|
val arb = Module(new LockingRRArbiter(io.in(0).bits, conf.n, conf.count, conf.needsLock))
|
|
|
|
arb.io.in <> io.in
|
|
|
|
|
|
|
|
arb.io.out.ready := io.out(arb.io.out.bits.header.dst).ready
|
|
|
|
for ((out, i) <- io.out zipWithIndex) {
|
|
|
|
out.valid := arb.io.out.valid && arb.io.out.bits.header.dst === UInt(i)
|
|
|
|
out.bits := arb.io.out.bits
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
class BasicCrossbar[T <: Data](conf: CrossbarConfig[T]) extends AbstractCrossbar(conf) {
|
2016-04-01 13:27:50 -07:00
|
|
|
io.in.foreach { _.ready := Bool(false) }
|
2013-07-24 23:22:36 -07:00
|
|
|
|
2016-04-01 13:27:50 -07:00
|
|
|
io.out.zipWithIndex.map{ case (out, i) => {
|
2016-05-26 16:10:42 -07:00
|
|
|
val rrarb = Module(new LockingRRArbiter(io.in(0).bits, conf.n, conf.count, conf.needsLock))
|
2016-04-01 13:27:50 -07:00
|
|
|
(rrarb.io.in, io.in).zipped.map{ case (arb, in) => {
|
|
|
|
val destined = in.bits.header.dst === UInt(i)
|
|
|
|
arb.valid := in.valid && destined
|
2013-07-24 23:22:36 -07:00
|
|
|
arb.bits := in.bits
|
2016-04-01 13:27:50 -07:00
|
|
|
when (arb.ready && destined) { in.ready := Bool(true) }
|
2013-07-24 23:22:36 -07:00
|
|
|
}}
|
|
|
|
out <> rrarb.io.out
|
|
|
|
}}
|
|
|
|
}
|
|
|
|
|
2014-08-08 12:21:57 -07:00
|
|
|
abstract class LogicalNetwork extends Module
|
2014-01-21 12:20:55 -08:00
|
|
|
|
2015-10-05 21:41:46 -07:00
|
|
|
class LogicalHeader(implicit p: Parameters) extends junctions.ParameterizedBundle()(p) {
|
|
|
|
val src = UInt(width = p(LNHeaderBits))
|
|
|
|
val dst = UInt(width = p(LNHeaderBits))
|
2013-07-24 23:22:36 -07:00
|
|
|
}
|
|
|
|
|
2015-10-05 21:41:46 -07:00
|
|
|
class LogicalNetworkIO[T <: Data](dType: T)(implicit p: Parameters) extends Bundle {
|
2014-03-29 10:53:49 -07:00
|
|
|
val header = new LogicalHeader
|
2015-07-15 18:06:27 -07:00
|
|
|
val payload = dType.cloneType
|
2015-10-05 21:41:46 -07:00
|
|
|
override def cloneType = new LogicalNetworkIO(dType)(p).asInstanceOf[this.type]
|
2014-03-29 10:53:49 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
object DecoupledLogicalNetworkIOWrapper {
|
2015-04-27 16:59:30 -07:00
|
|
|
def apply[T <: Data](
|
2015-10-05 21:41:46 -07:00
|
|
|
in: DecoupledIO[T],
|
|
|
|
src: UInt = UInt(0),
|
|
|
|
dst: UInt = UInt(0))
|
|
|
|
(implicit p: Parameters): DecoupledIO[LogicalNetworkIO[T]] = {
|
2015-07-23 14:58:46 -07:00
|
|
|
val out = Wire(Decoupled(new LogicalNetworkIO(in.bits)))
|
2013-08-13 17:52:53 -07:00
|
|
|
out.valid := in.valid
|
|
|
|
out.bits.payload := in.bits
|
|
|
|
out.bits.header.dst := dst
|
|
|
|
out.bits.header.src := src
|
|
|
|
in.ready := out.ready
|
|
|
|
out
|
2013-07-24 23:22:36 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-03-29 10:53:49 -07:00
|
|
|
object DecoupledLogicalNetworkIOUnwrapper {
|
2015-10-05 21:41:46 -07:00
|
|
|
def apply[T <: Data](in: DecoupledIO[LogicalNetworkIO[T]])
|
|
|
|
(implicit p: Parameters): DecoupledIO[T] = {
|
2015-07-15 20:24:03 -07:00
|
|
|
val out = Wire(Decoupled(in.bits.payload))
|
2013-08-13 17:52:53 -07:00
|
|
|
out.valid := in.valid
|
|
|
|
out.bits := in.bits.payload
|
|
|
|
in.ready := out.ready
|
|
|
|
out
|
2013-07-24 23:22:36 -07:00
|
|
|
}
|
|
|
|
}
|
2015-04-27 16:59:30 -07:00
|
|
|
|
|
|
|
object DefaultFromPhysicalShim {
|
2015-10-05 21:41:46 -07:00
|
|
|
def apply[T <: Data](in: DecoupledIO[PhysicalNetworkIO[T]])
|
|
|
|
(implicit p: Parameters): DecoupledIO[LogicalNetworkIO[T]] = {
|
2015-07-23 14:58:46 -07:00
|
|
|
val out = Wire(Decoupled(new LogicalNetworkIO(in.bits.payload)))
|
2015-04-27 16:59:30 -07:00
|
|
|
out.bits.header := in.bits.header
|
|
|
|
out.bits.payload := in.bits.payload
|
|
|
|
out.valid := in.valid
|
|
|
|
in.ready := out.ready
|
|
|
|
out
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
object DefaultToPhysicalShim {
|
2015-10-05 21:41:46 -07:00
|
|
|
def apply[T <: Data](n: Int, in: DecoupledIO[LogicalNetworkIO[T]])
|
|
|
|
(implicit p: Parameters): DecoupledIO[PhysicalNetworkIO[T]] = {
|
2015-07-23 14:58:46 -07:00
|
|
|
val out = Wire(Decoupled(new PhysicalNetworkIO(n, in.bits.payload)))
|
2015-04-27 16:59:30 -07:00
|
|
|
out.bits.header := in.bits.header
|
|
|
|
out.bits.payload := in.bits.payload
|
|
|
|
out.valid := in.valid
|
|
|
|
in.ready := out.ready
|
|
|
|
out
|
|
|
|
}
|
|
|
|
}
|