Index: /branches/reconfiguration/modules/dspin_local_crossbar/caba/source/include/dspin_local_crossbar.h
===================================================================
--- /branches/reconfiguration/modules/dspin_local_crossbar/caba/source/include/dspin_local_crossbar.h	(revision 1000)
+++ /branches/reconfiguration/modules/dspin_local_crossbar/caba/source/include/dspin_local_crossbar.h	(revision 1001)
@@ -70,4 +70,6 @@
         DspinOutput<flit_width>*        p_local_out;
 
+        sc_in<uint32_t>                *p_barrier_enable;
+
         void      print_trace();
 
@@ -86,5 +88,6 @@
                             const bool          is_cmd,
                             const bool          use_routing_table,
-                            const bool          broadcast_supported );
+                            const bool          broadcast_supported,
+                            const bool          hardware_barrier = false );
 
         ~DspinLocalCrossbar();
Index: /branches/reconfiguration/modules/dspin_local_crossbar/caba/source/src/dspin_local_crossbar.cpp
===================================================================
--- /branches/reconfiguration/modules/dspin_local_crossbar/caba/source/src/dspin_local_crossbar.cpp	(revision 1000)
+++ /branches/reconfiguration/modules/dspin_local_crossbar/caba/source/src/dspin_local_crossbar.cpp	(revision 1001)
@@ -52,5 +52,6 @@
                                 const bool           is_cmd,
                                 const bool           use_routing_table,
-                                const bool           broadcast_supported)
+                                const bool           broadcast_supported,
+                                const bool           hardware_barrier )
     : BaseModule(name),
 
@@ -141,4 +142,13 @@
         }
 
+        if ( hardware_barrier )
+        {
+            p_barrier_enable = new sc_in<uint32_t>("p_barrier_enable");
+        }
+        else
+        {
+            p_barrier_enable = NULL;
+        }
+
         assert( (flit_width >= x_width + y_width + l_width) and
         "ERROR in DSPIN_LOCAL_CROSSBAR: flit_width < x_width + y_width + l_width");
@@ -281,4 +291,8 @@
         internal_flit_t     fifo_out_wdata[m_local_outputs+1];
 
+        // local-to-global and global-to-local hardware barrier enable signal
+        const bool barrier_enable = (p_barrier_enable != NULL) and
+                                    (p_barrier_enable->read() != 0xFFFFFFFF);
+
         // reset
         if ( p_resetn.read() == false )
@@ -326,5 +340,10 @@
         for ( size_t j = 0 ; j <= m_local_outputs ; j++ )
         {
-            if( r_alloc_out[j].read() and (r_fifo_out[j].wok()) )
+            bool read = r_fifo_out[j].wok();
+            if ( j == m_local_outputs )
+            {
+                read = read or barrier_enable;
+            }
+            if( r_alloc_out[j].read() and read )
             {
                 get_out[j] = r_index_out[j].read();
@@ -349,5 +368,11 @@
                 {
                     put_in[i] = false;
-                    if ( r_fifo_in[i].rok() ) // packet available in input fifo
+
+                    bool write = r_fifo_in[i].rok();
+                    if ( i == m_local_inputs )
+                    {
+                        write = write and not barrier_enable;
+                    }
+                    if ( write ) // packet available in input fifo
                     {
                         if ( is_broadcast(r_fifo_in[i].read().data ) and
@@ -491,4 +516,5 @@
             }
         }  // end loop on input ports
+        fifo_in_read[m_local_inputs] = fifo_in_read[m_local_inputs] or barrier_enable;
 
         // loop on the output ports :
@@ -499,6 +525,12 @@
             if( r_alloc_out[j] )  // output port allocated
             {
-                fifo_out_write[j] = put_in[r_index_out[j]];
+                bool write = put_in[r_index_out[j]];
+                if (j == m_local_outputs)
+                {
+                    write = write and not barrier_enable;
+                }
+                fifo_out_write[j] = write;
                 fifo_out_wdata[j] = data_in[r_index_out[j]];
+
             }
         }  // end loop on the output ports
Index: /branches/reconfiguration/modules/vci_cc_vcache_wrapper/caba/source/src/vci_cc_vcache_wrapper.cpp
===================================================================
--- /branches/reconfiguration/modules/vci_cc_vcache_wrapper/caba/source/src/vci_cc_vcache_wrapper.cpp	(revision 1000)
+++ /branches/reconfiguration/modules/vci_cc_vcache_wrapper/caba/source/src/vci_cc_vcache_wrapper.cpp	(revision 1001)
@@ -6147,5 +6147,13 @@
             uint64_t header = p_dspin_m2p.data.read();
             uint64_t dest = DDP::dspin_get(header, DDP::TEST_M2P_DEST);
-            assert((size_t)dest == m_cc_global_id);
+
+            if ((size_t)dest != m_cc_global_id) {
+                std::cout << this->name() << ": ERROR in CC_RECEIVE_TEST_HEADER"
+                          << " / cycle: " << std::dec << m_cpt_total_cycles
+                          << " / TEST_M2P packet received but its destination (" << dest << ")"
+                          << "is not the current processor (" << m_cc_global_id << ")"
+                          << std::endl;
+                exit(1);
+            }
 
             r_cc_receive_fsm = CC_RECEIVE_TEST_SIGNATURE;
Index: /branches/reconfiguration/modules/vci_local_crossbar/caba/source/include/vci_local_crossbar.h
===================================================================
--- /branches/reconfiguration/modules/vci_local_crossbar/caba/source/include/vci_local_crossbar.h	(revision 1000)
+++ /branches/reconfiguration/modules/vci_local_crossbar/caba/source/include/vci_local_crossbar.h	(revision 1001)
@@ -56,4 +56,6 @@
     sc_in<bool>                               p_resetn;
 
+    sc_in<uint32_t>                          *p_barrier_enable;
+
     VciInitiator<vci_param>                  *p_to_target;
     VciTarget<vci_param>                     *p_to_initiator;
@@ -92,5 +94,6 @@
 					  const size_t                        nb_attached_initiators,
 					  const size_t                        nb_attached_targets,
-                      const size_t                        default_target_id );
+                      const size_t                        default_target_id,
+                      const bool                          hardware_barrier = false );
     ~VciLocalCrossbar();
 };
