tilelink: add DeadlockDevice
This commit is contained in:
		| @@ -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)) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user