Index: trunk/modules/vci_mem_cache/caba/source/include/vci_mem_cache.h
===================================================================
--- trunk/modules/vci_mem_cache/caba/source/include/vci_mem_cache.h	(revision 468)
+++ trunk/modules/vci_mem_cache/caba/source/include/vci_mem_cache.h	(revision 481)
@@ -104,5 +104,7 @@
         TGT_RSP_XRAM,
         TGT_RSP_MULTI_ACK,
-        TGT_RSP_CLEANUP
+        TGT_RSP_CLEANUP,
+        TGT_RSP_UPT_LOCK,
+        TGT_RSP_IVT_LOCK
       };
 
@@ -333,5 +335,6 @@
         ALLOC_UPT_WRITE,
         ALLOC_UPT_CAS,
-        ALLOC_UPT_MULTI_ACK
+        ALLOC_UPT_MULTI_ACK,
+        ALLOC_UPT_TGT_RSP
       };
 
@@ -343,5 +346,6 @@
         ALLOC_IVT_CLEANUP,
         ALLOC_IVT_CAS,
-        ALLOC_IVT_CONFIG
+        ALLOC_IVT_CONFIG,
+        ALLOC_IVT_TGT_RSP
       };
 
@@ -492,4 +496,6 @@
       void genMoore();
       void check_monitor(addr_t addr, data_t data, bool read);
+      bool hit_cleanup_req(size_t *index);
+      bool hit_multi_ack_req(size_t *index);
 
       // Component attributes
@@ -510,4 +516,5 @@
       TransactionTab                     m_trt;              // xram transaction table
       uint32_t                           m_upt_lines;
+      uint32_t                           m_ivt_lines;
       UpdateTab                          m_upt;              // pending update
       UpdateTab                          m_ivt;              // pending invalidate
@@ -736,5 +743,5 @@
 
       // Buffer between MULTI_ACK fsm and TGT_RSP fsm (complete write/update transaction)
-      sc_signal<bool>     r_multi_ack_to_tgt_rsp_req;   // valid request
+      sc_signal<bool>     *r_multi_ack_to_tgt_rsp_req;  // valid request
       sc_signal<size_t>   r_multi_ack_to_tgt_rsp_srcid; // Transaction srcid
       sc_signal<size_t>   r_multi_ack_to_tgt_rsp_trdid; // Transaction trdid
@@ -784,5 +791,5 @@
        
       // Buffer between CLEANUP fsm and TGT_RSP fsm (acknowledge a write command from L1)
-      sc_signal<bool>     r_cleanup_to_tgt_rsp_req;   // valid request
+      sc_signal<bool>     *r_cleanup_to_tgt_rsp_req;   // valid request
       sc_signal<size_t>   r_cleanup_to_tgt_rsp_srcid; // transaction srcid
       sc_signal<size_t>   r_cleanup_to_tgt_rsp_trdid; // transaction trdid
@@ -919,4 +926,6 @@
       sc_signal<int>      r_tgt_rsp_fsm;
       sc_signal<size_t>   r_tgt_rsp_cpt;
+      sc_signal<size_t>   r_tgt_rsp_prio_multi_ack;
+      sc_signal<size_t>   r_tgt_rsp_prio_cleanup;
       sc_signal<bool>     r_tgt_rsp_key_sent;
 
Index: trunk/modules/vci_mem_cache/caba/source/src/vci_mem_cache.cpp
===================================================================
--- trunk/modules/vci_mem_cache/caba/source/src/vci_mem_cache.cpp	(revision 468)
+++ trunk/modules/vci_mem_cache/caba/source/src/vci_mem_cache.cpp	(revision 481)
@@ -84,5 +84,7 @@
   "TGT_RSP_XRAM",
   "TGT_RSP_MULTI_ACK",
-  "TGT_RSP_CLEANUP"
+  "TGT_RSP_CLEANUP",
+  "TGT_RSP_UPT_LOCK",
+  "TGT_RSP_IVT_LOCK"
 };
 const char *cc_receive_fsm_str[] =
@@ -285,5 +287,6 @@
   "ALLOC_UPT_WRITE",
   "ALLOC_UPT_CAS",
-  "ALLOC_UPT_MULTI_ACK"
+  "ALLOC_UPT_MULTI_ACK",
+  "ALLOC_UPT_TGT_RSP"
 };
 const char *alloc_ivt_fsm_str[] =