Index: /branches/reconfiguration/modules/vci_local_crossbar/caba/source/src/vci_local_crossbar.cpp
===================================================================
--- /branches/reconfiguration/modules/vci_local_crossbar/caba/source/src/vci_local_crossbar.cpp	(revision 1000)
+++ /branches/reconfiguration/modules/vci_local_crossbar/caba/source/src/vci_local_crossbar.cpp	(revision 1001)
@@ -78,4 +78,5 @@
     const void* 	        m_lt;           // locality table if cmd / id_locality table if rsp
     const bool              m_is_cmd;       // cmd crossbar when true
+    bool                    m_barrier;      // barrier in the global interface is enabled
 
     sc_signal<bool>*		r_allocated;	// for each output port: allocation state 
@@ -97,5 +98,6 @@
 	  m_rt( rt ),
 	  m_lt( lt ),
-      m_is_cmd( is_cmd )
+      m_is_cmd( is_cmd ),
+      m_barrier( false )
 	{
 	    r_allocated = new sc_signal<bool>[out_size];
@@ -104,4 +106,10 @@
 	    r_bc_count	= new sc_signal<size_t>[in_size];
 	} // end constructor 
+
+    //////////////////////////////////
+    void setBarrier(const bool &value)
+    {
+        m_barrier = value;
+    }
 
     ////////////
@@ -147,4 +155,5 @@
             }
         }
+        std::cout << " / barrier enable = " << m_barrier;
     } // end print_trace()
 
