Error grants (#1025)
* CacheCork: an error Grant still says 'toT' even though it is transient Grants with errors must be handled by a client as though no actual permissions were obtained, so that two clients do not both end up believing that they own a block which is only temporarily offline. However, the Grant MESSAGE should still match the request; ie. if you did Acquire.NtoT, the response must be Grant.toT, even though the 'error' bit signals that the Grant actually grants no permissions. This keeps the implementation of request-response tracking in interstitial adapters and FSMs simple, consistent with the way multibeat errors must include all their beats. * Error: handle permissions properly
This commit is contained in:
committed by
GitHub
parent
723af5e6b6
commit
a2dc13669a
@ -59,7 +59,7 @@ class TLError(params: ErrorParams, beatBytes: Int = 4)(implicit p: Parameters) e
|
||||
|
||||
val a_opcodes = Vec(AccessAck, AccessAck, AccessAckData, AccessAckData, AccessAckData, HintAck, Grant)
|
||||
da.bits.opcode := a_opcodes(a.bits.opcode)
|
||||
da.bits.param := UInt(0)
|
||||
da.bits.param := UInt(0) // toT, but error grants must be handled transiently (ie: you don't keep permissions)
|
||||
da.bits.size := a.bits.size
|
||||
da.bits.source := a.bits.source
|
||||
da.bits.sink := UInt(0)
|
||||
@ -70,7 +70,7 @@ class TLError(params: ErrorParams, beatBytes: Int = 4)(implicit p: Parameters) e
|
||||
dc.valid := c.valid && c_last
|
||||
|
||||
dc.bits.opcode := ReleaseAck
|
||||
dc.bits.param := Vec(toN, toN, toB)(c.bits.param)
|
||||
dc.bits.param := Vec(toB, toN, toN)(c.bits.param)
|
||||
dc.bits.size := c.bits.size
|
||||
dc.bits.source := c.bits.source
|
||||
dc.bits.sink := UInt(0)
|
||||
|
Reference in New Issue
Block a user