@@ -293,5 +296,6 @@
   "ALLOC_IVT_CLEANUP",
   "ALLOC_IVT_CAS",
-  "ALLOC_IVT_CONFIG"
+  "ALLOC_IVT_CONFIG",
+  "ALLOC_IVT_TGT_RSP"
 };
 const char *alloc_heap_fsm_str[] =
@@ -361,4 +365,5 @@
     m_trt(this->name(), trt_lines, nwords),
     m_upt_lines(upt_lines),
+    m_ivt_lines(ivt_lines),
     m_upt(upt_lines),
     m_ivt(ivt_lines),
@@ -502,4 +507,7 @@
         i++;
     }
+    // Allocation for MULTI_ACK FSM
+    r_multi_ack_to_tgt_rsp_req = new sc_signal<bool>[m_upt_lines];
+    r_cleanup_to_tgt_rsp_req   = new sc_signal<bool>[m_ivt_lines];
 
     // Allocation for IXR_RSP FSM
@@ -571,4 +579,39 @@
               << " at cycle " << std::dec << m_cpt_cycles << std::endl;
   }
+}
+// Index is the value of the current priority
+///////////////////////////////////////////////////////////////////////
+tmpl(bool) ::hit_cleanup_req(size_t *index)
+///////////////////////////////////////////////////////////////////////
+{
+  size_t i = *index;
+  do
+  {
+    if(r_cleanup_to_tgt_rsp_req[i].read())
+    {
+      *index = i;
+      return true;
+    }
+    i = (i + 1) % m_ivt_lines;
+  } while (i != *index);
+  return false;
+}
+
+// Index is the value of the current priority
+///////////////////////////////////////////////////////////////////////
+tmpl(bool) ::hit_multi_ack_req(size_t *index)
+///////////////////////////////////////////////////////////////////////
+{
+  size_t i = *index;
+  do
+  {
+    if(r_multi_ack_to_tgt_rsp_req[i].read())
+    {
+      *index = i;
+      return true;
+    }
+    i = (i + 1) % m_upt_lines;
+  } while (i != *index);
+  return false;
 }
 
@@ -674,5 +717,6 @@
 {
   delete [] r_ixr_rsp_to_xram_rsp_rok;
-
+  delete [] r_multi_ack_to_tgt_rsp_req;
+  delete [] r_cleanup_to_tgt_rsp_req;
   delete [] r_xram_rsp_victim_data;
   delete [] r_xram_rsp_to_tgt_rsp_data;
@@ -776,9 +820,13 @@
 #endif
 
-    r_cleanup_to_tgt_rsp_req      = false;
-
     m_cc_receive_to_cleanup_fifo.init();
-
-    r_multi_ack_to_tgt_rsp_req     = false;
+    for(size_t i = 0; i < m_upt_lines; i++)
+    {
+      r_multi_ack_to_tgt_rsp_req[i] = false;
+    }
+    for(size_t i = 0; i < m_ivt_lines; i++)
+    {
+      r_cleanup_to_tgt_rsp_req[i] = false;
+    }
 
     m_cc_receive_to_multi_ack_fifo.init();
@@ -818,5 +866,7 @@
     r_alloc_heap_reset_cpt = 0;
 
-    r_tgt_rsp_key_sent  = false;
+    r_tgt_rsp_key_sent        = false;
+    r_tgt_rsp_prio_multi_ack  = 0;
+    r_tgt_rsp_prio_cleanup  = 0;
 
     // Activity counters
@@ -1337,4 +1387,6 @@
         size_t count = 0;
         bool valid   = m_upt.decrement(r_multi_ack_upt_index.read(), count);
+        
+        bool need_rsp     = m_upt.need_rsp(r_multi_ack_upt_index.read());
 
         if(not valid)
@@ -1346,5 +1398,9 @@
         }
 
