Merge pull request #427 from ucb-bar/put-after-release-bugfix
Fix issue with PutBlock and Release in BroadcastHub
This commit is contained in:
commit
3e08d615f0
@ -6,7 +6,7 @@ import uncore.constants._
|
||||
import uncore.agents._
|
||||
import util._
|
||||
import junctions.HasAddrMapParameters
|
||||
import rocket.HellaCacheIO
|
||||
import rocket._
|
||||
import cde.{Parameters, Field}
|
||||
|
||||
class RegressionIO(implicit val p: Parameters) extends ParameterizedBundle()(p) {
|
||||
@ -72,7 +72,7 @@ class IOGetAfterPutBlockRegression(implicit p: Parameters) extends Regression()(
|
||||
|
||||
io.cache.req.valid := !get_sent && started
|
||||
io.cache.req.bits.addr := UInt(addrMap("io:pbus:TL2:bootrom").start)
|
||||
io.cache.req.bits.typ := UInt(log2Ceil(32 / 8))
|
||||
io.cache.req.bits.typ := MT_WU
|
||||
io.cache.req.bits.cmd := M_XRD
|
||||
io.cache.req.bits.tag := UInt(0)
|
||||
io.cache.invalidate_lr := Bool(false)
|
||||
@ -494,7 +494,7 @@ class ReleaseRegression(implicit p: Parameters) extends Regression()(p) {
|
||||
|
||||
io.cache.req.valid := sending && state.isOneOf(s_write, s_read)
|
||||
io.cache.req.bits.addr := Cat(addr_blocks(req_idx), UInt(0, blockOffset))
|
||||
io.cache.req.bits.typ := UInt(log2Ceil(64 / 8))
|
||||
io.cache.req.bits.typ := MT_D
|
||||
io.cache.req.bits.cmd := Mux(state === s_write, M_XWR, M_XRD)
|
||||
io.cache.req.bits.tag := UInt(0)
|
||||
io.cache.req.bits.data := data(req_idx)
|
||||
@ -625,7 +625,7 @@ class MergedPutRegression(implicit p: Parameters) extends Regression()(p)
|
||||
|
||||
io.cache.req.valid := (state === s_cache_req)
|
||||
io.cache.req.bits.cmd := M_XWR
|
||||
io.cache.req.bits.typ := UInt(log2Ceil(64 / 8))
|
||||
io.cache.req.bits.typ := MT_D
|
||||
io.cache.req.bits.addr := UInt(memStart)
|
||||
io.cache.req.bits.data := UInt(1)
|
||||
io.cache.req.bits.tag := UInt(0)
|
||||
@ -681,6 +681,54 @@ class MergedPutRegression(implicit p: Parameters) extends Regression()(p)
|
||||
io.errored := data_mismatch
|
||||
}
|
||||
|
||||
class PutAfterReleaseRegression(implicit p: Parameters) extends Regression()(p) {
|
||||
val (s_idle :: s_cache_req :: s_cache_resp ::
|
||||
s_write_first_req :: s_delay :: s_write_remaining_req :: s_write_resp ::
|
||||
s_read_req :: s_read_resp :: s_finished :: Nil) = Enum(Bits(), 10)
|
||||
val state = Reg(init = s_idle)
|
||||
|
||||
val (delay_cnt, delay_done) = Counter(state === s_delay, 100)
|
||||
val (write_cnt, write_done) = Counter(
|
||||
io.mem.acquire.fire() && io.mem.acquire.bits.hasData(), tlDataBeats)
|
||||
val (read_cnt, read_done) = Counter(
|
||||
io.mem.grant.fire() && io.mem.grant.bits.hasData(), tlDataBeats)
|
||||
|
||||
when (state === s_idle && io.start) { state := s_cache_req }
|
||||
when (io.cache.req.fire()) { state := s_cache_resp }
|
||||
when (state === s_cache_resp && io.cache.resp.valid) { state := s_write_first_req }
|
||||
when (state === s_write_first_req && io.mem.acquire.ready) { state := s_delay }
|
||||
when (delay_done) { state := s_write_remaining_req }
|
||||
when (write_done) { state := s_write_resp }
|
||||
when (state === s_write_resp && io.mem.grant.valid) { state := s_read_req }
|
||||
when (state === s_read_req && io.mem.acquire.ready) { state := s_read_resp }
|
||||
when (read_done) { state := s_finished }
|
||||
|
||||
io.finished := state === s_finished
|
||||
|
||||
io.cache.req.valid := state === s_cache_req
|
||||
io.cache.req.bits.cmd := M_XWR
|
||||
io.cache.req.bits.addr := UInt(memStart)
|
||||
io.cache.req.bits.typ := MT_D
|
||||
io.cache.req.bits.tag := UInt(0)
|
||||
io.cache.req.bits.data := UInt(0)
|
||||
|
||||
io.mem.acquire.valid := state.isOneOf(s_write_first_req, s_write_remaining_req, s_read_req)
|
||||
io.mem.acquire.bits := Mux(state === s_read_req,
|
||||
GetBlock(
|
||||
client_xact_id = UInt(0),
|
||||
addr_block = UInt(memStartBlock)),
|
||||
PutBlock(
|
||||
client_xact_id = UInt(0),
|
||||
addr_block = UInt(memStartBlock),
|
||||
addr_beat = write_cnt,
|
||||
data = write_cnt + UInt(1)))
|
||||
io.mem.grant.ready := state.isOneOf(s_write_resp, s_read_resp)
|
||||
|
||||
assert(!io.mem.grant.valid || !io.mem.grant.bits.hasData() ||
|
||||
io.mem.grant.bits.data === read_cnt + UInt(1),
|
||||
"PutAfterReleaseRegression: data mismatch")
|
||||
}
|
||||
|
||||
object RegressionTests {
|
||||
def cacheRegressions(implicit p: Parameters) = Seq(
|
||||
Module(new PutBlockMergeRegression),
|
||||
@ -699,7 +747,8 @@ object RegressionTests {
|
||||
Module(new IOGetAfterPutBlockRegression),
|
||||
Module(new WriteMaskedPutBlockRegression),
|
||||
Module(new PutBeforePutBlockRegression),
|
||||
Module(new ReleaseRegression))
|
||||
Module(new ReleaseRegression),
|
||||
Module(new PutAfterReleaseRegression))
|
||||
}
|
||||
|
||||
case object GroundTestRegressions extends Field[Parameters => Seq[Regression]]
|
||||
|
@ -175,6 +175,7 @@ class BufferedBroadcastAcquireTracker(trackerId: Int)(implicit p: Parameters)
|
||||
|
||||
// If there was a writeback, forward it outwards
|
||||
outerRelease(
|
||||
block_orel = pending_put_data(vol_ognt_counter.up.idx),
|
||||
coh = outer_coh.onHit(M_XWR),
|
||||
data = data_buffer(vol_ognt_counter.up.idx))
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user