From ec056535dc678d9997444c08fcc8f97f1d60b5c1 Mon Sep 17 00:00:00 2001 From: Henry Cook Date: Wed, 11 Oct 2017 12:44:23 -0700 Subject: [PATCH] tilelink: add DeadlockDevice --- src/main/scala/devices/tilelink/Error.scala | 34 ++++++++++++++++----- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/src/main/scala/devices/tilelink/Error.scala b/src/main/scala/devices/tilelink/Error.scala index cdbb95e0..3c9131bc 100644 --- a/src/main/scala/devices/tilelink/Error.scala +++ b/src/main/scala/devices/tilelink/Error.scala @@ -13,17 +13,13 @@ import scala.math.min case class ErrorParams(address: Seq[AddressSet], maxTransfer: Int = 4096) case object ErrorParams extends Field[ErrorParams] -/** Adds a /dev/null slave that generates TL error response messages */ -class TLError(params: ErrorParams, beatBytes: Int = 4)(implicit p: Parameters) extends LazyModule -{ - val address = params.address - - val device = new SimpleDevice("error-device", Seq("sifive,error0")) - +abstract class DevNullDevice(params: ErrorParams, beatBytes: Int = 4) + (device: SimpleDevice) + (implicit p: Parameters) extends LazyModule { val xfer = TransferSizes(1, params.maxTransfer) val node = TLManagerNode(Seq(TLManagerPortParameters( Seq(TLManagerParameters( - address = address, + address = params.address, resources = device.reg("mem"), regionType = RegionType.UNCACHED, supportsAcquireT = xfer, @@ -38,7 +34,12 @@ class TLError(params: ErrorParams, beatBytes: Int = 4)(implicit p: Parameters) e beatBytes = beatBytes, endSinkId = 1, // can receive GrantAck minLatency = 1))) // no bypass needed for this device +} +/** Adds a /dev/null slave that generates TL error response messages */ +class TLError(params: ErrorParams, beatBytes: Int = 4)(implicit p: Parameters) + extends DevNullDevice(params, beatBytes)(new SimpleDevice("error-device", Seq("sifive,error0"))) +{ lazy val module = new LazyModuleImp(this) { import TLMessages._ import TLPermissions._ @@ -88,6 +89,23 @@ class TLError(params: ErrorParams, beatBytes: Int = 4)(implicit p: Parameters) e } } +/** Adds a /dev/null slave that does not raise ready for any incoming traffic. + * !!! WARNING: This device WILL cause your bus to deadlock for as long as you + * continue to send traffic to it !!! + */ +class DeadlockDevice(params: ErrorParams, beatBytes: Int = 4)(implicit p: Parameters) + extends DevNullDevice(params, beatBytes)(new SimpleDevice("deadlock-device", Seq("sifive,deadlock0"))) +{ + lazy val module = new LazyModuleImp(this) { + val (in, _) = node.in(0) + in.a.ready := Bool(false) + in.b.valid := Bool(false) + in.c.ready := Bool(false) + in.d.valid := Bool(false) + in.e.ready := Bool(false) + } +} + trait HasSystemErrorSlave extends HasSystemBus { private val params = p(ErrorParams) val error = LazyModule(new TLError(params, sbus.beatBytes))