-        if(count == 0)
+        if(count == 0 and need_rsp)
+        {
+          r_multi_ack_fsm = MULTI_ACK_WRITE_RSP;
+        }
+        else if(count == 0)
         {
           r_multi_ack_fsm = MULTI_ACK_UPT_CLEAR;
@@ -1380,5 +1436,4 @@
         r_multi_ack_pktid = m_upt.pktid(r_multi_ack_upt_index.read());
         r_multi_ack_nline = m_upt.nline(r_multi_ack_upt_index.read());
-        bool need_rsp     = m_upt.need_rsp(r_multi_ack_upt_index.read());
         bool need_ack     = m_upt.need_ack(r_multi_ack_upt_index.read());
 
@@ -1386,6 +1441,5 @@
         m_upt.clear(r_multi_ack_upt_index.read());
 
-        if      ( need_rsp ) r_multi_ack_fsm = MULTI_ACK_WRITE_RSP;
-        else if ( need_ack ) r_multi_ack_fsm = MULTI_ACK_CONFIG_ACK;
+        if ( need_ack )      r_multi_ack_fsm = MULTI_ACK_CONFIG_ACK;
         else                 r_multi_ack_fsm = MULTI_ACK_IDLE;
 
@@ -1400,19 +1454,13 @@
     /////////////////////////
     case MULTI_ACK_WRITE_RSP:     // Post a response request to TGT_RSP FSM
-                                  // Wait if pending request 
-    {
-        if ( r_multi_ack_to_tgt_rsp_req.read() ) break;
-
-        r_multi_ack_to_tgt_rsp_req   = true;
-        r_multi_ack_to_tgt_rsp_srcid = r_multi_ack_srcid.read();
-        r_multi_ack_to_tgt_rsp_trdid = r_multi_ack_trdid.read();
-        r_multi_ack_to_tgt_rsp_pktid = r_multi_ack_pktid.read();
-        r_multi_ack_fsm              = MULTI_ACK_IDLE;
+    {
+        r_multi_ack_to_tgt_rsp_req[r_multi_ack_upt_index.read()]   = true;
+        r_multi_ack_fsm = MULTI_ACK_IDLE;
 
 #if DEBUG_MEMC_MULTI_ACK
 if(m_debug)
 std::cout << "  <MEMC " << name() << " MULTI_ACK_WRITE_RSP>"
-          << " Request TGT_RSP FSM to send a response to srcid "
-          << std::hex << r_multi_ack_srcid.read() << std::endl;
+          << " Request TGT_RSP FSM to send a response" 
+          << " / Request for upt index " << r_multi_ack_upt_index.read() << std::endl;
 #endif
         break;
@@ -4913,6 +4961,10 @@
       size_t count = 0;
       m_ivt.decrement(r_cleanup_index.read(), count);
-
-      if(count == 0)   // multi inval transaction completed
+      
+      if((count == 0) and r_cleanup_need_rsp.read())   // multi inval transaction completed
+      {
+        r_cleanup_fsm = CLEANUP_WRITE_RSP;
+      }
+      else if(count == 0)   // multi inval transaction completed
       {
         r_cleanup_fsm = CLEANUP_IVT_CLEAR;
@@ -4948,6 +5000,5 @@
       m_ivt.clear(r_cleanup_index.read());
 
-      if      ( r_cleanup_need_rsp.read() ) r_cleanup_fsm = CLEANUP_WRITE_RSP;
-      else if ( r_cleanup_need_ack.read() ) r_cleanup_fsm = CLEANUP_CONFIG_ACK;
+      if ( r_cleanup_need_ack.read() )      r_cleanup_fsm = CLEANUP_CONFIG_ACK;
       else                                  r_cleanup_fsm = CLEANUP_SEND_CLACK;
 
@@ -4964,11 +5015,7 @@
                                // wait if pending request to the TGT_RSP FSM
     {
-      if(r_cleanup_to_tgt_rsp_req.read()) break;
 
       // no pending request
-      r_cleanup_to_tgt_rsp_req     = true;
-      r_cleanup_to_tgt_rsp_srcid   = r_cleanup_write_srcid.read();
-      r_cleanup_to_tgt_rsp_trdid   = r_cleanup_write_trdid.read();
-      r_cleanup_to_tgt_rsp_pktid   = r_cleanup_write_pktid.read();
+      r_cleanup_to_tgt_rsp_req[r_cleanup_index.read()]     = true;
 
       r_cleanup_fsm                = CLEANUP_SEND_CLACK;
@@ -4977,8 +5024,6 @@
 if(m_debug)
 std::cout << "  <MEMC " << name() << " CLEANUP_WRITE_RSP>"
-          << " Send a response to a previous write request: "
-          << " rsrcid = "   << std::hex << r_cleanup_write_srcid.read()
-          << " / rtrdid = " << r_cleanup_write_trdid.read()
-          << " / rpktid = " << r_cleanup_write_pktid.read() << std::endl;
+          << " Send a response to a previous write request"
+          << std::endl;
 #endif
       break;
@@ -6485,4 +6530,6 @@
     case TGT_RSP_CONFIG_IDLE:  // tgt_cmd requests have the highest priority
     {
+      size_t prio_multi_ack = r_tgt_rsp_prio_multi_ack.read();
+      size_t prio_cleanup   = r_tgt_rsp_prio_cleanup.read();
       if(r_tgt_cmd_to_tgt_rsp_req) r_tgt_rsp_fsm = TGT_RSP_TGT_CMD;
       else if(r_read_to_tgt_rsp_req)
@@ -6498,6 +6545,15 @@
         r_tgt_rsp_cpt = r_xram_rsp_to_tgt_rsp_word.read();
       }
-      else if(r_multi_ack_to_tgt_rsp_req) r_tgt_rsp_fsm = TGT_RSP_MULTI_ACK;
-      else if(r_cleanup_to_tgt_rsp_req)   r_tgt_rsp_fsm = TGT_RSP_CLEANUP;
+      else if(hit_multi_ack_req(&prio_multi_ack))
+      {
+        r_tgt_rsp_fsm = TGT_RSP_UPT_LOCK;
+        // update rr priority
+        r_tgt_rsp_prio_multi_ack = prio_multi_ack;
+      }
+      else if(hit_cleanup_req(&prio_cleanup))
+      {
+        r_tgt_rsp_fsm = TGT_RSP_IVT_LOCK;
+        r_tgt_rsp_prio_cleanup = prio_cleanup;
+      }
       else if(r_config_to_tgt_rsp_req)    r_tgt_rsp_fsm = TGT_RSP_CONFIG;
       break;
@@ -6506,4 +6562,6 @@
     case TGT_RSP_TGT_CMD_IDLE: // read requests have the highest priority
     {
+      size_t prio_multi_ack = r_tgt_rsp_prio_multi_ack.read();
+      size_t prio_cleanup   = r_tgt_rsp_prio_cleanup.read();
       if(r_read_to_tgt_rsp_req)
       {
@@ -6518,6 +6576,15 @@
         r_tgt_rsp_cpt = r_xram_rsp_to_tgt_rsp_word.read();
       }
-      else if(r_multi_ack_to_tgt_rsp_req) r_tgt_rsp_fsm = TGT_RSP_MULTI_ACK;
-      else if(r_cleanup_to_tgt_rsp_req)   r_tgt_rsp_fsm = TGT_RSP_CLEANUP;
+      else if(hit_multi_ack_req(&prio_multi_ack))
+      {
+        r_tgt_rsp_fsm = TGT_RSP_UPT_LOCK;
+        // update rr priority
+        r_tgt_rsp_prio_multi_ack = prio_multi_ack;
+      }
+      else if(hit_cleanup_req(&prio_cleanup))
+      {
+        r_tgt_rsp_fsm = TGT_RSP_IVT_LOCK;
+        r_tgt_rsp_prio_cleanup = prio_cleanup;
+      }
       else if(r_config_to_tgt_rsp_req)    r_tgt_rsp_fsm = TGT_RSP_CONFIG;
       else if(r_tgt_cmd_to_tgt_rsp_req)   r_tgt_rsp_fsm = TGT_RSP_TGT_CMD;
@@ -6527,4 +6594,6 @@
     case TGT_RSP_READ_IDLE: // write requests have the highest priority
     {
+      size_t prio_multi_ack = r_tgt_rsp_prio_multi_ack.read();
+      size_t prio_cleanup   = r_tgt_rsp_prio_cleanup.read();
       if(r_write_to_tgt_rsp_req)          r_tgt_rsp_fsm = TGT_RSP_WRITE;
       else if(r_cas_to_tgt_rsp_req)       r_tgt_rsp_fsm = TGT_RSP_CAS;
@@ -6534,6 +6603,15 @@
         r_tgt_rsp_cpt = r_xram_rsp_to_tgt_rsp_word.read();
       }
-      else if(r_multi_ack_to_tgt_rsp_req) r_tgt_rsp_fsm = TGT_RSP_MULTI_ACK;
-      else if(r_cleanup_to_tgt_rsp_req)   r_tgt_rsp_fsm = TGT_RSP_CLEANUP;
+      else if(hit_multi_ack_req(&prio_multi_ack))
+      {
+        r_tgt_rsp_fsm = TGT_RSP_UPT_LOCK;
+        // update rr priority
+        r_tgt_rsp_prio_multi_ack = prio_multi_ack;
+      }
+      else if(hit_cleanup_req(&prio_cleanup))
+      {
+        r_tgt_rsp_fsm = TGT_RSP_IVT_LOCK;
+        r_tgt_rsp_prio_cleanup = prio_cleanup;
+      }
       else if(r_config_to_tgt_rsp_req)    r_tgt_rsp_fsm = TGT_RSP_CONFIG;
       else if(r_tgt_cmd_to_tgt_rsp_req)   r_tgt_rsp_fsm = TGT_RSP_TGT_CMD;
@@ -6548,4 +6626,6 @@
     case TGT_RSP_WRITE_IDLE: // cas requests have the highest priority
     {
+      size_t prio_multi_ack = r_tgt_rsp_prio_multi_ack.read();
+      size_t prio_cleanup   = r_tgt_rsp_prio_cleanup.read();
       if(r_cas_to_tgt_rsp_req)            r_tgt_rsp_fsm = TGT_RSP_CAS;
       else if(r_xram_rsp_to_tgt_rsp_req)
@@ -6554,6 +6634,15 @@
         r_tgt_rsp_cpt = r_xram_rsp_to_tgt_rsp_word.read();
       }
-      else if(r_multi_ack_to_tgt_rsp_req) r_tgt_rsp_fsm = TGT_RSP_MULTI_ACK;
-      else if(r_cleanup_to_tgt_rsp_req)   r_tgt_rsp_fsm = TGT_RSP_CLEANUP;
+      else if(hit_multi_ack_req(&prio_multi_ack))
+      {
+        r_tgt_rsp_fsm = TGT_RSP_UPT_LOCK;
+        // update rr priority
+        r_tgt_rsp_prio_multi_ack = prio_multi_ack;
+      }
+      else if(hit_cleanup_req(&prio_cleanup))
+      {
+        r_tgt_rsp_fsm = TGT_RSP_IVT_LOCK;
+        r_tgt_rsp_prio_cleanup = prio_cleanup;
+      }
       else if(r_config_to_tgt_rsp_req)    r_tgt_rsp_fsm = TGT_RSP_CONFIG;
       else if(r_tgt_cmd_to_tgt_rsp_req)   r_tgt_rsp_fsm = TGT_RSP_TGT_CMD;
@@ -6569,4 +6658,6 @@
     case TGT_RSP_CAS_IDLE: // xram_rsp requests have the highest priority
     {
+      size_t prio_multi_ack = r_tgt_rsp_prio_multi_ack.read();
+      size_t prio_cleanup   = r_tgt_rsp_prio_cleanup.read();
       if(r_xram_rsp_to_tgt_rsp_req)
       {
@@ -6574,6 +6665,15 @@
         r_tgt_rsp_cpt = r_xram_rsp_to_tgt_rsp_word.read();
       }
-      else if(r_multi_ack_to_tgt_rsp_req) r_tgt_rsp_fsm = TGT_RSP_MULTI_ACK   ;
-      else if(r_cleanup_to_tgt_rsp_req)   r_tgt_rsp_fsm = TGT_RSP_CLEANUP;
+      else if(hit_multi_ack_req(&prio_multi_ack))
+      {
+        r_tgt_rsp_fsm = TGT_RSP_UPT_LOCK;
+        // update rr priority
+        r_tgt_rsp_prio_multi_ack = prio_multi_ack;
+      }
+      else if(hit_cleanup_req(&prio_cleanup))
+      {
+        r_tgt_rsp_fsm = TGT_RSP_IVT_LOCK;
+        r_tgt_rsp_prio_cleanup = prio_cleanup;
+      }
       else if(r_config_to_tgt_rsp_req)    r_tgt_rsp_fsm = TGT_RSP_CONFIG;
       else if(r_tgt_cmd_to_tgt_rsp_req)   r_tgt_rsp_fsm = TGT_RSP_TGT_CMD;
@@ -6590,7 +6690,18 @@
     case TGT_RSP_XRAM_IDLE: // multi ack requests have the highest priority
     {
-
-      if(r_multi_ack_to_tgt_rsp_req)      r_tgt_rsp_fsm = TGT_RSP_MULTI_ACK   ;
-      else if(r_cleanup_to_tgt_rsp_req)   r_tgt_rsp_fsm = TGT_RSP_CLEANUP;
+      size_t prio_multi_ack = r_tgt_rsp_prio_multi_ack.read();
+      size_t prio_cleanup   = r_tgt_rsp_prio_cleanup.read();
+
+      if(hit_multi_ack_req(&prio_multi_ack))
+      {
+        r_tgt_rsp_fsm = TGT_RSP_UPT_LOCK;
+        // update rr priority
+        r_tgt_rsp_prio_multi_ack = prio_multi_ack;
+      }
+      else if(hit_cleanup_req(&prio_cleanup))
+      {
+        r_tgt_rsp_fsm = TGT_RSP_IVT_LOCK;
+        r_tgt_rsp_prio_cleanup = prio_cleanup;
+      }
       else if(r_config_to_tgt_rsp_req)    r_tgt_rsp_fsm = TGT_RSP_CONFIG;
       else if(r_tgt_cmd_to_tgt_rsp_req)   r_tgt_rsp_fsm = TGT_RSP_TGT_CMD;
@@ -6612,5 +6723,11 @@
     case TGT_RSP_MULTI_ACK_IDLE: // cleanup requests have the highest priority
     {
-      if(r_cleanup_to_tgt_rsp_req)        r_tgt_rsp_fsm = TGT_RSP_CLEANUP;
+      size_t prio_multi_ack = r_tgt_rsp_prio_multi_ack.read();
+      size_t prio_cleanup   = r_tgt_rsp_prio_cleanup.read();
+      if(hit_cleanup_req(&prio_cleanup))
+      {
+        r_tgt_rsp_fsm = TGT_RSP_IVT_LOCK;
+        r_tgt_rsp_prio_cleanup = prio_cleanup;
+      }
       else if(r_config_to_tgt_rsp_req)    r_tgt_rsp_fsm = TGT_RSP_CONFIG;
       else if(r_tgt_cmd_to_tgt_rsp_req)   r_tgt_rsp_fsm = TGT_RSP_TGT_CMD;
@@ -6627,5 +6744,10 @@
         r_tgt_rsp_cpt = r_xram_rsp_to_tgt_rsp_word.read();
       }
-      else if(r_multi_ack_to_tgt_rsp_req) r_tgt_rsp_fsm = TGT_RSP_MULTI_ACK;
+      else if(hit_multi_ack_req(&prio_multi_ack))
+      {
+        r_tgt_rsp_fsm = TGT_RSP_UPT_LOCK;
+        // update rr priority
+        r_tgt_rsp_prio_multi_ack = prio_multi_ack;
+      }
       break;
     }
@@ -6633,4 +6755,6 @@
     case TGT_RSP_CLEANUP_IDLE: // tgt cmd requests have the highest priority
     {
+      size_t prio_multi_ack = r_tgt_rsp_prio_multi_ack.read();
+      size_t prio_cleanup   = r_tgt_rsp_prio_cleanup.read();
       if(r_config_to_tgt_rsp_req)         r_tgt_rsp_fsm = TGT_RSP_CONFIG;
       else if(r_tgt_cmd_to_tgt_rsp_req)   r_tgt_rsp_fsm = TGT_RSP_TGT_CMD;
@@ -6647,6 +6771,15 @@
         r_tgt_rsp_cpt = r_xram_rsp_to_tgt_rsp_word.read();
       }
-      else if(r_multi_ack_to_tgt_rsp_req) r_tgt_rsp_fsm = TGT_RSP_MULTI_ACK   ;
-      else if(r_cleanup_to_tgt_rsp_req)   r_tgt_rsp_fsm = TGT_RSP_CLEANUP;
+      else if(hit_multi_ack_req(&prio_multi_ack))
+      {
+        r_tgt_rsp_fsm = TGT_RSP_UPT_LOCK;
+        // update rr priority
+        r_tgt_rsp_prio_multi_ack = prio_multi_ack;
+      }
+      else if(hit_cleanup_req(&prio_cleanup))
+      {
+        r_tgt_rsp_fsm = TGT_RSP_IVT_LOCK;
+        r_tgt_rsp_prio_cleanup = prio_cleanup;
+      }
       break;
     }
@@ -6761,4 +6894,20 @@
       break;
     }
+    
+    ///////////////////////
+    case TGT_RSP_IVT_LOCK:      // Clear IVT entry
+    {
+      if (r_alloc_ivt_fsm.read() != ALLOC_IVT_TGT_RSP) break;
+
+      r_cleanup_to_tgt_rsp_srcid = m_ivt.srcid(r_tgt_rsp_prio_cleanup.read());
+      r_cleanup_to_tgt_rsp_trdid = m_ivt.trdid(r_tgt_rsp_prio_cleanup.read());
+      r_cleanup_to_tgt_rsp_pktid = m_ivt.pktid(r_tgt_rsp_prio_cleanup.read());
+
+      m_ivt.clear(r_tgt_rsp_prio_cleanup.read());
+
+      r_tgt_rsp_fsm = TGT_RSP_CLEANUP;
+      break;
+    } 
+
     /////////////////////
     case TGT_RSP_CLEANUP:   // pas clair pour moi (AG)
@@ -6775,5 +6924,6 @@
 #endif
         r_tgt_rsp_fsm = TGT_RSP_CLEANUP_IDLE;
-        r_cleanup_to_tgt_rsp_req = false;
+        r_cleanup_to_tgt_rsp_req[r_tgt_rsp_prio_cleanup.read()] = false;
+        r_tgt_rsp_prio_cleanup = (r_tgt_rsp_prio_cleanup.read() + 1) % m_ivt_lines;
       }
       break;
@@ -6841,4 +6991,19 @@
     }
     ///////////////////////
+    case TGT_RSP_UPT_LOCK:      // Clear UPT entry
+    {
+      if (r_alloc_upt_fsm.read() != ALLOC_UPT_TGT_RSP) break;
+
+      r_multi_ack_to_tgt_rsp_srcid = m_upt.srcid(r_tgt_rsp_prio_multi_ack.read());
+      r_multi_ack_to_tgt_rsp_trdid = m_upt.trdid(r_tgt_rsp_prio_multi_ack.read());
+      r_multi_ack_to_tgt_rsp_pktid = m_upt.pktid(r_tgt_rsp_prio_multi_ack.read());
+
+      m_upt.clear(r_tgt_rsp_prio_multi_ack.read());
+
+      r_tgt_rsp_fsm = TGT_RSP_MULTI_ACK;
+      break;
+    } 
+
+    ///////////////////////
     case TGT_RSP_MULTI_ACK:    // send the write response after coherence transaction
     {
@@ -6854,5 +7019,6 @@
 #endif
         r_tgt_rsp_fsm = TGT_RSP_MULTI_ACK_IDLE;
-        r_multi_ack_to_tgt_rsp_req = false;
+        r_multi_ack_to_tgt_rsp_req[r_tgt_rsp_prio_multi_ack.read()] = false;
+        r_tgt_rsp_prio_multi_ack = (r_tgt_rsp_prio_multi_ack.read() + 1) % m_upt_lines;
       }
       break;
@@ -6882,4 +7048,7 @@
               else if (r_multi_ack_fsm.read() == MULTI_ACK_UPT_LOCK)
                   r_alloc_upt_fsm = ALLOC_UPT_MULTI_ACK;
+              
+              else if (r_tgt_rsp_fsm.read() == TGT_RSP_UPT_LOCK)
+                  r_alloc_upt_fsm = ALLOC_UPT_TGT_RSP;
           }
           break;
@@ -6891,4 +7060,7 @@
               if (r_multi_ack_fsm.read() == MULTI_ACK_UPT_LOCK)
                   r_alloc_upt_fsm = ALLOC_UPT_MULTI_ACK;
+              
+              else if (r_tgt_rsp_fsm.read() == TGT_RSP_UPT_LOCK)
+                  r_alloc_upt_fsm = ALLOC_UPT_TGT_RSP;
 
               else if (r_write_fsm.read() == WRITE_UPT_LOCK)
@@ -6902,4 +7074,19 @@
               (r_multi_ack_fsm.read() != MULTI_ACK_UPT_CLEAR))
           {
+              if (r_tgt_rsp_fsm.read() == TGT_RSP_UPT_LOCK)
+                  r_alloc_upt_fsm = ALLOC_UPT_TGT_RSP;
+              
+              else if (r_write_fsm.read() == WRITE_UPT_LOCK)
+                  r_alloc_upt_fsm = ALLOC_UPT_WRITE;
+
+              else if (r_cas_fsm.read() == CAS_UPT_LOCK)
+                  r_alloc_upt_fsm = ALLOC_UPT_CAS;
+          }
+          break;
+      
+      /////////////////////////
+      case ALLOC_UPT_TGT_RSP:     // allocated to TGT_RSP FSM
+          if (r_tgt_rsp_fsm.read() != TGT_RSP_UPT_LOCK )
+          {
               if (r_write_fsm.read() == WRITE_UPT_LOCK)
                   r_alloc_upt_fsm = ALLOC_UPT_WRITE;
@@ -6907,4 +7094,8 @@
               else if (r_cas_fsm.read() == CAS_UPT_LOCK)
                   r_alloc_upt_fsm = ALLOC_UPT_CAS;
+              
+              else if (r_multi_ack_fsm.read() == MULTI_ACK_UPT_LOCK)
+                  r_alloc_upt_fsm = ALLOC_UPT_MULTI_ACK;
+              
           }
           break;
@@ -6943,4 +7134,7 @@
               else if (r_config_fsm.read() == CONFIG_DIR_IVT_LOCK)
                   r_alloc_ivt_fsm = ALLOC_IVT_CONFIG;
+              
+              else if (r_tgt_rsp_fsm.read() == TGT_RSP_IVT_LOCK)
+                  r_alloc_ivt_fsm = ALLOC_IVT_TGT_RSP;
           }
           break;
