anchor.diff:     Vector#(numServers, FIFOF#(MemDataF#(userWidth))) clientDataFifo <- replicateM(mkSizedBRAMFIFOF(bufferSizeBeats));
      Vector#(numServers, FIFO#(MemengineCmd)) clientRequest <- replicateM(mkFIFO());
      Vector#(numServers, Reg#(Bit#(32)))      clientLen <- replicateM(mkReg(unpack(0)));
  -   Vector#(numServers, Reg#(Bit#(32))) clientBase <- replicateM(mkReg(unpack(0)));
  +   Vector#(numServers, Reg#(Bit#(32)))      clientBase <- replicateM(mkReg(unpack(0)));
  +   Vector#(numServers, Reg#(NextReq))       clientNext <- replicateM(mkReg(unpack(0)));
      
      FIFO#(Tuple4#(Bit#(serverIdxSz),Bool,Bool,Bit#(BurstLenSize)))              serverCheckAvail <- mkSizedFIFO(1);
      FIFO#(Tuple6#(Bit#(serverIdxSz),SGLId,Bit#(32),Bit#(MemTagSize),Bool,Bit#(BurstLenSize))) serverRequest <- mkSizedFIFO(valueOf(cmdQDepth));
  
positive.code:    endrule
  
     // should use an EHR for clientInFlight to avoid the need for this pragma
     (* descending_urgency = "load_ctxt_c, store_cmd" *)
     rule load_ctxt_c;
        match {.idx, .cond0,.last_burst,.cmd_len} <- toGet(serverCheckAvail).get;
        if  (cond0) begin
  	 if (verbose) $display("mkMemReadEngineBuff::%d load_ctxt_c clientLen %d idx %d cond0 %d last_burst %d", counter, clientLen[idx], idx, cond0, last_burst);
  	 serverRequest.enq(tuple6(idx,clientCommand[idx].sglId,clientBase[idx],clientCommand[idx].tag,last_burst,cmd_len));
           clientBase[idx] <= clientBase[idx] + extend(cmd_len);
           clientLen[idx] <= clientLen[idx] - extend(cmd_len);
  	 if (last_burst) begin
  	    if (verbose) $display("mkMemReadEngineBuff::%d load_ctxt_b last_burst %d", counter, last_burst);
  	    clientInFlight[idx] <= False;
  	 end
        end
  
negative.code:    return rv;
  endmodule
  
  typedef struct {
      Bit#(BurstLenSize) len;
      Bool               last;
  } NextReq deriving (Bits, Eq);
  
  function NextReq getNext(Bit#(32) len, Bit#(BurstLenSize) burst);
     NextReq v;
     v.last = (len <= extend(burst));
     v.len = v.last ? truncate(len) : burst;
     return v;
  endfunction
  
  module mkMemReadEngineBuff#(Integer bufferSizeBytes) (MemReadEngine#(busWidth, userWidth, cmdQDepth, numServers))
     provisos (Div#(busWidth,8,busWidthBytes),
  	     Mul#(busWidthBytes,8,busWidth),
  