fix Bufferless voluntary release issue
This commit is contained in:
parent
afc51c4a35
commit
51f7bf1511
@ -74,9 +74,9 @@ class BufferlessBroadcastVoluntaryReleaseTracker(trackerId: Int)(implicit p: Par
|
|||||||
|
|
||||||
// A release beat can be accepted if we are idle, if its a mergeable transaction, or if its a tail beat
|
// A release beat can be accepted if we are idle, if its a mergeable transaction, or if its a tail beat
|
||||||
// and if the outer relase path is clear
|
// and if the outer relase path is clear
|
||||||
val irel_could_accept = state === s_idle || irel_can_merge || irel_same_xact
|
io.inner.release.ready := Mux(io.irel().hasData(),
|
||||||
io.inner.release.ready := irel_could_accept &&
|
(state =/= s_idle) && (irel_can_merge || irel_same_xact) && io.outer.release.ready,
|
||||||
(!io.irel().hasData() || io.outer.release.ready)
|
(state === s_idle) || irel_can_merge || irel_same_xact)
|
||||||
|
|
||||||
// Dispatch outer release
|
// Dispatch outer release
|
||||||
outerRelease(coh = outer_coh.onHit(M_XWR), buffering = Bool(false))
|
outerRelease(coh = outer_coh.onHit(M_XWR), buffering = Bool(false))
|
||||||
|
@ -244,11 +244,16 @@ trait AcceptsVoluntaryReleases extends HasVoluntaryReleaseMetadataBuffer {
|
|||||||
|
|
||||||
when(irel_is_allocating) {
|
when(irel_is_allocating) {
|
||||||
xact_addr_block := io.irel().addr_block
|
xact_addr_block := io.irel().addr_block
|
||||||
|
// Set all of them to pending in the beginning as a precaution
|
||||||
|
// If it turns out we don't need some or all of the beats, they will
|
||||||
|
// be overridden below
|
||||||
|
pending_irel_data := ~UInt(0, innerDataBeats)
|
||||||
state := next
|
state := next
|
||||||
}
|
}
|
||||||
|
|
||||||
when(io.inner.release.fire()) {
|
val irel_fire = (irel_is_allocating || irel_is_merging) && io.inner.release.ready
|
||||||
when(io.alloc.irel.should || (irel_can_merge && io.irel().first())) {
|
when (irel_fire) {
|
||||||
|
when (io.irel().first()) {
|
||||||
xact_vol_ir_r_type := io.irel().r_type
|
xact_vol_ir_r_type := io.irel().r_type
|
||||||
xact_vol_ir_src := io.irel().client_id
|
xact_vol_ir_src := io.irel().client_id
|
||||||
xact_vol_ir_client_xact_id := io.irel().client_xact_id
|
xact_vol_ir_client_xact_id := io.irel().client_xact_id
|
||||||
@ -307,7 +312,7 @@ trait EmitsVoluntaryReleases extends HasVoluntaryReleaseMetadataBuffer {
|
|||||||
pending_orel_data(vol_ognt_counter.up.idx),
|
pending_orel_data(vol_ognt_counter.up.idx),
|
||||||
pending_orel_send),
|
pending_orel_send),
|
||||||
// only writebacks need to be forwarded to the outer interface
|
// only writebacks need to be forwarded to the outer interface
|
||||||
(io.alloc.irel.should || io.alloc.irel.matches) &&
|
state =/= s_idle && io.alloc.irel.matches &&
|
||||||
io.irel().hasData() && io.inner.release.valid)
|
io.irel().hasData() && io.inner.release.valid)
|
||||||
|
|
||||||
io.outer.release.bits := coh.makeVoluntaryWriteback(
|
io.outer.release.bits := coh.makeVoluntaryWriteback(
|
||||||
|
Loading…
Reference in New Issue
Block a user