@@ -6958,4 +7152,7 @@
               else if (r_config_fsm.read() == CONFIG_DIR_IVT_LOCK)
                   r_alloc_ivt_fsm = ALLOC_IVT_CONFIG;
+              
+              else if (r_tgt_rsp_fsm.read() == TGT_RSP_IVT_LOCK)
+                  r_alloc_ivt_fsm = ALLOC_IVT_TGT_RSP;
 
               else if (r_write_fsm.read() == WRITE_BC_IVT_LOCK)
@@ -6974,4 +7171,7 @@
               else if (r_config_fsm.read() == CONFIG_DIR_IVT_LOCK)
                   r_alloc_ivt_fsm = ALLOC_IVT_CONFIG;
+              
+              else if (r_tgt_rsp_fsm.read() == TGT_RSP_IVT_LOCK)
+                  r_alloc_ivt_fsm = ALLOC_IVT_TGT_RSP;
 
               else if (r_write_fsm.read() == WRITE_BC_IVT_LOCK)
@@ -6989,4 +7189,7 @@
               if (r_config_fsm.read() == CONFIG_DIR_IVT_LOCK)
                   r_alloc_ivt_fsm = ALLOC_IVT_CONFIG;
+              
+              else if (r_tgt_rsp_fsm.read() == TGT_RSP_IVT_LOCK)
+                  r_alloc_ivt_fsm = ALLOC_IVT_TGT_RSP;
 
               else if (r_write_fsm.read() == WRITE_BC_IVT_LOCK)
