Index: /trunk/modules/vci_mem_cache_v1/caba/source/include/vci_mem_cache_v1.h
===================================================================
--- /trunk/modules/vci_mem_cache_v1/caba/source/include/vci_mem_cache_v1.h	(revision 31)
+++ /trunk/modules/vci_mem_cache_v1/caba/source/include/vci_mem_cache_v1.h	(revision 32)
@@ -489,4 +489,5 @@
       sc_signal<int>       r_llsc_fsm;          // FSM state
       sc_signal<data_t>	   r_llsc_data;		    // read data word
+      sc_signal<uint32_t>  r_llsc_lfsr;         // lfsr for random introducing
       sc_signal<copy_t>    r_llsc_i_copies;	    // bit_vector of copies
       sc_signal<copy_t>    r_llsc_d_copies;	    // bit_vector of copies
Index: /trunk/modules/vci_mem_cache_v1/caba/source/src/vci_mem_cache_v1.cpp
===================================================================
--- /trunk/modules/vci_mem_cache_v1/caba/source/src/vci_mem_cache_v1.cpp	(revision 31)
+++ /trunk/modules/vci_mem_cache_v1/caba/source/src/vci_mem_cache_v1.cpp	(revision 32)
@@ -33,4 +33,5 @@
 //#define IDEBUG
 //#define DEBUG_VCI_MEM_CACHE 2
+#define RANDOMIZE_SC
 
 namespace soclib { namespace caba {
@@ -469,4 +470,5 @@
       r_init_rsp_to_tgt_rsp_req	= false;
 
+      r_llsc_lfsr                       = -1;
       r_llsc_to_tgt_rsp_req	    = false;
       r_llsc_to_ixr_cmd_req	    = false;
@@ -2364,6 +2366,17 @@
                 r_llsc_i_copies = entry.i_copies;
                 r_llsc_count    = entry.count;
-                if ( entry.valid )  r_llsc_fsm = SC_DIR_LOCK;
-                else                r_llsc_fsm = LLSC_TRT_LOCK;
+              /* to avoid livelock, force the atomic access to fail (pseudo-)randomly */
+                bool fail = (r_llsc_lfsr % (64) == 0);
+                r_llsc_lfsr = (r_llsc_lfsr >> 1) ^ ((-(r_llsc_lfsr & 1)) & 0xd0000001);
+#ifdef RANDOMIZE_SC
+                if(fail){
+#else
+                if(0){
+#endif
+                  r_llsc_fsm = SC_RSP_FALSE;
+                } else {
+                  if ( entry.valid )  r_llsc_fsm = SC_DIR_LOCK;
+                  else                r_llsc_fsm = LLSC_TRT_LOCK;
+                }
               } else {
                 r_llsc_fsm = SC_RSP_FALSE;
