tilelink: enhance trivial arbiters to reduce to nothing

This commit is contained in:
Wesley W. Terpstra 2018-10-02 12:52:27 -07:00
parent d3bc1341aa
commit d898b3662e
2 changed files with 6 additions and 9 deletions

View File

@ -42,6 +42,8 @@ object TLArbiter
def apply[T <: Data](policy: Policy)(sink: DecoupledIO[T], sources: (UInt, DecoupledIO[T])*) { def apply[T <: Data](policy: Policy)(sink: DecoupledIO[T], sources: (UInt, DecoupledIO[T])*) {
if (sources.isEmpty) { if (sources.isEmpty) {
sink.valid := Bool(false) sink.valid := Bool(false)
} else if (sources.size == 1) {
sink <> sources.head._2
} else { } else {
val pairs = sources.toList val pairs = sources.toList
val beatsIn = pairs.map(_._1) val beatsIn = pairs.map(_._1)
@ -77,15 +79,10 @@ object TLArbiter
val muxState = Mux(idle, winner, state) val muxState = Mux(idle, winner, state)
state := muxState state := muxState
if (sources.size > 1) { val allowed = Mux(idle, readys, state)
val allowed = Mux(idle, readys, state) (sourcesIn zip allowed) foreach { case (s, r) =>
(sourcesIn zip allowed) foreach { case (s, r) => s.ready := sink.ready && r
s.ready := sink.ready && r
}
} else {
sourcesIn(0).ready := sink.ready
} }
sink.valid := Mux(idle, valids.reduce(_||_), Mux1H(state, valids)) sink.valid := Mux(idle, valids.reduce(_||_), Mux1H(state, valids))
sink.bits := Mux1H(muxState, sourcesIn.map(_.bits)) sink.bits := Mux1H(muxState, sourcesIn.map(_.bits))
} }

View File

@ -242,7 +242,7 @@ object TLXbar
val filtered = Wire(Vec(select.size, input)) val filtered = Wire(Vec(select.size, input))
for (i <- 0 until select.size) { for (i <- 0 until select.size) {
filtered(i).bits := (if (force.lift(i).getOrElse(false)) IdentityModule(input.bits) else input.bits) filtered(i).bits := (if (force.lift(i).getOrElse(false)) IdentityModule(input.bits) else input.bits)
filtered(i).valid := input.valid && select(i) filtered(i).valid := input.valid && (select(i) || Bool(select.size == 1))
} }
input.ready := Mux1H(select, filtered.map(_.ready)) input.ready := Mux1H(select, filtered.map(_.ready))
filtered filtered