WIP bugfixes: run until corrupted WB data (beats repeated)
This commit is contained in:
		| @@ -283,7 +283,7 @@ class DCache(maxUncachedInFlight: Int = 2)(implicit val p: Parameters) extends L | |||||||
|     val a_address = s2_req.addr |     val a_address = s2_req.addr | ||||||
|     val a_size = s2_req.typ |     val a_size = s2_req.typ | ||||||
|     val a_data = Fill(beatWords, pstore1_storegen.data) |     val a_data = Fill(beatWords, pstore1_storegen.data) | ||||||
|     val acquire = edge.Acquire(a_source, a_address, lgCacheBlockBytes, s2_grow_param)._2 // TODO check cacheability |     val acquire = edge.Acquire(a_source, a_address, lgCacheBlockBytes, s2_grow_param)._2 // TODO Cacheability already been checked? | ||||||
|     val get     = edge.Get(a_source, a_address, a_size)._2 |     val get     = edge.Get(a_source, a_address, a_size)._2 | ||||||
|     val put     = edge.Put(a_source, a_address, a_size, a_data)._2 |     val put     = edge.Put(a_source, a_address, a_size, a_data)._2 | ||||||
|     val atomics = if (edge.manager.anySupportLogical) { |     val atomics = if (edge.manager.anySupportLogical) { | ||||||
| @@ -305,9 +305,7 @@ class DCache(maxUncachedInFlight: Int = 2)(implicit val p: Parameters) extends L | |||||||
|  |  | ||||||
|     tl_out.a.valid := grantackq.io.enq.ready && ((s2_valid_cached_miss && !s2_victim_dirty) || |     tl_out.a.valid := grantackq.io.enq.ready && ((s2_valid_cached_miss && !s2_victim_dirty) || | ||||||
|                                           (s2_valid_uncached && !uncachedInFlight.asUInt.andR)) |                                           (s2_valid_uncached && !uncachedInFlight.asUInt.andR)) | ||||||
|     tl_out.a.bits := Mux(pstore1_amo && s2_write && s2_uncached, atomics, |     tl_out.a.bits := Mux(!s2_uncached, acquire, Mux(!s2_write, get, Mux(!pstore1_amo, put, atomics))) | ||||||
|                        Mux(s2_write && s2_uncached, put, |  | ||||||
|                         Mux(s2_uncached, get, acquire))) |  | ||||||
|  |  | ||||||
|     // Set pending bits for outstanding TileLink transaction |     // Set pending bits for outstanding TileLink transaction | ||||||
|     when (tl_out.a.fire()) { |     when (tl_out.a.fire()) { | ||||||
| @@ -392,13 +390,20 @@ class DCache(maxUncachedInFlight: Int = 2)(implicit val p: Parameters) extends L | |||||||
|     metaReadArb.io.in(1).bits.way_en := ~UInt(0, nWays) |     metaReadArb.io.in(1).bits.way_en := ~UInt(0, nWays) | ||||||
|  |  | ||||||
|     // release |     // release | ||||||
|     val (writebackCount, writebackDone) = Counter(tl_out.c.fire() && inWriteback, refillCycles) //TODO firstlast? |     val (_, c_last, c_address_inc) = edge.firstlast(tl_out.c) | ||||||
|     val releaseDone = writebackDone || (tl_out.c.fire() && !inWriteback) |     val releaseDone = tl_out.c.fire() && Mux(inWriteback, c_last, Bool(true)) | ||||||
|     val releaseRejected = tl_out.c.valid && !tl_out.c.ready |     val releaseRejected = tl_out.c.valid && !tl_out.c.ready | ||||||
|     val s1_release_data_valid = Reg(next = dataArb.io.in(2).fire()) |     val s1_release_data_valid = Reg(next = dataArb.io.in(2).fire()) | ||||||
|     val s2_release_data_valid = Reg(next = s1_release_data_valid && !releaseRejected) |     val s2_release_data_valid = Reg(next = s1_release_data_valid && !releaseRejected) | ||||||
|  |  | ||||||
|  |     // TODO refactor these counters | ||||||
|  |     val (writebackCount, _) = Counter(tl_out.c.fire() && inWriteback, refillCycles) | ||||||
|     val releaseDataBeat = Cat(UInt(0), writebackCount) + Mux(releaseRejected, UInt(0), s1_release_data_valid + Cat(UInt(0), s2_release_data_valid)) |     val releaseDataBeat = Cat(UInt(0), writebackCount) + Mux(releaseRejected, UInt(0), s1_release_data_valid + Cat(UInt(0), s2_release_data_valid)) | ||||||
|  |  | ||||||
|  |     val nackResponseMessage     = edge.ProbeAck( | ||||||
|  |                                     b = probe_bits, | ||||||
|  |                                     reportPermissions = TLPermissions.NtoN) | ||||||
|  |  | ||||||
|     val voluntaryReleaseMessage = edge.Release( |     val voluntaryReleaseMessage = edge.Release( | ||||||
|                                     fromSource = UInt(maxUncachedInFlight - 1), |                                     fromSource = UInt(maxUncachedInFlight - 1), | ||||||
|                                     toAddress = probe_bits.address, |                                     toAddress = probe_bits.address, | ||||||
| @@ -416,14 +421,14 @@ class DCache(maxUncachedInFlight: Int = 2)(implicit val p: Parameters) extends L | |||||||
|                                     data = s2_data)) |                                     data = s2_data)) | ||||||
|  |  | ||||||
|     tl_out.c.valid := s2_release_data_valid |     tl_out.c.valid := s2_release_data_valid | ||||||
|     tl_out.c.bits := voluntaryReleaseMessage // TODO was ClientMetadata.onReset.makeRelease(probe_bits) ... s2_victim_state ok? |     tl_out.c.bits := nackResponseMessage // TODO was ClientMetadata.onReset.makeRelease(probe_bits) ... ok? | ||||||
|     val newCoh = Wire(init = probeNewCoh) |     val newCoh = Wire(init = probeNewCoh) | ||||||
|     releaseWay := s2_probe_way |     releaseWay := s2_probe_way | ||||||
|  |  | ||||||
|     when (s2_victimize && s2_victim_dirty) { |     when (s2_victimize && s2_victim_dirty) { | ||||||
|       assert(!(s2_valid && s2_hit_valid)) |       assert(!(s2_valid && s2_hit_valid)) | ||||||
|       release_state := s_voluntary_writeback |       release_state := s_voluntary_writeback | ||||||
|       probe_bits.address := Cat(s2_victim_tag, s2_req.addr(idxMSB, idxLSB)) << rowOffBits |       probe_bits.address := Cat(s2_victim_tag, s2_req.addr(idxMSB, idxLSB)) << idxLSB | ||||||
|     } |     } | ||||||
|     when (s2_probe) { |     when (s2_probe) { | ||||||
|       when (needs_vol_wb) { release_state := s_probe_rep_dirty } |       when (needs_vol_wb) { release_state := s_probe_rep_dirty } | ||||||
| @@ -456,7 +461,7 @@ class DCache(maxUncachedInFlight: Int = 2)(implicit val p: Parameters) extends L | |||||||
|  |  | ||||||
|     dataArb.io.in(2).valid := inWriteback && releaseDataBeat < refillCycles |     dataArb.io.in(2).valid := inWriteback && releaseDataBeat < refillCycles | ||||||
|     dataArb.io.in(2).bits.write := false |     dataArb.io.in(2).bits.write := false | ||||||
|     dataArb.io.in(2).bits.addr := tl_out.c.bits.address | (releaseDataBeat(log2Up(refillCycles)-1,0) << rowOffBits) |     dataArb.io.in(2).bits.addr := tl_out.c.bits.address | c_address_inc | ||||||
|     dataArb.io.in(2).bits.way_en := ~UInt(0, nWays) |     dataArb.io.in(2).bits.way_en := ~UInt(0, nWays) | ||||||
|  |  | ||||||
|     metaWriteArb.io.in(2).valid := release_state.isOneOf(s_voluntary_write_meta, s_probe_write_meta) |     metaWriteArb.io.in(2).valid := release_state.isOneOf(s_voluntary_write_meta, s_probe_write_meta) | ||||||
|   | |||||||
| @@ -27,7 +27,7 @@ class RocketTile(tileId: Int)(implicit p: Parameters) extends LazyModule { | |||||||
|   val dcacheParams = p.alterPartial({ |   val dcacheParams = p.alterPartial({ | ||||||
|     case CacheName => "L1D" |     case CacheName => "L1D" | ||||||
|     case TLId => "L1toL2" |     case TLId => "L1toL2" | ||||||
|     case TileId => tileId // TODO using this messes with Heirarchical P&R |     case TileId => tileId // TODO using this messes with Heirarchical P&R: change to io.hartid? | ||||||
|   }) |   }) | ||||||
|   val icacheParams = p.alterPartial({ |   val icacheParams = p.alterPartial({ | ||||||
|     case CacheName => "L1I" |     case CacheName => "L1I" | ||||||
|   | |||||||
| @@ -96,7 +96,7 @@ class TLBroadcast(lineBytes: Int, numTrackers: Int = 4, bufferless: Boolean = fa | |||||||
|       d_normal.bits.param  := Mux(d_hasData, Mux(d_what(0), TLPermissions.toT, TLPermissions.toB), UInt(0)) |       d_normal.bits.param  := Mux(d_hasData, Mux(d_what(0), TLPermissions.toT, TLPermissions.toB), UInt(0)) | ||||||
|     } |     } | ||||||
|     d_normal.bits.sink := OHToUInt(d_trackerOH) |     d_normal.bits.sink := OHToUInt(d_trackerOH) | ||||||
|     assert (!d_normal.valid || d_trackerOH.orR()) |     assert (!d_normal.valid || (d_trackerOH.orR() || d_normal.bits.opcode === TLMessages.ReleaseAck)) | ||||||
|  |  | ||||||
|     // A tracker response is anything neither dropped nor a ReleaseAck |     // A tracker response is anything neither dropped nor a ReleaseAck | ||||||
|     val d_response = d_hasData || !d_what(1) |     val d_response = d_hasData || !d_what(1) | ||||||
|   | |||||||
| @@ -53,53 +53,61 @@ object TLMessages | |||||||
|   */ |   */ | ||||||
| object TLPermissions | object TLPermissions | ||||||
| { | { | ||||||
|  |   val aWidth = 2 | ||||||
|  |   val bdWidth = 2 | ||||||
|  |   val cWidth = 3 | ||||||
|  |  | ||||||
|   // Cap types (Grant = new permissions, Probe = permisions <= target) |   // Cap types (Grant = new permissions, Probe = permisions <= target) | ||||||
|   val toT = UInt(0) |   val toT = UInt(0, bdWidth) | ||||||
|   val toB = UInt(1) |   val toB = UInt(1, bdWidth) | ||||||
|   val toN = UInt(2) |   val toN = UInt(2, bdWidth) | ||||||
|   def isCap(x: UInt) = x <= toN |   def isCap(x: UInt) = x <= toN | ||||||
|  |  | ||||||
|   // Grow types (Acquire = permissions >= target) |   // Grow types (Acquire = permissions >= target) | ||||||
|   val NtoB = UInt(0) |   val NtoB = UInt(0, aWidth) | ||||||
|   val NtoT = UInt(1) |   val NtoT = UInt(1, aWidth) | ||||||
|   val BtoT = UInt(2) |   val BtoT = UInt(2, aWidth) | ||||||
|   def isGrow(x: UInt) = x <= BtoT |   def isGrow(x: UInt) = x <= BtoT | ||||||
|  |  | ||||||
|   // Shrink types (ProbeAck, Release) |   // Shrink types (ProbeAck, Release) | ||||||
|   val TtoB = UInt(0) |   val TtoB = UInt(0, cWidth) | ||||||
|   val TtoN = UInt(1) |   val TtoN = UInt(1, cWidth) | ||||||
|   val BtoN = UInt(2) |   val BtoN = UInt(2, cWidth) | ||||||
|   def isShrink(x: UInt) = x <= BtoN |   def isShrink(x: UInt) = x <= BtoN | ||||||
|  |  | ||||||
|   // Report types (ProbeAck) |   // Report types (ProbeAck) | ||||||
|   val TtoT = UInt(3) |   val TtoT = UInt(3, cWidth) | ||||||
|   val BtoB = UInt(4) |   val BtoB = UInt(4, cWidth) | ||||||
|   val NtoN = UInt(5) |   val NtoN = UInt(5, cWidth) | ||||||
|   def isReport(x: UInt) = x <= NtoN |   def isReport(x: UInt) = x <= NtoN | ||||||
| } | } | ||||||
|  |  | ||||||
| object TLAtomics | object TLAtomics | ||||||
| { | { | ||||||
|  |   val width = 3  | ||||||
|  |  | ||||||
|   // Arithmetic types |   // Arithmetic types | ||||||
|   val MIN  = UInt(0) |   val MIN  = UInt(0, width) | ||||||
|   val MAX  = UInt(1) |   val MAX  = UInt(1, width) | ||||||
|   val MINU = UInt(2) |   val MINU = UInt(2, width) | ||||||
|   val MAXU = UInt(3) |   val MAXU = UInt(3, width) | ||||||
|   val ADD  = UInt(4) |   val ADD  = UInt(4, width) | ||||||
|   def isArithmetic(x: UInt) = x <= ADD |   def isArithmetic(x: UInt) = x <= ADD | ||||||
|  |  | ||||||
|   // Logical types |   // Logical types | ||||||
|   val XOR  = UInt(0) |   val XOR  = UInt(0, width) | ||||||
|   val OR   = UInt(1) |   val OR   = UInt(1, width) | ||||||
|   val AND  = UInt(2) |   val AND  = UInt(2, width) | ||||||
|   val SWAP = UInt(3) |   val SWAP = UInt(3, width) | ||||||
|   def isLogical(x: UInt) = x <= SWAP |   def isLogical(x: UInt) = x <= SWAP | ||||||
| } | } | ||||||
|  |  | ||||||
| object TLHints | object TLHints | ||||||
| { | { | ||||||
|   val PREFETCH_READ  = UInt(0) |   val width = 1 | ||||||
|   val PREFETCH_WRITE = UInt(1) |  | ||||||
|  |   val PREFETCH_READ  = UInt(0, width) | ||||||
|  |   val PREFETCH_WRITE = UInt(1, width) | ||||||
| } | } | ||||||
|  |  | ||||||
| sealed trait TLChannel extends TLBundleBase { | sealed trait TLChannel extends TLBundleBase { | ||||||
| @@ -114,7 +122,7 @@ final class TLBundleA(params: TLBundleParameters) | |||||||
|   val channelName = "'A' channel" |   val channelName = "'A' channel" | ||||||
|   // fixed fields during multibeat: |   // fixed fields during multibeat: | ||||||
|   val opcode  = UInt(width = 3) |   val opcode  = UInt(width = 3) | ||||||
|   val param   = UInt(width = 3) // amo_opcode || perms || hint |   val param   = UInt(width = List(TLAtomics.width, TLPermissions.aWidth, TLHints.width).max) // amo_opcode || grow perms || hint | ||||||
|   val size    = UInt(width = params.sizeBits) |   val size    = UInt(width = params.sizeBits) | ||||||
|   val source  = UInt(width = params.sourceBits) // from |   val source  = UInt(width = params.sourceBits) // from | ||||||
|   val address = UInt(width = params.addressBits) // to |   val address = UInt(width = params.addressBits) // to | ||||||
| @@ -129,7 +137,7 @@ final class TLBundleB(params: TLBundleParameters) | |||||||
|   val channelName = "'B' channel" |   val channelName = "'B' channel" | ||||||
|   // fixed fields during multibeat: |   // fixed fields during multibeat: | ||||||
|   val opcode  = UInt(width = 3) |   val opcode  = UInt(width = 3) | ||||||
|   val param   = UInt(width = 3) |   val param   = UInt(width = TLPermissions.bdWidth) // cap perms | ||||||
|   val size    = UInt(width = params.sizeBits) |   val size    = UInt(width = params.sizeBits) | ||||||
|   val source  = UInt(width = params.sourceBits) // to |   val source  = UInt(width = params.sourceBits) // to | ||||||
|   val address = UInt(width = params.addressBits) // from |   val address = UInt(width = params.addressBits) // from | ||||||
| @@ -144,7 +152,7 @@ final class TLBundleC(params: TLBundleParameters) | |||||||
|   val channelName = "'C' channel" |   val channelName = "'C' channel" | ||||||
|   // fixed fields during multibeat: |   // fixed fields during multibeat: | ||||||
|   val opcode  = UInt(width = 3) |   val opcode  = UInt(width = 3) | ||||||
|   val param   = UInt(width = 3) |   val param   = UInt(width = TLPermissions.cWidth) // shrink or report perms | ||||||
|   val size    = UInt(width = params.sizeBits) |   val size    = UInt(width = params.sizeBits) | ||||||
|   val source  = UInt(width = params.sourceBits) // from |   val source  = UInt(width = params.sourceBits) // from | ||||||
|   val address = UInt(width = params.addressBits) // to |   val address = UInt(width = params.addressBits) // to | ||||||
| @@ -159,7 +167,7 @@ final class TLBundleD(params: TLBundleParameters) | |||||||
|   val channelName = "'D' channel" |   val channelName = "'D' channel" | ||||||
|   // fixed fields during multibeat: |   // fixed fields during multibeat: | ||||||
|   val opcode  = UInt(width = 3) |   val opcode  = UInt(width = 3) | ||||||
|   val param   = UInt(width = 2) |   val param   = UInt(width = TLPermissions.bdWidth) // cap perms | ||||||
|   val size    = UInt(width = params.sizeBits) |   val size    = UInt(width = params.sizeBits) | ||||||
|   val source  = UInt(width = params.sourceBits) // to |   val source  = UInt(width = params.sourceBits) // to | ||||||
|   val sink    = UInt(width = params.sinkBits)   // from |   val sink    = UInt(width = params.sinkBits)   // from | ||||||
|   | |||||||
| @@ -205,7 +205,7 @@ class TLEdgeOut( | |||||||
|     a.size    := lgSize |     a.size    := lgSize | ||||||
|     a.source  := fromSource |     a.source  := fromSource | ||||||
|     a.address := toAddress |     a.address := toAddress | ||||||
|     a.mask    := SInt(-1).asUInt |     a.mask    := mask(toAddress, lgSize) | ||||||
|     a.data    := UInt(0) |     a.data    := UInt(0) | ||||||
|     (legal, a) |     (legal, a) | ||||||
|   } |   } | ||||||
| @@ -419,7 +419,7 @@ class TLEdgeIn( | |||||||
|     b.size    := lgSize |     b.size    := lgSize | ||||||
|     b.source  := toSource |     b.source  := toSource | ||||||
|     b.address := fromAddress |     b.address := fromAddress | ||||||
|     b.mask    := SInt(-1).asUInt |     b.mask    := mask(fromAddress, lgSize) | ||||||
|     b.data    := UInt(0) |     b.data    := UInt(0) | ||||||
|     (legal, b) |     (legal, b) | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -10,10 +10,10 @@ import uncore.constants.MemoryOpConstants | |||||||
| object ClientStates { | object ClientStates { | ||||||
|   val width = 2 |   val width = 2 | ||||||
|  |  | ||||||
|   val Nothing = UInt(0)  |   val Nothing = UInt(0, width) | ||||||
|   val Branch  = UInt(1) |   val Branch  = UInt(1, width) | ||||||
|   val Trunk   = UInt(2) |   val Trunk   = UInt(2, width) | ||||||
|   val Dirty   = UInt(3) |   val Dirty   = UInt(3, width) | ||||||
|  |  | ||||||
|   def hasReadPermission(state: UInt): Bool = state > Nothing |   def hasReadPermission(state: UInt): Bool = state > Nothing | ||||||
|   def hasWritePermission(state: UInt): Bool = state > Branch |   def hasWritePermission(state: UInt): Bool = state > Branch | ||||||
| @@ -24,7 +24,11 @@ object MemoryOpCategories extends MemoryOpConstants { | |||||||
|   val wi = Cat(Bool(false), Bool(true))  // Future op will write |   val wi = Cat(Bool(false), Bool(true))  // Future op will write | ||||||
|   val rd = Cat(Bool(false), Bool(false)) // Op only reads |   val rd = Cat(Bool(false), Bool(false)) // Op only reads | ||||||
|  |  | ||||||
|   def categorize(cmd: UInt): UInt = Cat(isWrite(cmd), isWriteIntent(cmd)) |   def categorize(cmd: UInt): UInt = { | ||||||
|  |     val cat = Cat(isWrite(cmd), isWriteIntent(cmd)) | ||||||
|  |     assert(cat.isOneOf(wr,wi,rd), "Could not categorize command.") | ||||||
|  |     cat | ||||||
|  |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| /** Stores the client-side coherence information, | /** Stores the client-side coherence information, | ||||||
| @@ -49,7 +53,8 @@ class ClientMetadata extends Bundle { | |||||||
|     import MemoryOpCategories._ |     import MemoryOpCategories._ | ||||||
|     import TLPermissions._ |     import TLPermissions._ | ||||||
|     import ClientStates._ |     import ClientStates._ | ||||||
|     MuxTLookup(Cat(categorize(cmd), state), (Bool(false), UInt(0)), Seq( |     val c = categorize(cmd) | ||||||
|  |     MuxTLookup(Cat(c, state), (Bool(false), UInt(0)), Seq( | ||||||
|     //(effect, am now) -> (was a hit,   next) |     //(effect, am now) -> (was a hit,   next) | ||||||
|       Cat(rd, Dirty)   -> (Bool(true),  Dirty), |       Cat(rd, Dirty)   -> (Bool(true),  Dirty), | ||||||
|       Cat(rd, Trunk)   -> (Bool(true),  Trunk), |       Cat(rd, Trunk)   -> (Bool(true),  Trunk), | ||||||
| @@ -71,7 +76,9 @@ class ClientMetadata extends Bundle { | |||||||
|     import MemoryOpCategories._ |     import MemoryOpCategories._ | ||||||
|     import TLPermissions._ |     import TLPermissions._ | ||||||
|     import ClientStates._ |     import ClientStates._ | ||||||
|     MuxLookup(Cat(categorize(cmd), param), UInt(0), Seq( |     val c = categorize(cmd) | ||||||
|  |     assert(c === rd || param === toT, "Client was expecting trunk permissions.")    | ||||||
|  |     MuxLookup(Cat(c, param), Nothing, Seq( | ||||||
|     //(effect param) -> (next) |     //(effect param) -> (next) | ||||||
|       Cat(rd, toB)   -> Branch, |       Cat(rd, toB)   -> Branch, | ||||||
|       Cat(rd, toT)   -> Trunk, |       Cat(rd, toT)   -> Trunk, | ||||||
| @@ -79,7 +86,6 @@ class ClientMetadata extends Bundle { | |||||||
|       Cat(wr, toT)   -> Dirty)) |       Cat(wr, toT)   -> Dirty)) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |  | ||||||
|   /** Does a secondary miss on the block require another Acquire message */ |   /** Does a secondary miss on the block require another Acquire message */ | ||||||
|   def requiresAcquireOnSecondaryMiss(first_cmd: UInt, second_cmd: UInt): Bool = { |   def requiresAcquireOnSecondaryMiss(first_cmd: UInt, second_cmd: UInt): Bool = { | ||||||
|     import MemoryOpCategories._ |     import MemoryOpCategories._ | ||||||
|   | |||||||
| @@ -29,7 +29,7 @@ class TLMonitor(gen: () => TLBundleSnoop, edge: () => TLEdge, sourceInfo: Source | |||||||
|       assert (bundle.size >= UInt(log2Ceil(edge.manager.beatBytes)), "'A' channel Acquire smaller than a beat" + extra) |       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" + extra) |       assert (is_aligned, "'A' channel Acquire address not aligned to size" + extra) | ||||||
|       assert (TLPermissions.isGrow(bundle.param), "'A' channel Acquire carries invalid grow param" + extra) |       assert (TLPermissions.isGrow(bundle.param), "'A' channel Acquire carries invalid grow param" + extra) | ||||||
|       assert (~bundle.mask === UInt(0), "'A' channel Acquire contains invalid mask" + extra) |       assert (bundle.mask === mask, "'A' channel Acquire contains invalid mask" + extra) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     when (bundle.opcode === TLMessages.Get) { |     when (bundle.opcode === TLMessages.Get) { | ||||||
| @@ -94,7 +94,7 @@ class TLMonitor(gen: () => TLBundleSnoop, edge: () => TLEdge, sourceInfo: Source | |||||||
|       assert (bundle.size >= UInt(log2Ceil(edge.manager.beatBytes)), "'B' channel Probe smaller than a beat" + extra) |       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" + extra) |       assert (is_aligned, "'B' channel Probe address not aligned to size" + extra) | ||||||
|       assert (TLPermissions.isCap(bundle.param), "'B' channel Probe carries invalid cap param" + extra) |       assert (TLPermissions.isCap(bundle.param), "'B' channel Probe carries invalid cap param" + extra) | ||||||
|       assert (~bundle.mask === UInt(0).asUInt, "'B' channel Probe contains invalid mask" + extra) |       assert (bundle.mask === mask, "'B' channel Probe contains invalid mask" + extra) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     when (bundle.opcode === TLMessages.Get) { |     when (bundle.opcode === TLMessages.Get) { | ||||||
| @@ -102,7 +102,7 @@ class TLMonitor(gen: () => TLBundleSnoop, edge: () => TLEdge, sourceInfo: Source | |||||||
|       assert (address_ok, "'B' channel Get carries unmanaged address" + extra) |       assert (address_ok, "'B' channel Get carries unmanaged address" + extra) | ||||||
|       assert (is_aligned, "'B' channel Get address not aligned to size" + extra) |       assert (is_aligned, "'B' channel Get address not aligned to size" + extra) | ||||||
|       assert (bundle.param === UInt(0), "'B' channel Get carries invalid param" + extra) |       assert (bundle.param === UInt(0), "'B' channel Get carries invalid param" + extra) | ||||||
|       assert (bundle.mask === mask, "'A' channel Get contains invalid mask" + extra) |       assert (bundle.mask === mask, "'B' channel Get contains invalid mask" + extra) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     when (bundle.opcode === TLMessages.PutFullData) { |     when (bundle.opcode === TLMessages.PutFullData) { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user