Ignore:
Timestamp:
Jun 16, 2015, 9:24:36 PM (10 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.
Location:
branches/reconfiguration/modules
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • branches/reconfiguration/modules/dspin_local_crossbar/caba/source/include/dspin_local_crossbar.h

    r977 r1001  
    7070        DspinOutput<flit_width>*        p_local_out;
    7171
     72        sc_in<uint32_t>                *p_barrier_enable;
     73
    7274        void      print_trace();
    7375
     
    8688                            const bool          is_cmd,
    8789                            const bool          use_routing_table,
    88                             const bool          broadcast_supported );
     90                            const bool          broadcast_supported,
     91                            const bool          hardware_barrier = false );
    8992
    9093        ~DspinLocalCrossbar();
  • 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
  • branches/reconfiguration/modules/vci_cc_vcache_wrapper/caba/source/src/vci_cc_vcache_wrapper.cpp

    r988 r1001  
    61476147            uint64_t header = p_dspin_m2p.data.read();
    61486148            uint64_t dest = DDP::dspin_get(header, DDP::TEST_M2P_DEST);
    6149             assert((size_t)dest == m_cc_global_id);
     6149
     6150            if ((size_t)dest != m_cc_global_id) {
     6151                std::cout << this->name() << ": ERROR in CC_RECEIVE_TEST_HEADER"
     6152                          << " / cycle: " << std::dec << m_cpt_total_cycles
     6153                          << " / TEST_M2P packet received but its destination (" << dest << ")"
     6154                          << "is not the current processor (" << m_cc_global_id << ")"
     6155                          << std::endl;
     6156                exit(1);
     6157            }
    61506158
    61516159            r_cc_receive_fsm = CC_RECEIVE_TEST_SIGNATURE;
  • branches/reconfiguration/modules/vci_local_crossbar/caba/source/include/vci_local_crossbar.h

    r932 r1001  
    5656    sc_in<bool>                               p_resetn;
    5757
     58    sc_in<uint32_t>                          *p_barrier_enable;
     59
    5860    VciInitiator<vci_param>                  *p_to_target;
    5961    VciTarget<vci_param>                     *p_to_initiator;
     
    9294                                          const size_t                        nb_attached_initiators,
    9395                                          const size_t                        nb_attached_targets,
    94                       const size_t                        default_target_id );
     96                      const size_t                        default_target_id,
     97                      const bool                          hardware_barrier = false );
    9598    ~VciLocalCrossbar();
    9699};
  • branches/reconfiguration/modules/vci_local_crossbar/caba/source/src/vci_local_crossbar.cpp

    r933 r1001  
    7878    const void*                 m_lt;           // locality table if cmd / id_locality table if rsp
    7979    const bool              m_is_cmd;       // cmd crossbar when true
     80    bool                    m_barrier;      // barrier in the global interface is enabled
    8081
    8182    sc_signal<bool>*            r_allocated;    // for each output port: allocation state
     
    9798          m_rt( rt ),
    9899          m_lt( lt ),
    99       m_is_cmd( is_cmd )
     100      m_is_cmd( is_cmd ),
     101      m_barrier( false )
    100102        {
    101103            r_allocated = new sc_signal<bool>[out_size];
     
    104106            r_bc_count  = new sc_signal<size_t>[in_size];
    105107        } // end constructor
     108
     109    //////////////////////////////////
     110    void setBarrier(const bool &value)
     111    {
     112        m_barrier = value;
     113    }
    106114
    107115    ////////////
     
    147155            }
    148156        }
     157        std::cout << " / barrier enable = " << m_barrier;
    149158    } // end print_trace()
    150159
     
    190199        for( size_t in = 0 ; in < m_in_size ; in++ )
    191200        {
    192             if ( input_port[in]->getVal() )
     201            /* drop global-to-local packets when the barrier is enabled */
     202            bool write = input_port[in]->getVal();
     203            if ( in == (m_in_size - 1) )
     204                write = write && !m_barrier;
     205
     206            if ( write )
    193207            {
    194208                if ( r_bc_state[in].read() )    // pending broadcast
     
    237251                {
    238252                    size_t in = (_in + r_origin[out] + 1) % m_in_size;
    239                     if ( input_port[in]->getVal() )
     253
     254                    /* drop global-to-local packets when the barrier is enabled */
     255                    bool write = input_port[in]->getVal();
     256                    if ( in == (m_in_size - 1) )
     257                        write = write && !m_barrier;
     258
     259                    if ( write )
    240260                    {
    241261                        pkt_t tmp;
     
    285305                pkt_t tmp;
    286306                tmp.readFrom(*input_port[in]);
     307
     308                // if the hardware barrier is activated, drop all
     309                // local-to-global packets. This is done by consuming every
     310                // incoming packet (send the acknowledgement to the input port)
     311                // and resetting the cmdval signal to the upper network level.
     312                bool read = output_port[out]->getAck();
     313                if (out == (m_out_size - 1)) {
     314                    read = read || m_barrier;
     315                    tmp.set_val(tmp.val() && !m_barrier);
     316                }
     317
     318                ack[in] = read;
    287319                tmp.writeTo(*output_port[out]);
    288                 ack[in] = output_port[out]->getAck();
     320
    289321                if ( r_bc_state[in].read() )                    // its a broacast
    290322                {
     
    299331            }
    300332        }
     333        // Drop all global-to-local packets when the hardware barrier is enabled
     334        ack[m_in_size - 1] = ack[m_in_size - 1] || m_barrier;
    301335
    302336        // Send acknowledges on input ports
     
    313347    std::cout << "LOCAL_CROSSBAR " << name() << " / ";
    314348    m_cmd_crossbar->print_trace();
    315     m_rsp_crossbar->print_trace();
     349    std::cout << " / ";
     350    m_rsp_crossbar->print_trace();
    316351    std::cout << std::endl;
    317352}
     
    327362    }
    328363
     364    if (p_barrier_enable != NULL)
     365    {
     366        const bool enable = (p_barrier_enable->read() != 0xFFFFFFFF);
     367        m_cmd_crossbar->setBarrier(enable);
     368        m_rsp_crossbar->setBarrier(enable);
     369    }
    329370    m_cmd_crossbar->transition( m_ports_to_initiator, m_ports_to_target );
    330371    m_rsp_crossbar->transition( m_ports_to_target, m_ports_to_initiator );
     
    344385                                  const size_t                       nb_attached_initiators,
    345386                                  const size_t                       nb_attached_targets,
    346                               const size_t                       default_target_id )
     387                              const size_t                       default_target_id,
     388                              const bool                         hardware_barrier )
    347389       : BaseModule(name),
    348390       p_clk("clk"),
     
    409451        m_ports_to_target[i] = &p_to_target[i];
    410452    m_ports_to_target[nb_attached_targets] = &p_initiator_to_up;
     453
     454    if (hardware_barrier)
     455        p_barrier_enable = new sc_in<uint32_t>("p_barrier_enable");
     456    else
     457        p_barrier_enable = NULL;
    411458}
    412459
Note: See TracChangeset for help on using the changeset viewer.