Index: trunk/modules/vci_cc_vcache_wrapper_v4/caba/source/src/vci_cc_vcache_wrapper_v4.cpp
===================================================================
--- trunk/modules/vci_cc_vcache_wrapper_v4/caba/source/src/vci_cc_vcache_wrapper_v4.cpp	(revision 220)
+++ trunk/modules/vci_cc_vcache_wrapper_v4/caba/source/src/vci_cc_vcache_wrapper_v4.cpp	(revision 221)
@@ -4119,11 +4119,5 @@
 	bool hit;
 
-        hit = r_dcache.inval( way, 
-                              set,
-                              &nline );
-	assert(hit && "CC_INVAL way/set should still be in dcache");
-	    
-        // possible itlb & dtlb invalidate 
-        if ( r_dcache_in_tlb[way*m_dcache_sets+set] ) 			// selective inval
+        if ( r_dcache_in_tlb[way*m_dcache_sets+set] ) 			// selective TLB inval
         {
             r_dcache_in_tlb[way*m_dcache_sets+set] = false;
@@ -4133,20 +4127,19 @@
             r_dcache_fsm             = DCACHE_INVAL_TLB_SCAN;
         }
-        else if ( r_dcache_contains_ptd[way*m_dcache_sets+set] ) 	// flush
-        {
-            r_itlb.reset();
-            r_dtlb.reset();
-            r_dcache_contains_ptd[way*m_dcache_sets+set] = false;
+        else 								// actual cache line inval
+        {
+            if ( r_dcache_contains_ptd[way*m_dcache_sets+set] ) 	// TLB flush
+            {
+                r_itlb.reset();
+                r_dtlb.reset();
+                r_dcache_contains_ptd[way*m_dcache_sets+set] = false;
+            }
             r_tgt_dcache_rsp = true;
             r_tgt_dcache_req = false;
             r_dcache_fsm     = r_dcache_fsm_cc_save.read();
-        }
-        else								// no inval
-        {
-            r_tgt_dcache_rsp = true;
-            r_tgt_dcache_req = false;
-            r_dcache_fsm     = r_dcache_fsm_cc_save.read();
-        }
-
+ 
+            hit = r_dcache.inval( way, 
+                                  set,
+                                  &nline );
 #if DEBUG_DCACHE
 if ( m_debug_dcache_fsm )
@@ -4158,4 +4151,6 @@
 #endif
   
+	    assert(hit && "CC_INVAL way/set should still be in dcache");
+        }
         break;
     }
@@ -4169,6 +4164,5 @@
         paddr_t  nline	    = r_tgt_paddr.read() >> (uint32_log2(m_dcache_words)+2);
 
-        // possible itlb & dtlb invalidate 
-        if ( r_dcache_in_tlb[way*m_dcache_sets+set] ) 		// selective inval
+        if ( r_dcache_in_tlb[way*m_dcache_sets+set] ) 			// selective TLB inval
         {
             r_dcache_in_tlb[way*m_dcache_sets+set] = false;
@@ -4178,15 +4172,13 @@
             r_dcache_fsm             = DCACHE_INVAL_TLB_SCAN;
         }
-        else if ( r_dcache_contains_ptd[way*m_dcache_sets+set] ) // flush
-        {
-            r_itlb.reset();
-            r_dtlb.reset();
-            r_dcache_contains_ptd[way*m_dcache_sets+set] = false;
-            r_tgt_dcache_rsp = true;
-            r_tgt_dcache_req = false;
-            r_dcache_fsm     = r_dcache_fsm_cc_save.read();
-        }
-        else							// no inval & no flush
-        {
+        else 								// cache update
+        {
+            if ( r_dcache_contains_ptd[way*m_dcache_sets+set] ) 	// TLB flush
+            {
+                r_itlb.reset();
+                r_dtlb.reset();
+                r_dcache_contains_ptd[way*m_dcache_sets+set] = false;
+            } 
+
             r_dcache.write( way,
                             set,
@@ -4198,12 +4190,4 @@
 #endif
             r_dcache_cc_word = word + 1;
-
-            if ( word == r_tgt_word_max.read() )	// last word
-            {
-                r_tgt_dcache_rsp = true;
-                r_tgt_dcache_req = false;
-                r_dcache_fsm     = r_dcache_fsm_cc_save.read();
-            }
-        }
 
 #if DEBUG_DCACHE
@@ -4217,5 +4201,12 @@
 }
 #endif
-  
+            if ( word == r_tgt_word_max.read() )	// last word
+            {
+                r_tgt_dcache_rsp = true;
+                r_tgt_dcache_req = false;
+                r_dcache_fsm     = r_dcache_fsm_cc_save.read();
+            }
+        }
+
         break;
     }