@@ -7004,5 +7207,26 @@
       case ALLOC_IVT_CONFIG:           // allocated to CONFIG FSM
           if (r_config_fsm.read() != CONFIG_DIR_IVT_LOCK)
-          {
+          { 
+              if (r_tgt_rsp_fsm.read() == TGT_RSP_IVT_LOCK)
+                  r_alloc_ivt_fsm = ALLOC_IVT_TGT_RSP;
+              
+              else if (r_write_fsm.read() == WRITE_BC_IVT_LOCK)
+                  r_alloc_ivt_fsm = ALLOC_IVT_WRITE;
+
+              else if (r_xram_rsp_fsm.read() == XRAM_RSP_INVAL_LOCK)
+                  r_alloc_ivt_fsm = ALLOC_IVT_XRAM_RSP;
+
+              else if (r_cleanup_fsm.read() == CLEANUP_IVT_LOCK)
+                  r_alloc_ivt_fsm = ALLOC_IVT_CLEANUP;
+
+              else if (r_cas_fsm.read() == CAS_BC_IVT_LOCK)
+                  r_alloc_ivt_fsm = ALLOC_IVT_CAS;
+          }
+          break;
+      
+      //////////////////////////
+      case ALLOC_IVT_TGT_RSP:           // allocated to TGT RSP FSM
+          if (r_tgt_rsp_fsm.read() != TGT_RSP_IVT_LOCK)
+          { 
               if (r_write_fsm.read() == WRITE_BC_IVT_LOCK)
                   r_alloc_ivt_fsm = ALLOC_IVT_WRITE;
@@ -7016,4 +7240,7 @@
               else if (r_cas_fsm.read() == CAS_BC_IVT_LOCK)
                   r_alloc_ivt_fsm = ALLOC_IVT_CAS;
+              
+              else if (r_config_fsm.read() == CONFIG_DIR_IVT_LOCK)
+                  r_alloc_ivt_fsm = ALLOC_IVT_CONFIG;
           }
           break;
