anchor.diff:  	 method rresp = s.rresp;
   	 method rvalid = s.rvalid;
   	 method wdata = s.wdata;
  +	 //method wid = s.wid; //wid not present in Axi4
   	 method wlast = s.wlast;
   	 method wready = s.wready;
   	 method wvalid = s.wvalid;
   	 method wstrb = s.wstrb;
  +	 interface Ps8SaxigpExtra extra;
  +		 method aruser = s.aruser;
  +		 method awuser = s.awuser;
  +	 endinterface
   	 endinterface);
      endfunction
   endinstance
   
   //FIXME extra aruser awuser
  -instance MkPhysMemSlave#(Axi4SlaveBits#(49,128,6,Empty),addrWidth,DataBusWidth)
  +instance MkPhysMemSlave#(Axi4SlaveBits#(49,128,6,Ps8SaxigpExtra),addrWidth,DataBusWidth)
         provisos (Add#(addrWidth,a__,49));
  -   module mkPhysMemSlave#(Axi4SlaveBits#(49,128,6,Empty) axiSlave)(PhysMemSlave#(addrWidth,DataBusWidth));
  +   module mkPhysMemSlave#(Axi4SlaveBits#(49,128,6,Ps8SaxigpExtra) axiSlave)(PhysMemSlave#(addrWidth,DataBusWidth));
         FIFOF#(PhysMemRequest#(addrWidth,DataBusWidth)) arfifo <- mkAxiFifoF();
         FIFOF#(MemData#(DataBusWidth)) rfifo <- mkAxiFifoF();
         FIFOF#(PhysMemRequest#(addrWidth,DataBusWidth)) awfifo <- mkAxiFifoF();
         FIFOF#(MemData#(DataBusWidth)) wfifo <- mkAxiFifoF();
         FIFOF#(Bit#(MemTagSize)) bfifo <- mkAxiFifoF();
  -      FIFOF#(Bit#(MemTagSize)) rtagfifo <- mkAxiFifoF();
  +
         FIFOF#(Bit#(MemTagSize)) wtagfifo <- mkAxiFifoF();
   
  +      FIFOF#(Bool) arInFlight <- mkSizedFIFOF(valueOf(TExp#(MemTagSize)));
  +
  +	Probe#(Bit#(1)) arNF <- mkProbe();
  +	Probe#(Bit#(1)) arNE <- mkProbe();
  +	Probe#(Bit#(1)) rNF <- mkProbe();
  +	Probe#(Bit#(1)) rNE <- mkProbe();
  +	Probe#(Bit#(1)) awNF <- mkProbe();
  +	Probe#(Bit#(1)) awNE <- mkProbe();
  +	Probe#(Bit#(1)) wNF <- mkProbe();
  +	Probe#(Bit#(1)) wNE <- mkProbe();
  +	Probe#(Bit#(1)) bNF <- mkProbe();
  +	Probe#(Bit#(1)) bNE <- mkProbe();
  +	Probe#(Bit#(1)) arInFlightNF <- mkProbe();
  +	Probe#(Bit#(1)) arInFlightNE <- mkProbe();
  +	Probe#(Bit#(1)) wtagNF <- mkProbe();
  +	Probe#(Bit#(1)) wtagNE <- mkProbe();
  +
  +	rule probe_val;
  +		arNF <= pack(arfifo.notFull());
  +		arNE <= pack(arfifo.notEmpty());
  +		rNF <= pack(rfifo.notFull());
  +		rNE <= pack(rfifo.notEmpty());
  +		awNF <= pack(awfifo.notFull());
  +		awNE <= pack(awfifo.notEmpty());
  +		wNF <= pack(wfifo.notFull());
  +		wNE <= pack(wfifo.notEmpty());
  +		bNF <= pack(bfifo.notFull());
  +		bNE <= pack(bfifo.notEmpty());
  +		
  +		arInFlightNF <= pack(arInFlight.notFull());
  +		arInFlightNE <= pack(arInFlight.notEmpty());
  +		wtagNF <= pack(wtagfifo.notFull());
  +		wtagNE <= pack(wtagfifo.notEmpty());
  +	endrule
  +
         rule rl_arvalid_araddr;
  -	 axiSlave.arvalid(pack(arfifo.notEmpty && rtagfifo.notFull));
  +	 axiSlave.arvalid(pack(arfifo.notEmpty && arInFlight.notFull));
         endrule
         rule rl_arfifo if (axiSlave.arready() == 1);
   	 let req <- toGet(arfifo).get();
  
positive.code: 	 axiSlave.awid(axireq.id);
  	 axiSlave.awsize(axireq.size);
  	 axiSlave.awlen(axireq.len);
  	 axiSlave.awburst(2'b01);   //FIXME
  	 axiSlave.awcache(4'b0011); //FIXME
  	 //FIXME axiSlave.extra.awuser();
  	 wtagfifo.enq(req.tag);
        endrule
        rule rl_wvalid;
  
negative.code:       endrule
        rule rl_wdata if (axiSlave.wready() == 1);
  	 let wdata = wfifo.first.data;
  	 let last = wfifo.first.last;
  	 wfifo.deq();
  	 axiSlave.wdata(extend(wdata));
  	 axiSlave.wlast(pack(last));
  	 axiSlave.wstrb(16'hFFFF); // using full 128-bit
        endrule
        rule rl_bready;
  	 axiSlave.bready(pack(wtagfifo.notEmpty && bfifo.notFull));
  