diff --git a/src/main/scala/uncore/axi4/Fragmenter.scala b/src/main/scala/uncore/axi4/Fragmenter.scala index 0c260069..57015359 100644 --- a/src/main/scala/uncore/axi4/Fragmenter.scala +++ b/src/main/scala/uncore/axi4/Fragmenter.scala @@ -257,13 +257,17 @@ class AXI4FragmenterSideband(maxInFlight: Int, flow: Boolean = false) extends Mo val state = RegInit(PASS) val count = RegInit(UInt(0, width = log2Up(maxInFlight))) + val full = count === UInt(maxInFlight-1) val empty = count === UInt(0) val last = count === UInt(1) io.deq.bits := state(1) || (last && state(0)) // PASS || (last && WAIT) io.deq.valid := !empty - io.enq.ready := empty || (state === FIND) || (state === PASS && io.enq.bits) + io.enq.ready := !full && (empty || (state === FIND) || (state === PASS && io.enq.bits)) + + // WAIT => count > 0 + assert (state =/= WAIT || count =/= UInt(0)) if (flow) { when (io.enq.valid) { @@ -275,7 +279,7 @@ class AXI4FragmenterSideband(maxInFlight: Int, flow: Boolean = false) extends Mo count := count + io.enq.fire() - io.deq.fire() switch (state) { is(PASS) { when (io.enq.valid && !io.enq.bits && empty) { state := FIND } } - is(FIND) { when (io.enq.valid && io.enq.bits) { state := Mux(empty, PASS, WAIT) } } + is(FIND) { when (io.enq.valid && io.enq.bits && !full) { state := Mux(empty, PASS, WAIT) } } is(WAIT) { when (last && io.deq.ready) { state := PASS } } } } diff --git a/src/main/scala/uncore/axi4/Test.scala b/src/main/scala/uncore/axi4/Test.scala index f53617dc..53620ff3 100644 --- a/src/main/scala/uncore/axi4/Test.scala +++ b/src/main/scala/uncore/axi4/Test.scala @@ -47,8 +47,8 @@ class AXI4FullFuzzRAM extends LazyModule model.node := fuzz.node xbar.node := model.node - ram.node := AXI4Fragmenter(lite=false)(TLToAXI4(4,false)(xbar.node)) - gpio.node := AXI4Fragmenter(lite=false)(TLToAXI4(4,true )(xbar.node)) + ram.node := AXI4Fragmenter(lite=false, maxInFlight = 2)(TLToAXI4(4,false)(xbar.node)) + gpio.node := AXI4Fragmenter(lite=false, maxInFlight = 5)(TLToAXI4(4,true )(xbar.node)) lazy val module = new LazyModuleImp(this) with HasUnitTestIO { io.finished := fuzz.module.io.finished