source: branches/fault_tolerance/module/network_component/dspin_router/caba/source/include/dspin_router.h @ 647

Last change on this file since 647 was 647, checked in by cfuguet, 10 years ago

Creating branch for fault tolerance support on the TSAR architecture.

Some components from the SOCLIB repository which will be modified has
been copied in this branch.

File size: 4.6 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        // constructor / destructor
98        DspinRouter( sc_module_name  name, 
99                 const size_t    x,
100                 const size_t    y,
101                 const size_t    x_width,
102                 const size_t    y_width,
103                 const size_t    in_fifo_depth,
104                 const size_t    out_fifo_depth,
105                 const bool      broadcast_supported = false );  // default value
106
107    private:
108
109    // define the FIFO flit
110    typedef struct internal_flit_s
111    {
112        sc_uint<flit_width>  data;
113        bool                 eop;
114    } internal_flit_t;
115   
116    // registers
117        sc_signal<bool>                         *r_alloc_out;   // output port is allocated
118        sc_signal<size_t>           *r_index_out;   // index of owner input port
119
120    sc_signal<int>              *r_fsm_in;      // input port state
121        sc_signal<size_t>           *r_index_in;    // index of requested output port
122    internal_flit_t             *r_buf_in;      // save first flit for a broadcast
123
124        // fifos
125        soclib::caba::GenericFifo<internal_flit_t>*  r_fifo_in;
126        soclib::caba::GenericFifo<internal_flit_t>*  r_fifo_out;
127
128        // structural parameters
129        size_t                      m_local_x;
130        size_t                      m_local_y;
131        size_t                      m_x_width;
132        size_t                      m_x_shift;
133        size_t                      m_x_mask;
134        size_t                      m_y_width;
135        size_t                      m_y_shift;
136        size_t                      m_y_mask;
137    bool                        m_broadcast_supported;
138
139    // methods
140    void    transition();
141    void    genMoore();
142    int     xfirst_route( sc_uint<flit_width> data );
143    int     broadcast_route( int iter, int source, sc_uint<flit_width> data );
144    bool    is_broadcast( sc_uint<flit_width> data );
145
146    public:
147
148    void    print_trace();
149};
150
151}} // end namespace
152               
153#endif // DSPIN_ROUTER_BC_H_
154
155// Local Variables:
156// tab-width: 4
157// c-basic-offset: 4
158// c-file-offsets:((innamespace . 0)(inline-open . 0))
159// indent-tabs-mode: nil
160// End:
161
162// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=4:softtabstop=4
Note: See TracBrowser for help on using the repository browser.