tilelink2: Monitor should report which TL connection was the problem
This commit is contained in:
		@@ -3,12 +3,19 @@
 | 
				
			|||||||
package uncore.tilelink2
 | 
					package uncore.tilelink2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import Chisel._
 | 
					import Chisel._
 | 
				
			||||||
import chisel3.internal.sourceinfo.SourceInfo
 | 
					import chisel3.internal.sourceinfo.{SourceInfo, SourceLine}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
object TLMonitor
 | 
					object TLMonitor
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					  def extra(implicit sourceInfo: SourceInfo) = {
 | 
				
			||||||
 | 
					    sourceInfo match {
 | 
				
			||||||
 | 
					      case SourceLine(filename, line, col) => s" (connected at $filename:$line:$col)"
 | 
				
			||||||
 | 
					      case _ => ""
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def legalizeFormatA(bundle: TLBundleA, edge: TLEdgeOut)(implicit sourceInfo: SourceInfo) = {
 | 
					  def legalizeFormatA(bundle: TLBundleA, edge: TLEdgeOut)(implicit sourceInfo: SourceInfo) = {
 | 
				
			||||||
    assert (TLMessages.isA(bundle.opcode), "'A' channel has invalid opcode")
 | 
					    assert (TLMessages.isA(bundle.opcode), "'A' channel has invalid opcode" + extra)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Reuse these subexpressions to save some firrtl lines
 | 
					    // Reuse these subexpressions to save some firrtl lines
 | 
				
			||||||
    val source_ok = edge.client.contains(bundle.source)
 | 
					    val source_ok = edge.client.contains(bundle.source)
 | 
				
			||||||
@@ -16,65 +23,65 @@ object TLMonitor
 | 
				
			|||||||
    val mask = edge.fullMask(bundle.address, bundle.size)
 | 
					    val mask = edge.fullMask(bundle.address, bundle.size)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    when (bundle.opcode === TLMessages.Acquire) {
 | 
					    when (bundle.opcode === TLMessages.Acquire) {
 | 
				
			||||||
      assert (edge.manager.supportsAcquire(bundle.address, bundle.size), "'A' channel carries Acquire type unsupported by manager")
 | 
					      assert (edge.manager.supportsAcquire(bundle.address, bundle.size), "'A' channel carries Acquire type unsupported by manager" + extra)
 | 
				
			||||||
      assert (source_ok, "'A' channel Acquire carries invalid source ID")
 | 
					      assert (source_ok, "'A' channel Acquire carries invalid source ID" + extra)
 | 
				
			||||||
      assert (bundle.size >= UInt(log2Ceil(edge.manager.beatBytes)), "'A' channel Acquire smaller than a beat")
 | 
					      assert (bundle.size >= UInt(log2Ceil(edge.manager.beatBytes)), "'A' channel Acquire smaller than a beat" + extra)
 | 
				
			||||||
      assert (is_aligned, "'A' channel Acquire address not aligned to size")
 | 
					      assert (is_aligned, "'A' channel Acquire address not aligned to size" + extra)
 | 
				
			||||||
      assert (TLPermissions.isGrow(bundle.param), "'A' channel Acquire carries invalid grow param")
 | 
					      assert (TLPermissions.isGrow(bundle.param), "'A' channel Acquire carries invalid grow param" + extra)
 | 
				
			||||||
      assert (bundle.mask === SInt(-1).asUInt, "'A' channel Acquire contains invalid mask")
 | 
					      assert (bundle.mask === SInt(-1).asUInt, "'A' channel Acquire contains invalid mask" + extra)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    when (bundle.opcode === TLMessages.Get) {
 | 
					    when (bundle.opcode === TLMessages.Get) {
 | 
				
			||||||
      assert (edge.manager.supportsGet(bundle.address, bundle.size), "'A' channel carries Get type unsupported by manager")
 | 
					      assert (edge.manager.supportsGet(bundle.address, bundle.size), "'A' channel carries Get type unsupported by manager" + extra)
 | 
				
			||||||
      assert (source_ok, "'A' channel Get carries invalid source ID")
 | 
					      assert (source_ok, "'A' channel Get carries invalid source ID" + extra)
 | 
				
			||||||
      assert (is_aligned, "'A' channel Get address not aligned to size")
 | 
					      assert (is_aligned, "'A' channel Get address not aligned to size" + extra)
 | 
				
			||||||
      assert (bundle.param === UInt(0), "'A' channel Get carries invalid param")
 | 
					      assert (bundle.param === UInt(0), "'A' channel Get carries invalid param" + extra)
 | 
				
			||||||
      assert (bundle.mask === mask, "'A' channel Get contains invalid mask")
 | 
					      assert (bundle.mask === mask, "'A' channel Get contains invalid mask" + extra)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    when (bundle.opcode === TLMessages.PutFullData) {
 | 
					    when (bundle.opcode === TLMessages.PutFullData) {
 | 
				
			||||||
      assert (edge.manager.supportsPutFull(bundle.address, bundle.size), "'A' channel carries PutFull type unsupported by manager")
 | 
					      assert (edge.manager.supportsPutFull(bundle.address, bundle.size), "'A' channel carries PutFull type unsupported by manager" + extra)
 | 
				
			||||||
      assert (source_ok, "'A' channel PutFull carries invalid source ID")
 | 
					      assert (source_ok, "'A' channel PutFull carries invalid source ID" + extra)
 | 
				
			||||||
      assert (is_aligned, "'A' channel PutFull address not aligned to size")
 | 
					      assert (is_aligned, "'A' channel PutFull address not aligned to size" + extra)
 | 
				
			||||||
      assert (bundle.param === UInt(0), "'A' channel PutFull carries invalid param")
 | 
					      assert (bundle.param === UInt(0), "'A' channel PutFull carries invalid param" + extra)
 | 
				
			||||||
      assert (bundle.mask === mask, "'A' channel PutFull contains invalid mask")
 | 
					      assert (bundle.mask === mask, "'A' channel PutFull contains invalid mask" + extra)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    when (bundle.opcode === TLMessages.PutPartialData) {
 | 
					    when (bundle.opcode === TLMessages.PutPartialData) {
 | 
				
			||||||
      assert (edge.manager.supportsPutPartial(bundle.address, bundle.size), "'A' channel carries PutPartial type unsupported by manager")
 | 
					      assert (edge.manager.supportsPutPartial(bundle.address, bundle.size), "'A' channel carries PutPartial type unsupported by manager" + extra)
 | 
				
			||||||
      assert (source_ok, "'A' channel PutPartial carries invalid source ID")
 | 
					      assert (source_ok, "'A' channel PutPartial carries invalid source ID" + extra)
 | 
				
			||||||
      assert (is_aligned, "'A' channel PutPartial address not aligned to size")
 | 
					      assert (is_aligned, "'A' channel PutPartial address not aligned to size" + extra)
 | 
				
			||||||
      assert (bundle.param === UInt(0), "'A' channel PutPartial carries invalid param")
 | 
					      assert (bundle.param === UInt(0), "'A' channel PutPartial carries invalid param" + extra)
 | 
				
			||||||
      assert ((bundle.mask & ~mask) === UInt(0), "'A' channel PutPartial contains invalid mask")
 | 
					      assert ((bundle.mask & ~mask) === UInt(0), "'A' channel PutPartial contains invalid mask" + extra)
 | 
				
			||||||
      assert (bundle.mask =/= UInt(0), "'A' channel PutPartial has a zero mask")
 | 
					      assert (bundle.mask =/= UInt(0), "'A' channel PutPartial has a zero mask" + extra)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    when (bundle.opcode === TLMessages.ArithmeticData) {
 | 
					    when (bundle.opcode === TLMessages.ArithmeticData) {
 | 
				
			||||||
      assert (edge.manager.supportsArithmetic(bundle.address, bundle.size), "'A' channel carries Arithmetic type unsupported by manager")
 | 
					      assert (edge.manager.supportsArithmetic(bundle.address, bundle.size), "'A' channel carries Arithmetic type unsupported by manager" + extra)
 | 
				
			||||||
      assert (source_ok, "'A' channel Arithmetic carries invalid source ID")
 | 
					      assert (source_ok, "'A' channel Arithmetic carries invalid source ID" + extra)
 | 
				
			||||||
      assert (is_aligned, "'A' channel Arithmetic address not aligned to size")
 | 
					      assert (is_aligned, "'A' channel Arithmetic address not aligned to size" + extra)
 | 
				
			||||||
      assert (TLAtomics.isArithmetic(bundle.param), "'A' channel Arithmetic carries invalid opcode param")
 | 
					      assert (TLAtomics.isArithmetic(bundle.param), "'A' channel Arithmetic carries invalid opcode param" + extra)
 | 
				
			||||||
      assert (bundle.mask === mask, "'A' channel Arithmetic contains invalid mask")
 | 
					      assert (bundle.mask === mask, "'A' channel Arithmetic contains invalid mask" + extra)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    when (bundle.opcode === TLMessages.LogicalData) {
 | 
					    when (bundle.opcode === TLMessages.LogicalData) {
 | 
				
			||||||
      assert (edge.manager.supportsLogical(bundle.address, bundle.size), "'A' channel carries Logical type unsupported by manager")
 | 
					      assert (edge.manager.supportsLogical(bundle.address, bundle.size), "'A' channel carries Logical type unsupported by manager" + extra)
 | 
				
			||||||
      assert (source_ok, "'A' channel Logical carries invalid source ID")
 | 
					      assert (source_ok, "'A' channel Logical carries invalid source ID" + extra)
 | 
				
			||||||
      assert (is_aligned, "'A' channel Logical address not aligned to size")
 | 
					      assert (is_aligned, "'A' channel Logical address not aligned to size" + extra)
 | 
				
			||||||
      assert (TLAtomics.isLogical(bundle.param), "'A' channel Logical carries invalid opcode param")
 | 
					      assert (TLAtomics.isLogical(bundle.param), "'A' channel Logical carries invalid opcode param" + extra)
 | 
				
			||||||
      assert (bundle.mask === mask, "'A' channel Logical contains invalid mask")
 | 
					      assert (bundle.mask === mask, "'A' channel Logical contains invalid mask" + extra)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    when (bundle.opcode === TLMessages.Hint) {
 | 
					    when (bundle.opcode === TLMessages.Hint) {
 | 
				
			||||||
      assert (edge.manager.supportsHint(bundle.address), "'A' channel carries Hint type unsupported by manager")
 | 
					      assert (edge.manager.supportsHint(bundle.address), "'A' channel carries Hint type unsupported by manager" + extra)
 | 
				
			||||||
      assert (source_ok, "'A' channel Hint carries invalid source ID")
 | 
					      assert (source_ok, "'A' channel Hint carries invalid source ID" + extra)
 | 
				
			||||||
      assert (is_aligned, "'A' channel Hint address not aligned to size")
 | 
					      assert (is_aligned, "'A' channel Hint address not aligned to size" + extra)
 | 
				
			||||||
      assert (bundle.mask === mask, "'A' channel Hint contains invalid mask")
 | 
					      assert (bundle.mask === mask, "'A' channel Hint contains invalid mask" + extra)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def legalizeFormatB(bundle: TLBundleB, edge: TLEdgeIn)(implicit sourceInfo: SourceInfo) = {
 | 
					  def legalizeFormatB(bundle: TLBundleB, edge: TLEdgeIn)(implicit sourceInfo: SourceInfo) = {
 | 
				
			||||||
    assert (TLMessages.isB(bundle.opcode), "'B' channel has invalid opcode")
 | 
					    assert (TLMessages.isB(bundle.opcode), "'B' channel has invalid opcode" + extra)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Reuse these subexpressions to save some firrtl lines
 | 
					    // Reuse these subexpressions to save some firrtl lines
 | 
				
			||||||
    val address_ok = edge.manager.contains(bundle.source)
 | 
					    val address_ok = edge.manager.contains(bundle.source)
 | 
				
			||||||
@@ -82,182 +89,182 @@ object TLMonitor
 | 
				
			|||||||
    val mask = edge.fullMask(bundle.address, bundle.size)
 | 
					    val mask = edge.fullMask(bundle.address, bundle.size)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    when (bundle.opcode === TLMessages.Probe) {
 | 
					    when (bundle.opcode === TLMessages.Probe) {
 | 
				
			||||||
      assert (edge.client.supportsProbe(bundle.source, bundle.size), "'B' channel carries Probe type unsupported by client")
 | 
					      assert (edge.client.supportsProbe(bundle.source, bundle.size), "'B' channel carries Probe type unsupported by client" + extra)
 | 
				
			||||||
      assert (address_ok, "'B' channel Probe carries unmanaged address")
 | 
					      assert (address_ok, "'B' channel Probe carries unmanaged address" + extra)
 | 
				
			||||||
      assert (bundle.size >= UInt(log2Ceil(edge.manager.beatBytes)), "'B' channel Probe smaller than a beat")
 | 
					      assert (bundle.size >= UInt(log2Ceil(edge.manager.beatBytes)), "'B' channel Probe smaller than a beat" + extra)
 | 
				
			||||||
      assert (is_aligned, "'B' channel Probe address not aligned to size")
 | 
					      assert (is_aligned, "'B' channel Probe address not aligned to size" + extra)
 | 
				
			||||||
      assert (TLPermissions.isCap(bundle.param), "'B' channel Probe carries invalid cap param")
 | 
					      assert (TLPermissions.isCap(bundle.param), "'B' channel Probe carries invalid cap param" + extra)
 | 
				
			||||||
      assert (bundle.mask === SInt(-1).asUInt, "'B' channel Probe contains invalid mask")
 | 
					      assert (bundle.mask === SInt(-1).asUInt, "'B' channel Probe contains invalid mask" + extra)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    when (bundle.opcode === TLMessages.Get) {
 | 
					    when (bundle.opcode === TLMessages.Get) {
 | 
				
			||||||
      assert (edge.client.supportsGet(bundle.source, bundle.size), "'B' channel carries Get type unsupported by client")
 | 
					      assert (edge.client.supportsGet(bundle.source, bundle.size), "'B' channel carries Get type unsupported by client" + extra)
 | 
				
			||||||
      assert (address_ok, "'B' channel Get carries unmanaged address")
 | 
					      assert (address_ok, "'B' channel Get carries unmanaged address" + extra)
 | 
				
			||||||
      assert (is_aligned, "'B' channel Get address not aligned to size")
 | 
					      assert (is_aligned, "'B' channel Get address not aligned to size" + extra)
 | 
				
			||||||
      assert (bundle.param === UInt(0), "'B' channel Get carries invalid param")
 | 
					      assert (bundle.param === UInt(0), "'B' channel Get carries invalid param" + extra)
 | 
				
			||||||
      assert (bundle.mask === mask, "'A' channel Get contains invalid mask")
 | 
					      assert (bundle.mask === mask, "'A' channel Get contains invalid mask" + extra)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    when (bundle.opcode === TLMessages.PutFullData) {
 | 
					    when (bundle.opcode === TLMessages.PutFullData) {
 | 
				
			||||||
      assert (edge.client.supportsPutFull(bundle.source, bundle.size), "'B' channel carries PutFull type unsupported by client")
 | 
					      assert (edge.client.supportsPutFull(bundle.source, bundle.size), "'B' channel carries PutFull type unsupported by client" + extra)
 | 
				
			||||||
      assert (address_ok, "'B' channel PutFull carries unmanaged address")
 | 
					      assert (address_ok, "'B' channel PutFull carries unmanaged address" + extra)
 | 
				
			||||||
      assert (is_aligned, "'B' channel PutFull address not aligned to size")
 | 
					      assert (is_aligned, "'B' channel PutFull address not aligned to size" + extra)
 | 
				
			||||||
      assert (bundle.param === UInt(0), "'B' channel PutFull carries invalid param")
 | 
					      assert (bundle.param === UInt(0), "'B' channel PutFull carries invalid param" + extra)
 | 
				
			||||||
      assert (bundle.mask === mask, "'B' channel PutFull contains invalid mask")
 | 
					      assert (bundle.mask === mask, "'B' channel PutFull contains invalid mask" + extra)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    when (bundle.opcode === TLMessages.PutPartialData) {
 | 
					    when (bundle.opcode === TLMessages.PutPartialData) {
 | 
				
			||||||
      assert (edge.client.supportsPutPartial(bundle.source, bundle.size), "'B' channel carries PutPartial type unsupported by client")
 | 
					      assert (edge.client.supportsPutPartial(bundle.source, bundle.size), "'B' channel carries PutPartial type unsupported by client" + extra)
 | 
				
			||||||
      assert (address_ok, "'B' channel PutPartial carries unmanaged address")
 | 
					      assert (address_ok, "'B' channel PutPartial carries unmanaged address" + extra)
 | 
				
			||||||
      assert (is_aligned, "'B' channel PutPartial address not aligned to size")
 | 
					      assert (is_aligned, "'B' channel PutPartial address not aligned to size" + extra)
 | 
				
			||||||
      assert (bundle.param === UInt(0), "'B' channel PutPartial carries invalid param")
 | 
					      assert (bundle.param === UInt(0), "'B' channel PutPartial carries invalid param" + extra)
 | 
				
			||||||
      assert ((bundle.mask & ~mask) === UInt(0), "'B' channel PutPartial contains invalid mask")
 | 
					      assert ((bundle.mask & ~mask) === UInt(0), "'B' channel PutPartial contains invalid mask" + extra)
 | 
				
			||||||
      assert (bundle.mask =/= UInt(0), "'B' channel PutPartial has a zero mask")
 | 
					      assert (bundle.mask =/= UInt(0), "'B' channel PutPartial has a zero mask" + extra)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    when (bundle.opcode === TLMessages.ArithmeticData) {
 | 
					    when (bundle.opcode === TLMessages.ArithmeticData) {
 | 
				
			||||||
      assert (edge.client.supportsArithmetic(bundle.source, bundle.size), "'B' channel carries Arithmetic type unsupported by client")
 | 
					      assert (edge.client.supportsArithmetic(bundle.source, bundle.size), "'B' channel carries Arithmetic type unsupported by client" + extra)
 | 
				
			||||||
      assert (address_ok, "'B' channel Arithmetic carries unmanaged address")
 | 
					      assert (address_ok, "'B' channel Arithmetic carries unmanaged address" + extra)
 | 
				
			||||||
      assert (is_aligned, "'B' channel Arithmetic address not aligned to size")
 | 
					      assert (is_aligned, "'B' channel Arithmetic address not aligned to size" + extra)
 | 
				
			||||||
      assert (TLAtomics.isArithmetic(bundle.param), "'B' channel Arithmetic carries invalid opcode param")
 | 
					      assert (TLAtomics.isArithmetic(bundle.param), "'B' channel Arithmetic carries invalid opcode param" + extra)
 | 
				
			||||||
      assert (bundle.mask === mask, "'B' channel Arithmetic contains invalid mask")
 | 
					      assert (bundle.mask === mask, "'B' channel Arithmetic contains invalid mask" + extra)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    when (bundle.opcode === TLMessages.LogicalData) {
 | 
					    when (bundle.opcode === TLMessages.LogicalData) {
 | 
				
			||||||
      assert (edge.client.supportsLogical(bundle.source, bundle.size), "'B' channel carries Logical type unsupported by client")
 | 
					      assert (edge.client.supportsLogical(bundle.source, bundle.size), "'B' channel carries Logical type unsupported by client" + extra)
 | 
				
			||||||
      assert (address_ok, "'B' channel Logical carries unmanaged address")
 | 
					      assert (address_ok, "'B' channel Logical carries unmanaged address" + extra)
 | 
				
			||||||
      assert (is_aligned, "'B' channel Logical address not aligned to size")
 | 
					      assert (is_aligned, "'B' channel Logical address not aligned to size" + extra)
 | 
				
			||||||
      assert (TLAtomics.isLogical(bundle.param), "'B' channel Logical carries invalid opcode param")
 | 
					      assert (TLAtomics.isLogical(bundle.param), "'B' channel Logical carries invalid opcode param" + extra)
 | 
				
			||||||
      assert (bundle.mask === mask, "'B' channel Logical contains invalid mask")
 | 
					      assert (bundle.mask === mask, "'B' channel Logical contains invalid mask" + extra)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    when (bundle.opcode === TLMessages.Hint) {
 | 
					    when (bundle.opcode === TLMessages.Hint) {
 | 
				
			||||||
      assert (edge.client.supportsHint(bundle.source), "'B' channel carries Hint type unsupported by client")
 | 
					      assert (edge.client.supportsHint(bundle.source), "'B' channel carries Hint type unsupported by client" + extra)
 | 
				
			||||||
      assert (address_ok, "'B' channel Hint carries unmanaged address")
 | 
					      assert (address_ok, "'B' channel Hint carries unmanaged address" + extra)
 | 
				
			||||||
      assert (is_aligned, "'B' channel Hint address not aligned to size")
 | 
					      assert (is_aligned, "'B' channel Hint address not aligned to size" + extra)
 | 
				
			||||||
      assert (bundle.mask === mask, "'B' channel Hint contains invalid mask")
 | 
					      assert (bundle.mask === mask, "'B' channel Hint contains invalid mask" + extra)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def legalizeFormatC(bundle: TLBundleC, edge: TLEdgeOut)(implicit sourceInfo: SourceInfo) = {
 | 
					  def legalizeFormatC(bundle: TLBundleC, edge: TLEdgeOut)(implicit sourceInfo: SourceInfo) = {
 | 
				
			||||||
    assert (TLMessages.isC(bundle.opcode), "'C' channel has invalid opcode")
 | 
					    assert (TLMessages.isC(bundle.opcode), "'C' channel has invalid opcode" + extra)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    val source_ok = edge.client.contains(bundle.source)
 | 
					    val source_ok = edge.client.contains(bundle.source)
 | 
				
			||||||
    val is_aligned = edge.isAligned(bundle.address, bundle.size)
 | 
					    val is_aligned = edge.isAligned(bundle.address, bundle.size)
 | 
				
			||||||
    val address_ok = edge.manager.contains(bundle.source)
 | 
					    val address_ok = edge.manager.contains(bundle.source)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    when (bundle.opcode === TLMessages.ProbeAck) {
 | 
					    when (bundle.opcode === TLMessages.ProbeAck) {
 | 
				
			||||||
      assert (address_ok, "'C' channel ProbeAck carries unmanaged address")
 | 
					      assert (address_ok, "'C' channel ProbeAck carries unmanaged address" + extra)
 | 
				
			||||||
      // source is ignored
 | 
					      // source is ignored
 | 
				
			||||||
      assert (bundle.size >= UInt(log2Ceil(edge.manager.beatBytes)), "'C' channel ProbeAck smaller than a beat")
 | 
					      assert (bundle.size >= UInt(log2Ceil(edge.manager.beatBytes)), "'C' channel ProbeAck smaller than a beat" + extra)
 | 
				
			||||||
      assert (is_aligned, "'C' channel ProbeAck address not aligned to size")
 | 
					      assert (is_aligned, "'C' channel ProbeAck address not aligned to size" + extra)
 | 
				
			||||||
      assert (TLPermissions.isReport(bundle.param), "'C' channel ProbeAck carries invalid report param")
 | 
					      assert (TLPermissions.isReport(bundle.param), "'C' channel ProbeAck carries invalid report param" + extra)
 | 
				
			||||||
      assert (!bundle.error, "'C' channel Probe carries an error")
 | 
					      assert (!bundle.error, "'C' channel Probe carries an error" + extra)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    when (bundle.opcode === TLMessages.ProbeAckData) {
 | 
					    when (bundle.opcode === TLMessages.ProbeAckData) {
 | 
				
			||||||
      assert (address_ok, "'C' channel ProbeAckData carries unmanaged address")
 | 
					      assert (address_ok, "'C' channel ProbeAckData carries unmanaged address" + extra)
 | 
				
			||||||
      // source is ignored
 | 
					      // source is ignored
 | 
				
			||||||
      assert (bundle.size >= UInt(log2Ceil(edge.manager.beatBytes)), "'C' channel ProbeAckData smaller than a beat")
 | 
					      assert (bundle.size >= UInt(log2Ceil(edge.manager.beatBytes)), "'C' channel ProbeAckData smaller than a beat" + extra)
 | 
				
			||||||
      assert (is_aligned, "'C' channel ProbeAckData address not aligned to size")
 | 
					      assert (is_aligned, "'C' channel ProbeAckData address not aligned to size" + extra)
 | 
				
			||||||
      assert (TLPermissions.isReport(bundle.param), "'C' channel ProbeAckData carries invalid report param")
 | 
					      assert (TLPermissions.isReport(bundle.param), "'C' channel ProbeAckData carries invalid report param" + extra)
 | 
				
			||||||
      assert (!bundle.error, "'C' channel ProbeData carries an error")
 | 
					      assert (!bundle.error, "'C' channel ProbeData carries an error" + extra)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    when (bundle.opcode === TLMessages.Release) {
 | 
					    when (bundle.opcode === TLMessages.Release) {
 | 
				
			||||||
      assert (edge.manager.supportsAcquire(bundle.address, bundle.size), "'C' channel carries Release type unsupported by manager")
 | 
					      assert (edge.manager.supportsAcquire(bundle.address, bundle.size), "'C' channel carries Release type unsupported by manager" + extra)
 | 
				
			||||||
      assert (source_ok, "'C' channel Release carries invalid source ID")
 | 
					      assert (source_ok, "'C' channel Release carries invalid source ID" + extra)
 | 
				
			||||||
      assert (bundle.size >= UInt(log2Ceil(edge.manager.beatBytes)), "'C' channel Release smaller than a beat")
 | 
					      assert (bundle.size >= UInt(log2Ceil(edge.manager.beatBytes)), "'C' channel Release smaller than a beat" + extra)
 | 
				
			||||||
      assert (is_aligned, "'C' channel Release address not aligned to size")
 | 
					      assert (is_aligned, "'C' channel Release address not aligned to size" + extra)
 | 
				
			||||||
      assert (TLPermissions.isShrink(bundle.param), "'C' channel Release carries invalid shrink param")
 | 
					      assert (TLPermissions.isShrink(bundle.param), "'C' channel Release carries invalid shrink param" + extra)
 | 
				
			||||||
      assert (!bundle.error, "'C' channel Release carries an error")
 | 
					      assert (!bundle.error, "'C' channel Release carries an error" + extra)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    when (bundle.opcode === TLMessages.ReleaseData) {
 | 
					    when (bundle.opcode === TLMessages.ReleaseData) {
 | 
				
			||||||
      assert (edge.manager.supportsAcquire(bundle.address, bundle.size), "'C' channel carries ReleaseData type unsupported by manager")
 | 
					      assert (edge.manager.supportsAcquire(bundle.address, bundle.size), "'C' channel carries ReleaseData type unsupported by manager" + extra)
 | 
				
			||||||
      assert (source_ok, "'C' channel ReleaseData carries invalid source ID")
 | 
					      assert (source_ok, "'C' channel ReleaseData carries invalid source ID" + extra)
 | 
				
			||||||
      assert (bundle.size >= UInt(log2Ceil(edge.manager.beatBytes)), "'C' channel ReleaseData smaller than a beat")
 | 
					      assert (bundle.size >= UInt(log2Ceil(edge.manager.beatBytes)), "'C' channel ReleaseData smaller than a beat" + extra)
 | 
				
			||||||
      assert (is_aligned, "'C' channel ReleaseData address not aligned to size")
 | 
					      assert (is_aligned, "'C' channel ReleaseData address not aligned to size" + extra)
 | 
				
			||||||
      assert (TLPermissions.isShrink(bundle.param), "'C' channel ReleaseData carries invalid shrink param")
 | 
					      assert (TLPermissions.isShrink(bundle.param), "'C' channel ReleaseData carries invalid shrink param" + extra)
 | 
				
			||||||
      assert (!bundle.error, "'C' channel ReleaseData carries an error")
 | 
					      assert (!bundle.error, "'C' channel ReleaseData carries an error" + extra)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    when (bundle.opcode === TLMessages.AccessAck) {
 | 
					    when (bundle.opcode === TLMessages.AccessAck) {
 | 
				
			||||||
      assert (address_ok, "'C' channel AccessAck carries unmanaged address")
 | 
					      assert (address_ok, "'C' channel AccessAck carries unmanaged address" + extra)
 | 
				
			||||||
      // source is ignored
 | 
					      // source is ignored
 | 
				
			||||||
      assert (is_aligned, "'C' channel AccessAck address not aligned to size")
 | 
					      assert (is_aligned, "'C' channel AccessAck address not aligned to size" + extra)
 | 
				
			||||||
      assert (bundle.param === UInt(0), "'C' channel AccessAck carries invalid param")
 | 
					      assert (bundle.param === UInt(0), "'C' channel AccessAck carries invalid param" + extra)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    when (bundle.opcode === TLMessages.AccessAckData) {
 | 
					    when (bundle.opcode === TLMessages.AccessAckData) {
 | 
				
			||||||
      assert (address_ok, "'C' channel AccessAckData carries unmanaged address")
 | 
					      assert (address_ok, "'C' channel AccessAckData carries unmanaged address" + extra)
 | 
				
			||||||
      // source is ignored
 | 
					      // source is ignored
 | 
				
			||||||
      assert (is_aligned, "'C' channel AccessAckData address not aligned to size")
 | 
					      assert (is_aligned, "'C' channel AccessAckData address not aligned to size" + extra)
 | 
				
			||||||
      assert (bundle.param === UInt(0), "'C' channel AccessAckData carries invalid param")
 | 
					      assert (bundle.param === UInt(0), "'C' channel AccessAckData carries invalid param" + extra)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    when (bundle.opcode === TLMessages.HintAck) {
 | 
					    when (bundle.opcode === TLMessages.HintAck) {
 | 
				
			||||||
      assert (address_ok, "'C' channel HintAck carries unmanaged address")
 | 
					      assert (address_ok, "'C' channel HintAck carries unmanaged address" + extra)
 | 
				
			||||||
      // source is ignored
 | 
					      // source is ignored
 | 
				
			||||||
      assert (is_aligned, "'C' channel HintAck address not aligned to size")
 | 
					      assert (is_aligned, "'C' channel HintAck address not aligned to size" + extra)
 | 
				
			||||||
      assert (bundle.param === UInt(0), "'C' channel HintAck carries invalid param")
 | 
					      assert (bundle.param === UInt(0), "'C' channel HintAck carries invalid param" + extra)
 | 
				
			||||||
      assert (!bundle.error, "'C' channel HintAck carries an error")
 | 
					      assert (!bundle.error, "'C' channel HintAck carries an error" + extra)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def legalizeFormatD(bundle: TLBundleD, edge: TLEdgeIn)(implicit sourceInfo: SourceInfo) = {
 | 
					  def legalizeFormatD(bundle: TLBundleD, edge: TLEdgeIn)(implicit sourceInfo: SourceInfo) = {
 | 
				
			||||||
    assert (TLMessages.isD(bundle.opcode), "'D' channel has invalid opcode")
 | 
					    assert (TLMessages.isD(bundle.opcode), "'D' channel has invalid opcode" + extra)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    val source_ok = edge.client.contains(bundle.source)
 | 
					    val source_ok = edge.client.contains(bundle.source)
 | 
				
			||||||
    val sink_ok = edge.manager.containsById(bundle.sink)
 | 
					    val sink_ok = edge.manager.containsById(bundle.sink)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    when (bundle.opcode === TLMessages.ReleaseAck) {
 | 
					    when (bundle.opcode === TLMessages.ReleaseAck) {
 | 
				
			||||||
      assert (source_ok, "'D' channel ReleaseAck carries invalid source ID")
 | 
					      assert (source_ok, "'D' channel ReleaseAck carries invalid source ID" + extra)
 | 
				
			||||||
      // sink is ignored
 | 
					      // sink is ignored
 | 
				
			||||||
      assert (bundle.size >= UInt(log2Ceil(edge.manager.beatBytes)), "'D' channel ReleaseAck smaller than a beat")
 | 
					      assert (bundle.size >= UInt(log2Ceil(edge.manager.beatBytes)), "'D' channel ReleaseAck smaller than a beat" + extra)
 | 
				
			||||||
      assert (bundle.param === UInt(0), "'D' channel ReleaseeAck carries invalid param")
 | 
					      assert (bundle.param === UInt(0), "'D' channel ReleaseeAck carries invalid param" + extra)
 | 
				
			||||||
      assert (!bundle.error, "'D' channel ReleaseAck carries an error")
 | 
					      assert (!bundle.error, "'D' channel ReleaseAck carries an error" + extra)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    when (bundle.opcode === TLMessages.Grant) {
 | 
					    when (bundle.opcode === TLMessages.Grant) {
 | 
				
			||||||
      assert (source_ok, "'D' channel Grant carries invalid source ID")
 | 
					      assert (source_ok, "'D' channel Grant carries invalid source ID" + extra)
 | 
				
			||||||
      assert (sink_ok, "'D' channel Grant carries invalid sink ID")
 | 
					      assert (sink_ok, "'D' channel Grant carries invalid sink ID" + extra)
 | 
				
			||||||
      assert (bundle.size >= UInt(log2Ceil(edge.manager.beatBytes)), "'D' channel Grant smaller than a beat")
 | 
					      assert (bundle.size >= UInt(log2Ceil(edge.manager.beatBytes)), "'D' channel Grant smaller than a beat" + extra)
 | 
				
			||||||
      assert (TLPermissions.isCap(bundle.param), "'D' channel Grant carries invalid cap param")
 | 
					      assert (TLPermissions.isCap(bundle.param), "'D' channel Grant carries invalid cap param" + extra)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    when (bundle.opcode === TLMessages.GrantData) {
 | 
					    when (bundle.opcode === TLMessages.GrantData) {
 | 
				
			||||||
      assert (source_ok, "'D' channel GrantData carries invalid source ID")
 | 
					      assert (source_ok, "'D' channel GrantData carries invalid source ID" + extra)
 | 
				
			||||||
      assert (sink_ok, "'D' channel GrantData carries invalid sink ID")
 | 
					      assert (sink_ok, "'D' channel GrantData carries invalid sink ID" + extra)
 | 
				
			||||||
      assert (bundle.size >= UInt(log2Ceil(edge.manager.beatBytes)), "'D' channel GrantData smaller than a beat")
 | 
					      assert (bundle.size >= UInt(log2Ceil(edge.manager.beatBytes)), "'D' channel GrantData smaller than a beat" + extra)
 | 
				
			||||||
      assert (TLPermissions.isCap(bundle.param), "'D' channel GrantData carries invalid cap param")
 | 
					      assert (TLPermissions.isCap(bundle.param), "'D' channel GrantData carries invalid cap param" + extra)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    when (bundle.opcode === TLMessages.AccessAck) {
 | 
					    when (bundle.opcode === TLMessages.AccessAck) {
 | 
				
			||||||
      assert (source_ok, "'D' channel AccessAck carries invalid source ID")
 | 
					      assert (source_ok, "'D' channel AccessAck carries invalid source ID" + extra)
 | 
				
			||||||
      // sink is ignored
 | 
					      // sink is ignored
 | 
				
			||||||
      // size is ignored
 | 
					      // size is ignored
 | 
				
			||||||
      assert (bundle.param === UInt(0), "'D' channel AccessAck carries invalid param")
 | 
					      assert (bundle.param === UInt(0), "'D' channel AccessAck carries invalid param" + extra)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    when (bundle.opcode === TLMessages.AccessAckData) {
 | 
					    when (bundle.opcode === TLMessages.AccessAckData) {
 | 
				
			||||||
      assert (source_ok, "'D' channel AccessAckData carries invalid source ID")
 | 
					      assert (source_ok, "'D' channel AccessAckData carries invalid source ID" + extra)
 | 
				
			||||||
      // sink is ignored
 | 
					      // sink is ignored
 | 
				
			||||||
      // size is ignored
 | 
					      // size is ignored
 | 
				
			||||||
      assert (bundle.param === UInt(0), "'D' channel AccessAckData carries invalid param")
 | 
					      assert (bundle.param === UInt(0), "'D' channel AccessAckData carries invalid param" + extra)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    when (bundle.opcode === TLMessages.HintAck) {
 | 
					    when (bundle.opcode === TLMessages.HintAck) {
 | 
				
			||||||
      assert (source_ok, "'D' channel HintAck carries invalid source ID")
 | 
					      assert (source_ok, "'D' channel HintAck carries invalid source ID" + extra)
 | 
				
			||||||
      // sink is ignored
 | 
					      // sink is ignored
 | 
				
			||||||
      // size is ignored
 | 
					      // size is ignored
 | 
				
			||||||
      assert (bundle.param === UInt(0), "'D' channel HintAck carries invalid param")
 | 
					      assert (bundle.param === UInt(0), "'D' channel HintAck carries invalid param" + extra)
 | 
				
			||||||
      assert (!bundle.error, "'D' channel HintAck carries an error")
 | 
					      assert (!bundle.error, "'D' channel HintAck carries an error" + extra)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def legalizeFormatE(bundle: TLBundleE, edge: TLEdgeOut)(implicit sourceInfo: SourceInfo) = {
 | 
					  def legalizeFormatE(bundle: TLBundleE, edge: TLEdgeOut)(implicit sourceInfo: SourceInfo) = {
 | 
				
			||||||
    assert (edge.manager.containsById(bundle.sink), "'E' channels carries invalid sink ID")
 | 
					    assert (edge.manager.containsById(bundle.sink), "'E' channels carries invalid sink ID" + extra)
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def legalizeFormat(bundleOut: TLBundle, edgeOut: TLEdgeOut, bundleIn: TLBundle, edgeIn: TLEdgeIn)(implicit sourceInfo: SourceInfo) = {
 | 
					  def legalizeFormat(bundleOut: TLBundle, edgeOut: TLEdgeOut, bundleIn: TLBundle, edgeIn: TLEdgeIn)(implicit sourceInfo: SourceInfo) = {
 | 
				
			||||||
@@ -276,11 +283,11 @@ object TLMonitor
 | 
				
			|||||||
    val source  = Reg(UInt())
 | 
					    val source  = Reg(UInt())
 | 
				
			||||||
    val address = Reg(UInt())
 | 
					    val address = Reg(UInt())
 | 
				
			||||||
    when (a.valid && counter =/= UInt(0)) {
 | 
					    when (a.valid && counter =/= UInt(0)) {
 | 
				
			||||||
      assert (a.bits.opcode === opcode, "'A' channel opcode changed within multibeat operation")
 | 
					      assert (a.bits.opcode === opcode, "'A' channel opcode changed within multibeat operation" + extra)
 | 
				
			||||||
      assert (a.bits.param  === param,  "'A' channel param changed within multibeat operation")
 | 
					      assert (a.bits.param  === param,  "'A' channel param changed within multibeat operation" + extra)
 | 
				
			||||||
      assert (a.bits.size   === size,   "'A' channel size changed within multibeat operation")
 | 
					      assert (a.bits.size   === size,   "'A' channel size changed within multibeat operation" + extra)
 | 
				
			||||||
      assert (a.bits.source === source, "'A' channel source changed within multibeat operation")
 | 
					      assert (a.bits.source === source, "'A' channel source changed within multibeat operation" + extra)
 | 
				
			||||||
      assert (a.bits.address=== address,"'A' channel address changed with multibeat operation")
 | 
					      assert (a.bits.address=== address,"'A' channel address changed with multibeat operation" + extra)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    when (a.fire()) {
 | 
					    when (a.fire()) {
 | 
				
			||||||
      counter := counter - UInt(1)
 | 
					      counter := counter - UInt(1)
 | 
				
			||||||
@@ -303,11 +310,11 @@ object TLMonitor
 | 
				
			|||||||
    val source  = Reg(UInt())
 | 
					    val source  = Reg(UInt())
 | 
				
			||||||
    val address = Reg(UInt())
 | 
					    val address = Reg(UInt())
 | 
				
			||||||
    when (b.valid && counter =/= UInt(0)) {
 | 
					    when (b.valid && counter =/= UInt(0)) {
 | 
				
			||||||
      assert (b.bits.opcode === opcode, "'B' channel opcode changed within multibeat operation")
 | 
					      assert (b.bits.opcode === opcode, "'B' channel opcode changed within multibeat operation" + extra)
 | 
				
			||||||
      assert (b.bits.param  === param,  "'B' channel param changed within multibeat operation")
 | 
					      assert (b.bits.param  === param,  "'B' channel param changed within multibeat operation" + extra)
 | 
				
			||||||
      assert (b.bits.size   === size,   "'B' channel size changed within multibeat operation")
 | 
					      assert (b.bits.size   === size,   "'B' channel size changed within multibeat operation" + extra)
 | 
				
			||||||
      assert (b.bits.source === source, "'B' channel source changed within multibeat operation")
 | 
					      assert (b.bits.source === source, "'B' channel source changed within multibeat operation" + extra)
 | 
				
			||||||
      assert (b.bits.address=== address,"'B' channel address changed with multibeat operation")
 | 
					      assert (b.bits.address=== address,"'B' channel address changed with multibeat operation" + extra)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    when (b.fire()) {
 | 
					    when (b.fire()) {
 | 
				
			||||||
      counter := counter - UInt(1)
 | 
					      counter := counter - UInt(1)
 | 
				
			||||||
@@ -330,11 +337,11 @@ object TLMonitor
 | 
				
			|||||||
    val source  = Reg(UInt())
 | 
					    val source  = Reg(UInt())
 | 
				
			||||||
    val address = Reg(UInt())
 | 
					    val address = Reg(UInt())
 | 
				
			||||||
    when (c.valid && counter =/= UInt(0)) {
 | 
					    when (c.valid && counter =/= UInt(0)) {
 | 
				
			||||||
      assert (c.bits.opcode === opcode, "'C' channel opcode changed within multibeat operation")
 | 
					      assert (c.bits.opcode === opcode, "'C' channel opcode changed within multibeat operation" + extra)
 | 
				
			||||||
      assert (c.bits.param  === param,  "'C' channel param changed within multibeat operation")
 | 
					      assert (c.bits.param  === param,  "'C' channel param changed within multibeat operation" + extra)
 | 
				
			||||||
      assert (c.bits.size   === size,   "'C' channel size changed within multibeat operation")
 | 
					      assert (c.bits.size   === size,   "'C' channel size changed within multibeat operation" + extra)
 | 
				
			||||||
      assert (c.bits.source === source, "'C' channel source changed within multibeat operation")
 | 
					      assert (c.bits.source === source, "'C' channel source changed within multibeat operation" + extra)
 | 
				
			||||||
      assert (c.bits.address=== address,"'C' channel address changed with multibeat operation")
 | 
					      assert (c.bits.address=== address,"'C' channel address changed with multibeat operation" + extra)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    when (c.fire()) {
 | 
					    when (c.fire()) {
 | 
				
			||||||
      counter := counter - UInt(1)
 | 
					      counter := counter - UInt(1)
 | 
				
			||||||
@@ -357,11 +364,11 @@ object TLMonitor
 | 
				
			|||||||
    val source  = Reg(UInt())
 | 
					    val source  = Reg(UInt())
 | 
				
			||||||
    val sink    = Reg(UInt())
 | 
					    val sink    = Reg(UInt())
 | 
				
			||||||
    when (d.valid && counter =/= UInt(0)) {
 | 
					    when (d.valid && counter =/= UInt(0)) {
 | 
				
			||||||
      assert (d.bits.opcode === opcode, "'D' channel opcode changed within multibeat operation")
 | 
					      assert (d.bits.opcode === opcode, "'D' channel opcode changed within multibeat operation" + extra)
 | 
				
			||||||
      assert (d.bits.param  === param,  "'D' channel param changed within multibeat operation")
 | 
					      assert (d.bits.param  === param,  "'D' channel param changed within multibeat operation" + extra)
 | 
				
			||||||
      assert (d.bits.size   === size,   "'D' channel size changed within multibeat operation")
 | 
					      assert (d.bits.size   === size,   "'D' channel size changed within multibeat operation" + extra)
 | 
				
			||||||
      assert (d.bits.source === source, "'D' channel source changed within multibeat operation")
 | 
					      assert (d.bits.source === source, "'D' channel source changed within multibeat operation" + extra)
 | 
				
			||||||
      assert (d.bits.sink   === sink,   "'D' channel sink changed with multibeat operation")
 | 
					      assert (d.bits.sink   === sink,   "'D' channel sink changed with multibeat operation" + extra)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    when (d.fire()) {
 | 
					    when (d.fire()) {
 | 
				
			||||||
      counter := counter - UInt(1)
 | 
					      counter := counter - UInt(1)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user