source: branches/v5/modules/dspin_simple_ring_fast_c/caba/source/src/dspin_simple_ring_fast_c.cpp @ 326

Last change on this file since 326 was 326, checked in by simerabe, 11 years ago

introducing 2 new components : simple and local ring interconnect using dspin interface

  • Property svn:executable set to *
File size: 6.9 KB
Line 
1/* -*- c++ -*-
2 * SOCLIB_LGPL_HEADER_BEGIN
3 *
4 * This file is part of SoCLib, GNU LGPLv2.1.
5 *
6 * SoCLib is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU Lesser General Public License as published
8 * by the Free Software Foundation; version 2.1 of the License.
9 *
10 * SoCLib is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 * Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with SoCLib; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18 * 02110-1301 USA
19 *
20 * SOCLIB_LGPL_HEADER_END
21 *
22 * Author   : Abdelmalek SI MERABET
23 * Date     : March 2010
24 * Copyright: UPMC - LIP6
25 */
26
27#include <iostream> 
28#include <stdarg.h>
29#include "alloc_elems.h"
30#include "../include/dspin_simple_ring_fast_c.h"
31
32namespace soclib { namespace caba {
33
34using soclib::common::alloc_elems;
35using soclib::common::dealloc_elems;
36
37#define tmpl(x) template<typename vci_param, int ring_cmd_data_size, int ring_rsp_data_size > x DspinSimpleRingFastC<vci_param, ring_cmd_data_size, ring_rsp_data_size >
38
39////////////////////////////////
40//      constructor
41//
42////////////////////////////////
43tmpl(/**/)::DspinSimpleRingFastC( 
44        sc_module_name insname,
45        const soclib::common::MappingTable &mt,
46        const soclib::common::IntTab &ringid,
47        const int &wrapper_fifo_depth,
48        int nb_attached_initiator,
49        int nb_attached_target)
50                : soclib::caba::BaseModule(insname),
51                p_clk("clk"),
52                p_resetn("resetn"), 
53                m_ns(nb_attached_initiator+nb_attached_target), 
54                m_nai(nb_attached_initiator), 
55                m_nat(nb_attached_target)
56{
57
58        p_cmd_out = soclib::common::alloc_elems<soclib::caba::DspinOutput<ring_cmd_data_size> >("p_cmd_out", m_nat);
59        p_rsp_in  = soclib::common::alloc_elems<soclib::caba::DspinInput<ring_rsp_data_size> >("p_rsp_in" , m_nat);
60
61        p_cmd_in  = soclib::common::alloc_elems<soclib::caba::DspinInput<ring_cmd_data_size> >("p_cmd_in" , m_nai);
62        p_rsp_out = soclib::common::alloc_elems<soclib::caba::DspinOutput<ring_rsp_data_size> >("p_rsp_out", m_nai);
63
64//-- to keep trace on ring traffic
65        init_cmd     = new cmd_str[m_nai];
66        tgt_rsp      = new rsp_str[m_nat];
67        tgt_cmd_val  = new bool[m_nat];
68        init_rsp_val = new bool[m_nai];
69//--
70
71        m_ring_initiator = new ring_initiator_t*[m_nai];
72        m_ring_target    = new ring_target_t*[m_nat]; 
73        m_ring_signal    = new ring_signal_t[m_ns];
74
75        for(int i=0; i<m_nai; ++i) {
76                bool alloc_init = (i==0);
77                std::ostringstream o;
78                o << name() << "_init_" << i;
79                m_ring_initiator[i] = new ring_initiator_t(o.str().c_str(), alloc_init, wrapper_fifo_depth, nb_attached_target);
80        }
81
82        for(int i=0; i<m_nat; ++i) {
83                bool alloc_target = (i==0);
84                std::ostringstream o;
85                o << name() << "_target_" << i;
86                m_ring_target[i]  = new ring_target_t(o.str().c_str(), alloc_target, wrapper_fifo_depth, mt, ringid, i);
87        }
88
89        SC_METHOD(transition);
90        dont_initialize();
91        sensitive << p_clk.pos();
92
93        SC_METHOD(genMoore);
94        dont_initialize();
95        sensitive << p_clk.neg();
96 
97}
98
99tmpl(void)::transition()
100{
101
102
103        if ( ! p_resetn.read() ) {
104                for(int i=0;i<m_nai;i++) 
105                        m_ring_initiator[i]->reset();
106                for(int t=0;t<m_nat;t++)
107                        m_ring_target[t]->reset();
108                return;
109        }
110
111// update ring signals Ninitiators-1 iterations
112// this is intended in order to break the loop due to dependency existing between ring signals
113// this rule is based on relaxation principle
114
115       for (int niter = 0; niter < m_ns - 1; niter++) {
116           for(int i=0;i<m_nai;i++) {
117                int h = 0;
118                if(i == 0) h = m_ns-1;
119                else h = i-1;
120                m_ring_initiator[i]->update_ring_signals(m_ring_signal[h], m_ring_signal[i]);
121            }
122
123            for(int i=0;i<m_nat;i++){
124                m_ring_target[i]->update_ring_signals(m_ring_signal[m_nai+i-1], m_ring_signal[m_nai+i] );
125            }
126       }
127
128// transition
129        for(int i=0;i<m_nai;i++) {
130                int h = 0;
131                if(i == 0) h = m_ns-1;
132                else h = i-1;
133                m_ring_initiator[i]->transition(p_cmd_in[i], p_rsp_out[i], m_ring_signal[h], init_cmd[i], init_rsp_val[i]);
134        }
135        for(int t=0;t<m_nat;t++) {
136                m_ring_target[t]->transition(p_cmd_out[t], p_rsp_in[t], m_ring_signal[m_nai+t-1], tgt_cmd_val[t], tgt_rsp[t]);
137        }
138
139}
140
141tmpl(void)::genMoore()
142{
143
144
145        for(int i=0;i<m_nai;i++) 
146                m_ring_initiator[i]->genMoore(p_cmd_in[i], p_rsp_out[i]);
147        for(int t=0;t<m_nat;t++)
148                m_ring_target[t]->genMoore(p_cmd_out[t], p_rsp_in[t]);   
149
150}
151
152//---------------- destructor
153tmpl(/**/)::~DspinSimpleRingFastC()
154{
155
156        for(int x = 0; x < m_nai; x++)
157                delete m_ring_initiator[x];
158       
159        for(int x = 0; x < m_nat; x++)
160                delete m_ring_target[x];
161
162        delete [] m_ring_initiator;
163        delete [] m_ring_target;
164        delete [] m_ring_signal;
165       
166        dealloc_elems(p_cmd_out, m_nat);
167        dealloc_elems(p_cmd_in,  m_nai);
168        dealloc_elems(p_rsp_in,  m_nat);
169        dealloc_elems(p_rsp_out, m_nai);
170}
171
172tmpl(void)::print_trace()
173{
174        int init_cmd_index = 0;
175        bool init_cmd_found   = false;
176        int tgt_rsp_index = 0;
177        bool tgt_rsp_found = false;
178
179        // cmd trace
180        //*-- one initiator has token at one time
181        for(int i=0;i<m_nai;i++) {
182               if(init_cmd[i].cmdval) {
183                        init_cmd_index = i;
184                        init_cmd_found = true;
185                        break;
186                }
187       
188        }
189
190        // rsp trace
191        //*-- one target has token at one time
192        for(int t=0;t<m_nat;t++) {
193               if(tgt_rsp[t].rspval) {
194                        tgt_rsp_index = t;
195                        tgt_rsp_found = true;
196                        break;
197                }
198       
199        }
200       
201        // cmd display
202        if(init_cmd_found) {
203                //*-- in case of broadcast (on coherence ring), all targets can receive the command at the same time
204                for(int t=0;t<m_nat;t++) {
205                        if(tgt_cmd_val[t]) {
206                                std::cout << "RING " << name() 
207                                          << " -- initiator_" << std::dec << init_cmd_index
208                                          << " ... cmd to ... target_" << t
209                                          << " -state : " << init_cmd[init_cmd_index].state     
210                                          << " -flit : "  << std::hex << init_cmd[init_cmd_index].flit
211                                          << std::endl;
212                        }
213                }
214        }
215
216        // rsp display
217        if(tgt_rsp_found) {
218                for(int i=0;i<m_nai;i++) {
219                        if(init_rsp_val[i]) {
220                                std::cout << "RING " << name() 
221                                          << " ++ target_" << std::dec << tgt_rsp_index
222                                          << " ... rsp to ... initiator_" << i
223                                          << " +state : " << tgt_rsp[tgt_rsp_index].state
224                                          << " +flit : "  << std::hex << tgt_rsp[tgt_rsp_index].flit
225                                          << std::endl;
226                        }
227                }
228        }
229
230}
231}} // end namespace
Note: See TracBrowser for help on using the repository browser.