source: branches/reconfiguration/modules/dspin_router/caba/source/include/dspin_router.h @ 931

Last change on this file since 931 was 931, checked in by cfuguet, 9 years ago

reconf: introducing the segment recovery mechanism in the dspin_router

  • The p_recovery_cfg port, connected through a signal to a config register in the XICU, is formatted in two fields: the 4 LSb contain the blackhole relative position and the 4 bits after contain the recovery direction.
  • A request with the blackhole cluster as destination is rerouted through the defined recovery direction.
  • Remove the reconfiguration parameter of the constructor. The p_recovery_cfg port is instantiated when the bind_recovery_port is called. This port is also connected during this function to the signal that is passed as an argument.
File size: 5.2 KB
Line 
1/* -*- c++ -*-
2  *
3  * File : dspin_router.h
4  * Copyright (c) UPMC, Lip6
5  * Authors : Alain Greiner, Abbas Sheibanyrad, Ivan Miro, Zhen Zhang
6  *
7  * SOCLIB_LGPL_HEADER_BEGIN
8  *
9  * This file is part of SoCLib, GNU LGPLv2.1.
10  *
11  * SoCLib is free software; you can redistribute it and/or modify it
12  * under the terms of the GNU Lesser General Public License as published
13  * by the Free Software Foundation; version 2.1 of the License.
14  *
15  * SoCLib is distributed in the hope that it will be useful, but
16  * WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18  * Lesser General Public License for more details.
19  *
20  * You should have received a copy of the GNU Lesser General Public
21  * License along with SoCLib; if not, write to the Free Software
22  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
23  * 02110-1301 USA
24  *
25  * SOCLIB_LGPL_HEADER_END
26  *
27  */
28
29    ///////////////////////////////////////////////////////////////////////////
30    // Implementation Note :
31    // The xfirst_route(), broadcast_route() and is_broadcast() functions
32    // defined below are used to decode the DSPIN first flit format:
33    // - In case of a non-broadcast packet :
34    //  |   X     |   Y     |---------------------------------------|BC |
35    //  | x_width | y_width |  flit_width - (x_width + y_width + 2) | 0 |
36    //
37    //  - In case of a broacast
38    //  |  XMIN   |  XMAX   |  YMIN   |  YMAX   |-------------------|BC |
39    //  |   5     |   5     |   5     |   5     | flit_width - 22   | 1 |
40    ///////////////////////////////////////////////////////////////////////////
41
42#ifndef DSPIN_ROUTER_H_
43#define DSPIN_ROUTER_H_
44
45#include <systemc>
46#include "caba_base_module.h"
47#include "generic_fifo.h"
48#include "dspin_interface.h"
49#include "alloc_elems.h"
50
51namespace soclib { namespace caba {
52
53using namespace sc_core;
54
55template<int flit_width>
56class DspinRouter
57: public soclib::caba::BaseModule
58{
59    // Port indexing
60    enum
61    {
62        REQ_NORTH   = 0,
63        REQ_SOUTH   = 1,
64        REQ_EAST    = 2,
65        REQ_WEST    = 3,
66        REQ_LOCAL   = 4,
67        REQ_NOP     = 5,
68    };
69
70    // Input Port FSM
71    enum
72    {
73        INFSM_IDLE,
74        INFSM_REQ,
75        INFSM_ALLOC,
76        INFSM_REQ_FIRST,
77        INFSM_ALLOC_FIRST,
78        INFSM_REQ_SECOND,
79        INFSM_ALLOC_SECOND,
80        INFSM_REQ_THIRD,
81        INFSM_ALLOC_THIRD,
82        INFSM_REQ_FOURTH,
83        INFSM_ALLOC_FOURTH,
84    };
85
86    protected:
87    SC_HAS_PROCESS(DspinRouter);
88
89    public:
90
91    // ports
92    sc_in<bool>                 p_clk;
93    sc_in<bool>                 p_resetn;
94    DspinInput<flit_width>      *p_in;
95    DspinOutput<flit_width>     *p_out;
96
97    // reconfiguration port
98    sc_in<uint32_t>             *p_recovery_cfg;
99
100    // constructor / destructor
101    DspinRouter( sc_module_name  name,
102                 const size_t    x,
103                 const size_t    y,
104                 const size_t    x_width,
105                 const size_t    y_width,
106                 const size_t    in_fifo_depth,
107                 const size_t    out_fifo_depth,
108                 const bool      broadcast_supported = false );
109
110    ~DspinRouter();
111
112    private:
113
114    // define the FIFO flit
115    typedef struct internal_flit_s
116    {
117        sc_uint<flit_width>  data;
118        bool                 eop;
119    } internal_flit_t;
120
121    // registers
122    sc_signal<bool>             *r_alloc_out;   // output port is allocated
123    sc_signal<size_t>           *r_index_out;   // index of owner input port
124
125    sc_signal<int>              *r_fsm_in;      // input port state
126    sc_signal<size_t>           *r_index_in;    // index of requested output port
127    internal_flit_t             *r_buf_in;      // save first flit for a broadcast
128
129    // fifos
130    soclib::caba::GenericFifo<internal_flit_t>*  r_fifo_in;
131    soclib::caba::GenericFifo<internal_flit_t>*  r_fifo_out;
132
133    // structural parameters
134    size_t                      m_local_x;
135    size_t                      m_local_y;
136    size_t                      m_x_width;
137    size_t                      m_x_shift;
138    size_t                      m_x_mask;
139    size_t                      m_y_width;
140    size_t                      m_y_shift;
141    size_t                      m_y_mask;
142    bool                        m_broadcast_supported;
143    int                         m_disable_mask;
144
145    // methods
146    void    transition();
147    void    genMoore();
148    int     xfirst_route( size_t xdest, size_t ydest );
149    int     route( sc_uint<flit_width> data );
150    int     broadcast_route( int iter, int source, sc_uint<flit_width> data );
151    bool    is_broadcast( sc_uint<flit_width> data );
152
153    // fault-recovery methods
154    bool    need_reroute( size_t xdest, size_t ydest, int bhpos );
155    int     recovery_route( size_t xdest, size_t ydest );
156
157    public:
158
159    inline void set_disable_mask( int mask )
160    {
161        m_disable_mask = mask;
162    }
163
164    void bind_recovery_port( sc_core::sc_signal<uint32_t> &s );
165
166    void print_trace();
167};
168
169}} // end namespace
170
171#endif // DSPIN_ROUTER_BC_H_
172
173// Local Variables:
174// tab-width: 4
175// c-basic-offset: 4
176// c-file-offsets:((innamespace . 0)(inline-open . 0))
177// indent-tabs-mode: nil
178// End:
179
180// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=4:softtabstop=4
Note: See TracBrowser for help on using the repository browser.