@@ -190,5 +199,10 @@
         for( size_t in = 0 ; in < m_in_size ; in++ )
         {
-            if ( input_port[in]->getVal() )
+            /* drop global-to-local packets when the barrier is enabled */
+            bool write = input_port[in]->getVal();
+            if ( in == (m_in_size - 1) )
+                write = write && !m_barrier;
+
+            if ( write )
             {
                 if ( r_bc_state[in].read() )	// pending broadcast
@@ -237,5 +251,11 @@
                 {
                     size_t in = (_in + r_origin[out] + 1) % m_in_size;
-                    if ( input_port[in]->getVal() )
+
+                    /* drop global-to-local packets when the barrier is enabled */
+                    bool write = input_port[in]->getVal();
+                    if ( in == (m_in_size - 1) )
+                        write = write && !m_barrier;
+
+                    if ( write )
                     {
                         pkt_t tmp;
@@ -285,6 +305,18 @@
                 pkt_t tmp;
                 tmp.readFrom(*input_port[in]);
+
+                // if the hardware barrier is activated, drop all
+                // local-to-global packets. This is done by consuming every
+                // incoming packet (send the acknowledgement to the input port)
+                // and resetting the cmdval signal to the upper network level.
+                bool read = output_port[out]->getAck();
+                if (out == (m_out_size - 1)) {
+                    read = read || m_barrier;
+                    tmp.set_val(tmp.val() && !m_barrier);
+                }
+
+                ack[in] = read;
                 tmp.writeTo(*output_port[out]);
-                ack[in] = output_port[out]->getAck();
+
                 if ( r_bc_state[in].read() )			// its a broacast
                 {
@@ -299,4 +331,6 @@
             }
         }
+        // Drop all global-to-local packets when the hardware barrier is enabled
+        ack[m_in_size - 1] = ack[m_in_size - 1] || m_barrier;
 
         // Send acknowledges on input ports
@@ -313,5 +347,6 @@
     std::cout << "LOCAL_CROSSBAR " << name() << " / ";
     m_cmd_crossbar->print_trace();
-    m_rsp_crossbar->print_trace(); 
+    std::cout << " / ";
+    m_rsp_crossbar->print_trace();
     std::cout << std::endl;
 }
@@ -327,4 +362,10 @@
     }
 
+    if (p_barrier_enable != NULL)
+    {
+        const bool enable = (p_barrier_enable->read() != 0xFFFFFFFF);
+        m_cmd_crossbar->setBarrier(enable);
+        m_rsp_crossbar->setBarrier(enable);
+    }
     m_cmd_crossbar->transition( m_ports_to_initiator, m_ports_to_target );
     m_rsp_crossbar->transition( m_ports_to_target, m_ports_to_initiator );
@@ -344,5 +385,6 @@
 	                          const size_t                       nb_attached_initiators,
 	                          const size_t                       nb_attached_targets,
-                              const size_t                       default_target_id )
+                              const size_t                       default_target_id,
+                              const bool                         hardware_barrier )
        : BaseModule(name),
        p_clk("clk"),
@@ -409,4 +451,9 @@
         m_ports_to_target[i] = &p_to_target[i];
     m_ports_to_target[nb_attached_targets] = &p_initiator_to_up;
+
+    if (hardware_barrier)
+        p_barrier_enable = new sc_in<uint32_t>("p_barrier_enable");
+    else
+        p_barrier_enable = NULL;
 }
 
Index: /branches/reconfiguration/platforms/tsar_generic_iob/Makefile
===================================================================
--- /branches/reconfiguration/platforms/tsar_generic_iob/Makefile	(revision 1000)
+++ /branches/reconfiguration/platforms/tsar_generic_iob/Makefile	(revision 1001)
@@ -3,4 +3,5 @@
 SOCLIB_CC_ARGS := $(SOCLIB_CC_MODE)
 SOCLIB_CC_ARGS += -v
+#SOCLIB_CC_ARGS += -t envsystemc
 #SOCLIB_CC_ARGS += -bcaba:reconf:vci_xicu
 #SOCLIB_CC_ARGS += -bcaba:vci_iopic
Index: /branches/reconfiguration/platforms/tsar_generic_iob/top.cpp
===================================================================
--- /branches/reconfiguration/platforms/tsar_generic_iob/top.cpp	(revision 1000)
+++ /branches/reconfiguration/platforms/tsar_generic_iob/top.cpp	(revision 1001)
@@ -852,5 +852,6 @@
     sc_signal<bool>                   signal_resetn("resetn");
 
-    sc_signal<bool>                   signal_irq_false;
+    sc_signal<bool>                   signal_false;
+
     sc_signal<bool>                   signal_irq_bdev;
     sc_signal<bool>                   signal_irq_mtty_rx[NB_TTY_CHANNELS];
@@ -873,7 +874,7 @@
     VciSignals<vci_param_ext>         signal_vci_tgt_bdev("signal_vci_tgt_bdev");
     VciSignals<vci_param_ext>         signal_vci_tgt_cdma("signal_vci_tgt_cdma");
-    VciSignals<vci_param_ext>         signal_vci_tgt_iopi("signal_vci_ini_iopi");
-    VciSignals<vci_param_ext>         signal_vci_tgt_simh("signal_vci_ini_simh");
-    VciSignals<vci_param_ext>         signal_vci_tgt_rom("signal_vci_ini_rom");
+    VciSignals<vci_param_ext>         signal_vci_tgt_iopi("signal_vci_tgt_iopi");
+    VciSignals<vci_param_ext>         signal_vci_tgt_simh("signal_vci_tgt_simh");
+    VciSignals<vci_param_ext>         signal_vci_tgt_rom("signal_vci_tgt_rom");
 
    // Horizontal inter-clusters INT network DSPIN
@@ -1226,5 +1227,5 @@
     std::cout << std::endl;
 
