anchor.diff:        // specified address. when it comes back, the doCommandRule will
         // handle it
         method Action doCommandIndirect(Bit#(64) pointer, Bit#(64) addr);
  +	 let ct <- fetchComplete.reserve.get();
   	 cmd_read_chan.readReq.put(
   				   DmaRequest{pointer: truncate(pointer),
  -	 offset: truncate(addr), burstLen: 8, tag: cmdFetchTag});
  -   	 cmdFetchTag <= cmdFetchTag + 1;
  +	 offset: truncate(addr), burstLen: 8, tag: zeroExtend(unpack(ct))});
         endmethod
      
         method Action doCommandImmediate(Bit#(64) data);
  
positive.code: 	    if (hwenabled) 
  	       seq
  	       if (cmdRing.notEmpty()) 
  		  seq
  		     $display ("cmdFetch handle=%h address=%h burst=%h tag=%h", 
  		      cmdRing.mempointer, cmdRing.bufferlast, 8, cmdFetchTag);
  		     cmd_read_chan.readReq.put(
  			DmaRequest{pointer: cmdRing.mempointer,
  			   offset: cmdRing.bufferlast, burstLen: 8, tag: cmdFetchTagfetchCompletion.reserve()});
  		     cmdRing.popfetch();
  		  endseq
  	       endseq
  	 endseq
     endseq;
  
negative.code:    ServerF#(Bit#(64), Bit#(64)) copyEngine <- mkCopyEngine(dma_read_chan, dma_write_chan);   
     ServerF#(Bit#(64), Bit#(64)) nopEngine <- mkNopEngine();
     ServerF#(Bit#(64), Bit#(64)) echoEngine <- mkEchoEngine();
     CompletionBuffer#(4,void) fetchComplete <- mkCompletionBuffer;
     
     RingBuffer cmdRing <- mkRingBuffer;
     RingBuffer statusRing <- mkRingBuffer;
  