source: trunk/modules/vci_simple_ring_network_2/caba/source/src/vci_simple_ring_network_2.cpp @ 8

Last change on this file since 8 was 8, checked in by simerabe, 14 years ago

new ring components for systemcass

  • Property svn:executable set to *
File size: 11.2 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/vci_simple_ring_network_2.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 VciSimpleRingNetwork2<vci_param, ring_cmd_data_size, ring_rsp_data_size >
38
39////////////////////////////////
40//      constructor
41//
42////////////////////////////////
43tmpl(/**/)::VciSimpleRingNetwork2( 
44        sc_module_name insname,
45        const soclib::common::MappingTable &mt,
46        const soclib::common::IntTab &ringid,
47        const int &wrapper_fifo_depth,
48        size_t nb_attached_initiator,
49        size_t 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        p_to_initiator = soclib::common::alloc_elems<soclib::caba::VciTarget<vci_param> >("p_to_initiator", m_nai);
58        p_to_target    = soclib::common::alloc_elems<soclib::caba::VciInitiator<vci_param> >("p_to_target", m_nat);
59
60        m_ring_initiator = new ring_initiator_t*[m_nai];
61        m_ring_target    = new ring_target_t*[m_nat]; 
62        m_ring_signal    = new ring_signal_t[m_ns];
63        for(size_t i=0; i<m_nai; ++i) {
64                bool alloc_init = (i==0);
65                std::ostringstream o;
66                o << name() << "_init_" << i;
67                m_ring_initiator[i] = new ring_initiator_t(o.str().c_str(), alloc_init, wrapper_fifo_depth, mt, ringid, i);
68        }
69
70        for(size_t i=0; i<m_nat; ++i) {
71                bool alloc_target = (i==0);
72                std::ostringstream o;
73                o << name() << "_target_" << i;
74                m_ring_target[i]  = new ring_target_t(o.str().c_str(), alloc_target, wrapper_fifo_depth, mt, ringid, i);
75        }
76
77        SC_METHOD(transition);
78        dont_initialize();
79        sensitive << p_clk.pos();
80
81        SC_METHOD(genMoore);
82        dont_initialize();
83        sensitive << p_clk.neg();
84
85}
86
87tmpl(void)::transition()
88{
89
90
91        if ( ! p_resetn.read() ) {
92                for(size_t i=0;i<m_nai;i++) 
93                        m_ring_initiator[i]->reset();
94                for(size_t t=0;t<m_nat;t++)
95                        m_ring_target[t]->reset();
96                return;
97        }
98
99// update ring signals Three iterations
100// this is intended in order to break the loop due to dependency existing between ring signals
101// this rule is based based on relaxation principle
102
103//- 1st
104       for(size_t i=0;i<m_nai;i++) {
105                size_t h = 0;
106                if(i == 0) h = m_ns-1;
107                else h = i-1;
108                m_ring_initiator[i]->update_ring_signals(m_ring_signal[h], m_ring_signal[i]);
109        }
110
111        for(size_t i=0;i<m_nat;i++){
112                m_ring_target[i]->update_ring_signals(m_ring_signal[m_nai+i-1], m_ring_signal[m_nai+i] );
113        }
114
115//- 2nd
116       for(size_t i=0;i<m_nai;i++) {
117                size_t 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(size_t 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//- 3rd
128       for(size_t i=0;i<m_nai;i++) {
129                size_t h = 0;
130                if(i == 0) h = m_ns-1;
131                else h = i-1;
132                m_ring_initiator[i]->update_ring_signals(m_ring_signal[h], m_ring_signal[i]);
133        }
134
135        for(size_t i=0;i<m_nat;i++){
136                m_ring_target[i]->update_ring_signals(m_ring_signal[m_nai+i-1], m_ring_signal[m_nai+i] );
137        }
138
139// transition
140        for(size_t i=0;i<m_nai;i++) {
141//              std::cout << sc_time_stamp() << " -- " << name() << " *** vci_initiator : " << i << std::endl;
142                size_t h = 0;
143                if(i == 0) h = m_ns-1;
144                else h = i-1;
145                m_ring_initiator[i]->transition(p_to_initiator[i], m_ring_signal[h]);
146        }
147        for(size_t t=0;t<m_nat;t++) {
148//              std::cout << sc_time_stamp() << " -- " << name() << " *** vci_target : " << t << std::endl;
149                m_ring_target[t]->transition(p_to_target[t], m_ring_signal[m_nai+t-1]);
150        }
151
152
153/*-------- print
154        for(size_t t=0;t<m_nat;t++) {
155                print_signal(m_nai+t-1);
156                print_vci_target(t);
157        }
158
159        for(size_t i=0;i<m_nai;i++) {
160                size_t h = 0;
161                if(i == 0) h = m_ns-1;
162                else h = i-1;
163                print_signal(h);
164                print_vci_init(i);
165        }
166*/
167}
168
169tmpl(void)::genMoore()
170{
171
172
173        for(size_t i=0;i<m_nai;i++) 
174                m_ring_initiator[i]->genMoore(p_to_initiator[i]);
175        for(size_t t=0;t<m_nat;t++)
176                m_ring_target[t]->genMoore(p_to_target[t]);       
177
178}
179
180tmpl(void)::print_vci_init(size_t i)
181{
182        std::cout << sc_time_stamp() << " -- " << name() << " *** vci_initiator : " << i << std::endl;
183        std::cout << sc_time_stamp() << " -- " << name() << " vci_cmdval  : " <<             p_to_initiator[i].cmdval.read() << std::endl;
184        std::cout << sc_time_stamp() << " -- " << name() << " vci_cmdack  : " <<             p_to_initiator[i].cmdack.read() << std::endl;
185        std::cout << sc_time_stamp() << " -- " << name() << " vci_address : " << std::hex << p_to_initiator[i].address.read() << std::endl;
186        std::cout << sc_time_stamp() << " -- " << name() << " vci_plen    : " <<             p_to_initiator[i].plen.read() << std::endl;
187        std::cout << sc_time_stamp() << " -- " << name() << " vci_wdata   : " <<             p_to_initiator[i].wdata.read() << std::endl;
188        std::cout << sc_time_stamp() << " -- " << name() << " vci_cmd     : " <<             p_to_initiator[i].cmd.read() << std::endl;
189        std::cout << sc_time_stamp() << " -- " << name() << " vci_rspval  : " <<             p_to_initiator[i].rspval.read() << std::endl;
190        std::cout << sc_time_stamp() << " -- " << name() << " vci_rspack  : " <<             p_to_initiator[i].rspack.read() << std::endl;
191        std::cout << sc_time_stamp() << " -- " << name() << " vci_rdata   : " << std::hex << p_to_initiator[i].rdata.read() << std::endl;
192        std::cout << sc_time_stamp() << " -- " << name() << " vci_rsrcid  : " <<             p_to_initiator[i].rsrcid.read() << std::endl;
193        std::cout << sc_time_stamp() << " -- " << name() << " vci_reop    : " <<             p_to_initiator[i].reop.read() << std::endl;
194        std::cout << sc_time_stamp() << " -- " << name() << " vci_rerror  : " <<             p_to_initiator[i].rerror.read() << std::endl;
195        std::cout << sc_time_stamp() << " -- " << name() << "*******************************" << std::endl;
196}
197tmpl(void)::print_vci_target(size_t i)
198{
199        std::cout << sc_time_stamp() << " -- " << name() << " *** vci_target : " << i << std::endl;
200        std::cout << sc_time_stamp() << " -- " << name() << " vci_cmdval  : " <<             p_to_target[i].cmdval.read() << std::endl;
201        std::cout << sc_time_stamp() << " -- " << name() << " vci_cmdack  : " <<             p_to_target[i].cmdack.read() << std::endl;
202        std::cout << sc_time_stamp() << " -- " << name() << " vci_address : " << std::hex << p_to_target[i].address.read() << std::endl;
203        std::cout << sc_time_stamp() << " -- " << name() << " vci_plen    : " <<             p_to_target[i].plen.read() << std::endl;
204        std::cout << sc_time_stamp() << " -- " << name() << " vci_wdata   : " <<             p_to_target[i].wdata.read() << std::endl;
205        std::cout << sc_time_stamp() << " -- " << name() << " vci_cmd     : " <<             p_to_target[i].cmd.read() << std::endl;
206        std::cout << sc_time_stamp() << " -- " << name() << " vci_rspval  : " <<             p_to_target[i].rspval.read() << std::endl;
207        std::cout << sc_time_stamp() << " -- " << name() << " vci_rspack  : " <<             p_to_target[i].rspack.read() << std::endl;
208        std::cout << sc_time_stamp() << " -- " << name() << " vci_rdata   : " << std::hex << p_to_target[i].rdata.read() << std::endl;
209        std::cout << sc_time_stamp() << " -- " << name() << " vci_rsrcid  : " <<             p_to_target[i].rsrcid.read() << std::endl;
210        std::cout << sc_time_stamp() << " -- " << name() << " vci_reop    : " <<             p_to_target[i].reop.read() << std::endl;
211        std::cout << sc_time_stamp() << " -- " << name() << " vci_rerror  : " <<             p_to_target[i].rerror.read() << std::endl;
212        std::cout << sc_time_stamp() << " -- " << name() << "*******************************" << std::endl;
213}
214tmpl(void)::print_signal(size_t i)
215{
216        std::cout << sc_time_stamp() << " -- " << name() << " ++++ signals index : " << i << std::endl;
217        std::cout << sc_time_stamp() << " -- " << name() << " cmd_grant : " << m_ring_signal[i].cmd_grant << std::endl;
218        std::cout << sc_time_stamp() << " -- " << name() << " cmd_data  : " << std::hex << m_ring_signal[i].cmd_data << std::endl;
219        std::cout << sc_time_stamp() << " -- " << name() << " cmd_rok/w : " << m_ring_signal[i].cmd_w << std::endl;
220        std::cout << sc_time_stamp() << " -- " << name() << " cmd_r/wok : " << m_ring_signal[i].cmd_r << std::endl;
221        std::cout << sc_time_stamp() << " -- " << name() << " rsp_grant : " << m_ring_signal[i].rsp_grant << std::endl;
222        std::cout << sc_time_stamp() << " -- " << name() << " rsp_data  : " << m_ring_signal[i].rsp_data  << std::endl;
223        std::cout << sc_time_stamp() << " -- " << name() << " rsp_rok/w : " << m_ring_signal[i].rsp_w     << std::endl;
224        std::cout << sc_time_stamp() << " -- " << name() << " rsp_wok/r : " << m_ring_signal[i].rsp_r     << std::endl;
225        std::cout << sc_time_stamp() << " -- " << name() << " ++++++++++++++++++++++++++++++++++++" << std::endl;
226} 
227//---------------- destructor
228tmpl(/**/)::~VciSimpleRingNetwork2()
229{
230
231        for(size_t x = 0; x < m_nai; x++)
232                delete m_ring_initiator[x];
233       
234        for(size_t x = 0; x < m_nat; x++)
235                delete m_ring_target[x];
236
237//for(size_t x = 0; x < m_ns; x++)
238//      delete m_ring_signal[x];
239
240        delete [] m_ring_initiator;
241        delete [] m_ring_target;
242        delete [] m_ring_signal;
243       
244        dealloc_elems(p_to_initiator,m_nai);
245        dealloc_elems(p_to_target, m_nat);
246}
247}} // end namespace
Note: See TracBrowser for help on using the repository browser.