-//    clusters[0][0]->xicu->set_faulty_wti(3, 0);
+    //clusters[0][0]->xicu->set_faulty_wti(4, 0);
 
     ///////////////////////////////////////////////////////////////////////////////
@@ -1323,13 +1324,13 @@
     {
        if     (i < NB_NIC_CHANNELS)    iopi->p_hwi[i] (signal_irq_mnic_rx[i]);
-       else if(i < 2 )                 iopi->p_hwi[i] (signal_irq_false);
+       else if(i < 2 )                 iopi->p_hwi[i] (signal_false);
        else if(i < 2+NB_NIC_CHANNELS)  iopi->p_hwi[i] (signal_irq_mnic_tx[i-2]);
-       else if(i < 4 )                 iopi->p_hwi[i] (signal_irq_false);
+       else if(i < 4 )                 iopi->p_hwi[i] (signal_false);
        else if(i < 4+NB_CMA_CHANNELS)  iopi->p_hwi[i] (signal_irq_cdma[i-4]);
-       else if(i < 8)                  iopi->p_hwi[i] (signal_irq_false);
+       else if(i < 8)                  iopi->p_hwi[i] (signal_false);
        else if(i < 9)                  iopi->p_hwi[i] (signal_irq_bdev);
-       else if(i < 16)                 iopi->p_hwi[i] (signal_irq_false);
+       else if(i < 16)                 iopi->p_hwi[i] (signal_false);
        else if(i < 16+NB_TTY_CHANNELS) iopi->p_hwi[i] (signal_irq_mtty_rx[i-16]);
-       else                            iopi->p_hwi[i] (signal_irq_false);
+       else                            iopi->p_hwi[i] (signal_false);
     }
 
@@ -1365,4 +1366,5 @@
             clusters[x][y]->p_clk     (signal_clk);
             clusters[x][y]->p_resetn  (signal_resetn);
+            clusters[x][y]->p_false   (signal_false);
         }
     }
@@ -1513,5 +1515,5 @@
 
    signal_resetn = false;
-   signal_irq_false = false;
+   signal_false  = false;
 
    // network boundaries signals
@@ -1624,4 +1626,6 @@
                std::cout << "### IRQ_PROC_" << std::dec
                   << x << "_" << y << "_" << l << " ACTIVE" << std::endl;
+
+            c->int_xbar_d->print_trace();
          }
 
Index: /branches/reconfiguration/platforms/tsar_generic_iob/tsar_iob_cluster/caba/source/include/tsar_iob_cluster.h
===================================================================
--- /branches/reconfiguration/platforms/tsar_generic_iob/tsar_iob_cluster/caba/source/include/tsar_iob_cluster.h	(revision 1000)
+++ /branches/reconfiguration/platforms/tsar_generic_iob/tsar_iob_cluster/caba/source/include/tsar_iob_cluster.h	(revision 1001)
@@ -53,4 +53,6 @@
     sc_in<bool>                                        p_resetn;
 
+    sc_in<bool>                                        p_false;
+
     // Thes two ports are used to connect IOB to IOX nework in top cell
     soclib::caba::VciInitiator<vci_param_ext>*         p_vci_iob_iox_ini;
@@ -69,5 +71,4 @@
 
     // interrupt signals
-    sc_signal<bool>                       signal_false;
     sc_signal<bool>                       signal_proc_it[16];
     sc_signal<bool>                       signal_irq_mdma[8];
@@ -75,4 +76,5 @@
     sc_signal<uint32_t>                   signal_cfg_router_cmd[3];
     sc_signal<uint32_t>                   signal_cfg_router_rsp[2];
+    sc_signal<uint32_t>                   signal_cfg_xbar_barrier;
 
     // INT network DSPIN signals between DSPIN routers and DSPIN local_crossbars
Index: /branches/reconfiguration/platforms/tsar_generic_iob/tsar_iob_cluster/caba/source/src/tsar_iob_cluster.cpp
===================================================================
--- /branches/reconfiguration/platforms/tsar_generic_iob/tsar_iob_cluster/caba/source/src/tsar_iob_cluster.cpp	(revision 1000)
+++ /branches/reconfiguration/platforms/tsar_generic_iob/tsar_iob_cluster/caba/source/src/tsar_iob_cluster.cpp	(revision 1001)
@@ -93,5 +93,6 @@
             soclib::caba::BaseModule(insname),
             p_clk("clk"),
