anchor.diff:     Bit#(BurstLenSize) burstLen;
   } ServerRequest#(numeric type indexSize) deriving (Bits, Eq);
   
  -module mkMemReadEngineBuff#(Integer bufferSizeBytes) (MemReadEngine#(busWidth, userWidth, cmdQDepth, numServers))
  +interface MemReadChannel#(numeric type busWidth, numeric type userWidth, numeric type cmdQDepth);
  +   interface PipeOut#(MemRequest)        readReq;
  +   interface PipeIn#(MemData#(busWidth)) readData;
  +   interface MemReadEngineServer#(userWidth) readServer;
  +endinterface
  +
  +module mkMemReadChannel#(Integer bufferSizeBytes, Integer channelNumber) (MemReadChannel#(busWidth, userWidth, cmdQDepth))
      provisos (Div#(busWidth,8,busWidthBytes),
   	     Mul#(busWidthBytes,8,busWidth),
   	     Log#(busWidthBytes,beatShift),
   	     Log#(cmdQDepth,logCmdQDepth),
  -	     Mul#(cmdQDepth,numServers,cmdBuffSz),
  -	     Log#(cmdBuffSz, cmdBuffAddrSz),
  -	     Log#(numServers, serverIdxSz),
  +	     Log#(cmdQDepth, cmdBuffAddrSz),
  +	     Log#(1, serverIdxSz),
   	     Add#(busWidth, 0, userWidth),
   	     Add#(1,logCmdQDepth, outCntSz),
  -	     Add#(1, c__, numServers),
  -	     Add#(b__, TLog#(numServers), cmdBuffAddrSz),
  -	     Add#(e__, TLog#(numServers), TAdd#(1, cmdBuffAddrSz)),
  +	     Add#(1, c__, 1),
  +	     Add#(b__, TLog#(1), cmdBuffAddrSz),
  +	     Add#(e__, TLog#(1), TAdd#(1, cmdBuffAddrSz)),
   	     Add#(a__, serverIdxSz, cmdBuffAddrSz),
  -	     Min#(2,TLog#(numServers),bpc),
  -	     Add#(d__, TLog#(numServers), TAdd#(1, serverIdxSz)),
  +	     Min#(2,TLog#(1),bpc),
  +	     Add#(d__, TLog#(1), TAdd#(1, serverIdxSz)),
   	     Add#(f__, serverIdxSz, MemTagSize));
      let verbose = False;
      let beatShift = fromInteger(valueOf(beatShift));
  
positive.code:       else begin
  	 respCnt <= new_respCnt;
        end
        clientDataFifo[idx].enq(MemDataF { data: d.data, tag: d.tag >> valueOf(serverIdxSz), first: (respCnt == 0), last: l});
     endrule
  
     Vector#(numServers, MemReadEngineServer#(userWidth)) rs;
     for(Integer i = 0; i < valueOf(numServers); i=i+1)
        rs[i] = (interface MemReadEngineServer#(userWidth);
  		  interface Put request;
  		     method Action put(MemengineCmd cmd);
  `ifdef SIMULATION
  
negative.code:    provisos( Mul#(TDiv#(busWidth, 8), 8, busWidth)
  	    ,Add#(1, a__, numServers)
  	    ,Add#(busWidth, 0, userWidth)
  	    ,FunnelPipesPipelined#(1, numServers, MemTypes::MemData#(userWidth), 2)
  	    ,Pipe::FunnelPipesPipelined#(1, numServers, MemTypes::MemRequest, 2)
  	    ,Add#(b__, TLog#(numServers), 6)
        	    );
     let rv <- mkMemReadEngineBuff(valueOf(cmdQDepth) * valueOf(TExp#(BurstLenSize)));
     return rv;
  endmodule
  