Ignore:
Timestamp:
Jun 16, 2015, 9:24:36 PM (9 years ago)
Author:
cfuguet
Message:

reconf: introducing a hardware barrier in the global-local interface of
the local interconnects.

  • This barrier is controlled by a port (barrier enable) in the dspin and vci local interconnects.
  • The barrier enable port is connected to a configuration register of the XICU component to allow the software to control this barrier. The barrier is enabled when the barrier enable port value is different of 0xFFFFFFFF. As the configuration register of the XICU component are reset to 0, this barrier is enabled by default.
  • This barrier allows to isolate the cluster from the rest of the architecture and only if it self-diagnoses as functional, it release the barrier to communicate with the others.
  • The same barrier enable signal is connected to the five local interconnects. Therefore, either all are released or all are disabled.
  • If a local initiator or an external initiator sends a packet out or into the cluster respectively, and the barrier is enabled, the packet is dropped.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/reconfiguration/modules/dspin_local_crossbar/caba/source/src/dspin_local_crossbar.cpp

    r977 r1001  
    5252                                const bool           is_cmd,
    5353                                const bool           use_routing_table,
    54                                 const bool           broadcast_supported)
     54                                const bool           broadcast_supported,
     55                                const bool           hardware_barrier )
    5556    : BaseModule(name),
    5657
     
    141142        }
    142143
     144        if ( hardware_barrier )
     145        {
     146            p_barrier_enable = new sc_in<uint32_t>("p_barrier_enable");
     147        }
     148        else
     149        {
     150            p_barrier_enable = NULL;
     151        }
     152
    143153        assert( (flit_width >= x_width + y_width + l_width) and
    144154        "ERROR in DSPIN_LOCAL_CROSSBAR: flit_width < x_width + y_width + l_width");
     
    281291        internal_flit_t     fifo_out_wdata[m_local_outputs+1];
    282292
     293        // local-to-global and global-to-local hardware barrier enable signal
     294        const bool barrier_enable = (p_barrier_enable != NULL) and
     295                                    (p_barrier_enable->read() != 0xFFFFFFFF);
     296
    283297        // reset
    284298        if ( p_resetn.read() == false )
     
    326340        for ( size_t j = 0 ; j <= m_local_outputs ; j++ )
    327341        {
    328             if( r_alloc_out[j].read() and (r_fifo_out[j].wok()) )
     342            bool read = r_fifo_out[j].wok();
     343            if ( j == m_local_outputs )
     344            {
     345                read = read or barrier_enable;
     346            }
     347            if( r_alloc_out[j].read() and read )
    329348            {
    330349                get_out[j] = r_index_out[j].read();
     
    349368                {
    350369                    put_in[i] = false;
    351                     if ( r_fifo_in[i].rok() ) // packet available in input fifo
     370
     371                    bool write = r_fifo_in[i].rok();
     372                    if ( i == m_local_inputs )
     373                    {
     374                        write = write and not barrier_enable;
     375                    }
     376                    if ( write ) // packet available in input fifo
    352377                    {
    353378                        if ( is_broadcast(r_fifo_in[i].read().data ) and
     
    491516            }
    492517        }  // end loop on input ports
     518        fifo_in_read[m_local_inputs] = fifo_in_read[m_local_inputs] or barrier_enable;
    493519
    494520        // loop on the output ports :
     
    499525            if( r_alloc_out[j] )  // output port allocated
    500526            {
    501                 fifo_out_write[j] = put_in[r_index_out[j]];
     527                bool write = put_in[r_index_out[j]];
     528                if (j == m_local_outputs)
     529                {
     530                    write = write and not barrier_enable;
     531                }
     532                fifo_out_write[j] = write;
    502533                fifo_out_wdata[j] = data_in[r_index_out[j]];
     534
    503535            }
    504536        }  // end loop on the output ports
Note: See TracChangeset for help on using the changeset viewer.