-            p_resetn("resetn")
+            p_resetn("resetn"),
+            p_false("false")
 {
 
@@ -201,5 +202,5 @@
                      xcu_nb_wti,                          // number of soft IRQs
                      xcu_nb_out,                          // number of output IRQs
-                     5);                                  // number of config regs
+                     6);                                  // number of config regs
 
     ////////////  MDMA
@@ -236,5 +237,6 @@
                      nb_direct_initiators,         // number of local initiators
                      nb_direct_targets,            // number of local targets
-                     0 );                          // default target
+                     0,                            // default target
+                     true );                       // hardware barrier
 
     std::ostringstream s_int_dspin_ini_wrapper_gate_d;
@@ -269,5 +271,6 @@
                      true,                         // pseudo CMD
                      false,                        // no routing table
-                     true );                       // broacast
+                     true,                         // broacast
+                     true );                       // hardware barrier
 
     std::ostringstream s_int_xbar_p2m_c;
@@ -283,5 +286,6 @@
                      false,                        // pseudo RSP
                      false,                        // no routing table
-                     false );                      // no broacast
+                     false,                        // no broacast
+                     true );                       // hardware barrier
 
     std::ostringstream s_int_xbar_clack_c;
@@ -297,5 +301,6 @@
                      true,                         // CMD
                      false,                        // no routing table
-                     false);                       // broadcast
+                     false,                        // broadcast
+                     true );                       // hardware barrier
 
     const bool ROUTER_CONFIG_SUPPORTED = true;
@@ -470,7 +475,8 @@
     int_router_rsp[1]->p_in[4]                   (signal_int_dspin_p2m_l2g_c);
 
-    ///////////////////// CMD DSPIN  local crossbar direct
+    ///////////////////// CMD & RSP local crossbar
     int_xbar_d->p_clk                                 (this->p_clk);
     int_xbar_d->p_resetn                              (this->p_resetn);
+    (*int_xbar_d->p_barrier_enable)                   (signal_cfg_xbar_barrier);
     int_xbar_d->p_initiator_to_up                     (signal_int_vci_l2g);
     int_xbar_d->p_target_to_up                        (signal_int_vci_g2l);
@@ -505,4 +511,5 @@
     int_xbar_m2p_c->p_clk                        (this->p_clk);
     int_xbar_m2p_c->p_resetn                     (this->p_resetn);
+    (*int_xbar_m2p_c->p_barrier_enable)          (signal_cfg_xbar_barrier);
     int_xbar_m2p_c->p_global_out                 (signal_int_dspin_m2p_l2g_c);
     int_xbar_m2p_c->p_global_in                  (signal_int_dspin_m2p_g2l_c);
@@ -514,4 +521,5 @@
     int_xbar_p2m_c->p_clk                        (this->p_clk);
     int_xbar_p2m_c->p_resetn                     (this->p_resetn);
+    (*int_xbar_p2m_c->p_barrier_enable)          (signal_cfg_xbar_barrier);
     int_xbar_p2m_c->p_global_out                 (signal_int_dspin_p2m_l2g_c);
     int_xbar_p2m_c->p_global_in                  (signal_int_dspin_p2m_g2l_c);
@@ -523,4 +531,5 @@
     int_xbar_clack_c->p_clk                      (this->p_clk);
     int_xbar_clack_c->p_resetn                   (this->p_resetn);
+    (*int_xbar_clack_c->p_barrier_enable)        (signal_cfg_xbar_barrier);
     int_xbar_clack_c->p_global_out               (signal_int_dspin_clack_l2g_c);
     int_xbar_clack_c->p_global_in                (signal_int_dspin_clack_g2l_c);
@@ -547,5 +556,5 @@
             else
             {
-                proc[p]->p_irq[j]                (signal_false);
+                proc[p]->p_irq[j]                (this->p_false);
             }
         }
@@ -564,5 +573,5 @@
         if      ( i == 0 )       xicu->p_hwi[i]  (signal_irq_memc);
         else if ( i <= nb_dmas ) xicu->p_hwi[i]  (signal_irq_mdma[i-1]);
-        else                     xicu->p_hwi[i]  (signal_false);
+        else                     xicu->p_hwi[i]  (this->p_false);
     }
     xicu->p_cfg[0]                               (signal_cfg_router_cmd[0]); // CMD
@@ -571,4 +580,5 @@
     xicu->p_cfg[3]                               (signal_cfg_router_rsp[1]); // P2M
     xicu->p_cfg[4]                               (signal_cfg_router_cmd[2]); // CLACK
+    xicu->p_cfg[5]                               (signal_cfg_xbar_barrier); // CLACK
 
     ///////////////////////////////////// MEMC
