source: trunk/modules/vci_synthetic_initator/caba/sources/src/vci_synthetic_initiator.cpp @ 124

Last change on this file since 124 was 124, checked in by choichil, 13 years ago

Synthetic Initiator...

File size: 11.5 KB
Line 
1
2/* -*- c++ -*-
3 * File         : vci_synthetic_initiator.cpp
4 * Date         : 23/12/2010
5 * Copyright    : UPMC / LIP6
6 * Authors      : Christophe Choichillon
7 * Version      : 2.0
8 *
9 * SOCLIB_LGPL_HEADER_BEGIN
10 *
11 * This file is part of SoCLib, GNU LGPLv2.1.
12 *
13 * SoCLib is free software; you can redistribute it and/or modify it
14 * under the terms of the GNU Lesser General Public License as published
15 * by the Free Software Foundation; version 2.1 of the License.
16 *
17 * SoCLib is distributed in the hope that it will be useful, but
18 * WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20 * Lesser General Public License for more details.
21 *
22 * You should have received a copy of the GNU Lesser General Public
23 * License along with SoCLib; if not, write to the Free Software
24 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
25 * 02110-1301 USA
26 *
27 * SOCLIB_LGPL_HEADER_END
28 *
29 * Maintainers: christophe.choichillon@lip6.fr
30 */
31
32#include "../include/vci_synthetic_initiator.h"
33#include <iostream>
34
35
36#define DETERMINISTIC
37
38namespace soclib { namespace caba {
39
40
41#define tmpl(x) template<typename vci_param> x VciSyntheticInitiator<vci_param>
42
43  //using soclib::common::uint32_log2; 
44 
45  ////////////////////////////////
46  //    Constructor
47  ////////////////////////////////
48
49  tmpl(/**/)::VciSyntheticInitiator( 
50      sc_module_name name,
51      const soclib::common::MappingTable &mt,
52      const soclib::common::IntTab       &vci_index,
53      const uint32_t length,    // Packet length (flit numbers)
54      const uint32_t rho,       // Packets ratio on the network
55    //  const float  rho,       // Packets ratio on the network
56      const uint32_t depth,     // Fifo depth
57      const uint32_t xmesh,     
58      const uint32_t ymesh,
59      const uint32_t bc_period, // Broadcast period, if no broadcast => 0
60      const uint32_t xmin, 
61      const uint32_t xmax,
62      const uint32_t ymin,
63      const uint32_t ymax
64      )
65
66    : soclib::caba::BaseModule(name),
67
68    p_clk("clk"),
69    p_resetn("resetn"),
70    p_vci("vci_ini"),
71
72    m_srcid( mt.indexForId(vci_index) ),
73    //  FIFOs
74    m_length(length),
75    m_rho(rho),
76    m_depth(depth),
77    m_xmesh(xmesh),
78    m_ymesh(ymesh),
79    m_bc_period(bc_period),
80    m_xmin(xmin),
81    m_xmax(xmax),
82    m_ymin(ymin),
83    m_ymax(ymax),
84    m_date_fifo("m_date_fifo", depth),
85    m_local_seed(m_srcid),
86    r_cmd_fsm("r_cmd_fsm")
87    {
88
89      r_req_id = new sc_signal<uint64_t>*[tab_size];
90      for(int i = 0; i < tab_size ; i++){
91        r_req_id[i] = new sc_signal<uint64_t>[2];
92      }
93
94      SC_METHOD(transition);
95      dont_initialize();
96      sensitive << p_clk.pos();
97
98      SC_METHOD(genMoore);
99      dont_initialize();
100      sensitive << p_clk.neg();
101
102    } // end constructor
103
104
105  /////////////////////////////////
106  tmpl(/**/)::~VciSyntheticInitiator()
107    /////////////////////////////////
108  {
109        for(int i = 0; i < tab_size ; i++){
110          delete r_req_id[i];
111        }
112        delete r_req_id;
113  }
114
115  ///////////////////////////////////
116  tmpl(uint32_t)::destAdress()
117  ///////////////////////////////////
118  {
119    return (uint32_t) (rand() % (m_xmesh * m_ymesh)) ;
120  }
121
122
123  ///////////////////////////////////
124  tmpl(uint32_t)::destAdress(uint32_t *rand_seed)
125  ///////////////////////////////////
126  {
127    return (uint32_t) (rand_r(rand_seed) % (m_xmesh * m_ymesh)) ;
128  }
129
130 
131  //////////////////////////////////
132  tmpl(void)::print_trace()
133  //////////////////////////////////
134  {
135        const char* state_cmd_str[] = { "IDLE",
136                                        "SINGLE_SEND",
137                                        "BC_SEND"};
138
139        const char* state_bc_rsp_str[] = {"IDLE",
140                                          "WAIT_RSP"};
141
142        std::cout << "Vci_Synthetic_Initiator " << name()
143                  << " : " << std::dec << m_cpt_cycles << " cycles " 
144                  << " : state_cmd_fsm = " << state_cmd_str[r_cmd_fsm] 
145                  << " : state_rsp_fsm = " << state_bc_rsp_str[r_bc_rsp_fsm] 
146                  << " Adresse to send : " << std::hex << m_address_to_send
147                  << " Number of broadcast to receive : " << std::dec << r_bc_nrsp.read() 
148                  << " Number of packets sent : " << std::dec << m_npackets << " " << m_id_to_send << std::endl;
149        for(int i = 0; i < (1<<vci_param::T) ; i++){
150          std::cout << "ID : " << i << " " << (r_req_id[i][0].read()) << " " << (r_req_id[i][0].read()) << std::endl;
151        }
152  }
153
154  //////////////////////////////////
155  tmpl(void)::printStats()
156  //////////////////////////////////
157  {
158        std::cout << name() << " : "<< std::dec << m_cpt_cycles << " cycles, " << m_npackets << " packets sent" << std::endl;
159        std::cout << ((double)m_latency1/(double)m_npackets) << " | " << ((double)m_latency2/(double)m_npackets) << std::endl;
160        if(m_bc_period)
161          std::cout << ((double)m_latency_bc/(double)m_nb_bc) << std::endl;
162  }
163
164  //////////////////////////////////
165  tmpl(void)::transition()
166  //////////////////////////////////
167  {
168    //  RESET         
169    if ( ! p_resetn.read() ) {
170      // Initializing seed for random numbers generation
171#ifndef DETERMINISTIC
172      srand(time(NULL));
173#endif
174
175      // Initializing FSMs
176      r_cmd_fsm = VCI_IDLE;
177
178      r_bc_rsp_fsm = BC_RSP_IDLE;
179
180      // Initializing FIFOs
181      m_date_fifo.init();
182
183      // Initializing the stats
184      m_latency1 = 0 ;
185      m_latency2 = 0 ;
186      // Activity counters
187      m_cpt_cycles              = 0;
188      m_npackets                = 0;
189     
190      m_start_latency_bc        = 0;
191      m_latency_bc              = 0;
192      m_nb_bc                   = 0;
193      m_id_to_send              = -1;
194
195      r_broadcast_req           = false;
196
197      r_broadcast_rsp           = false;
198
199      r_bc_nrsp                 = 0;
200
201      for(int i = 0; i < tab_size; i++){
202        r_req_id[i][0] = 0;
203        r_req_id[i][1] = 0;
204      //  std::cout << "bla bla" << std::endl;
205      }
206
207      return;
208    }
209
210    bool    date_fifo_put = false;
211    bool    date_fifo_get = false;
212
213
214
215    // FSM controling effective requests send
216    switch ( r_cmd_fsm.read() ) {
217      //////////////////
218      case VCI_IDLE:
219        {
220          if (m_date_fifo.rok()){
221            if (r_broadcast_req.read() && !r_broadcast_rsp.read()){
222              m_address_to_send = 0x3 | (0x7c1f << vci_param::N-20) ;
223              r_cmd_fsm = VCI_BC_SEND ;
224            } else {
225              m_id_to_send = -1;
226              for(int i = 0; i < tab_size; i++){
227                if(r_req_id[i][0].read() == 0){
228                  m_id_to_send = i;
229                  r_req_id[i][0] = m_date_fifo.read();
230                  r_req_id[i][1] = m_cpt_cycles;
231                  break;
232                }
233              }
234              if(m_id_to_send == -1){
235                r_cmd_fsm = VCI_IDLE ;
236                break;
237              } else {
238                r_cmd_fsm = VCI_SINGLE_SEND ;
239              }
240#ifdef DETERMINISTIC
241              m_address_to_send = destAdress(&m_local_seed) << (vci_param::N)-(soclib::common::uint32_log2((uint32_t)m_xmesh)+soclib::common::uint32_log2((uint32_t)m_ymesh));
242#else
243              m_address_to_send = destAdress() << (vci_param::N)-(soclib::common::uint32_log2((uint32_t)m_xmesh)+soclib::common::uint32_log2((uint32_t)m_ymesh));
244#endif
245              m_count = 0;
246            }
247          }
248          break;
249        }
250        //////////////////
251      case VCI_SINGLE_SEND:
252        {
253          if (p_vci.cmdack.read()){
254            if (m_count == m_length-1) {
255              //r_req_id[m_id_to_send][0] = (uint64_t)(m_date_fifo.read());
256              //r_req_id[m_id_to_send][0] = m_date_fifo.read();
257              //r_req_id[m_id_to_send][1] = m_cpt_cycles;
258              //std::cout << name () << " FIFO " << m_date_fifo.read() << std::endl;
259              date_fifo_get = true;
260              r_cmd_fsm = VCI_IDLE ;
261            } else {
262              r_cmd_fsm = VCI_SINGLE_SEND ;
263              m_count++;
264            }
265          }
266          break;
267        }
268      ///////////////////
269      case VCI_BC_SEND:
270        {
271          if (p_vci.rspval.read()) {
272            r_bc_nrsp = (m_xmax - m_xmin) * (m_ymax - m_ymin) ;
273            m_start_latency_bc = m_cpt_cycles;
274            r_broadcast_rsp = true;
275            date_fifo_get = true;
276            r_bc_rsp_fsm = VCI_IDLE;
277            break;
278          }
279        }
280    } // end switch vci_fsm
281
282    switch(r_bc_rsp_fsm.read()){
283      ///////////////////
284      case BC_RSP_IDLE:
285        {
286          if (p_vci.rspval.read() && r_broadcast_rsp.read()) {
287            r_bc_rsp_fsm = BC_RSP_WAIT_RSP;
288            break;
289          }
290        }
291      ////////////////////
292      case BC_RSP_WAIT_RSP:
293        {
294          if (p_vci.rspval.read() && (p_vci.rpktid.read() == 1)){
295            if (r_bc_nrsp == 1) {
296              r_broadcast_req = false;
297              r_broadcast_rsp = false;
298              m_address_to_send = 0;
299              m_latency_bc = m_latency_bc + (m_cpt_cycles - m_start_latency_bc);
300              m_nb_bc++;
301              r_bc_rsp_fsm = BC_RSP_IDLE ;
302            } else {
303              r_bc_nrsp = r_bc_nrsp.read() - 1;;
304              r_bc_rsp_fsm = BC_RSP_WAIT_RSP ;
305            }
306          }
307          break;
308        }   
309    }
310
311    if(p_vci.rspval.read()){
312      if((int)(p_vci.pktid.read()) == 0){
313        m_latency1 = m_latency1 + (m_cpt_cycles - r_req_id[(int)(p_vci.rtrdid.read())][0].read());
314        m_latency2 = m_latency2 + (m_cpt_cycles - r_req_id[(int)(p_vci.rtrdid.read())][1].read());
315        m_npackets++;
316        r_req_id[(int)(p_vci.rtrdid.read())][0] = 0;
317        r_req_id[(int)(p_vci.rtrdid.read())][1] = 0;
318        //std::cout << name() << " bla bla " << p_vci.rtrdid.read() << std::endl;
319      }
320    }
321
322    /////////////////// Filling fifo
323    if( ( (uint64_t)(m_rho*m_cpt_cycles) > (uint64_t)(m_length*m_npackets*1000)) ){
324      if (m_date_fifo.wok()){
325        date_fifo_put = true ;
326      } 
327      if (m_bc_period){
328              if (!r_broadcast_req.read() && (m_cpt_cycles % m_bc_period)){
329                      r_broadcast_req = true;
330              }
331      }
332    }
333
334    if (date_fifo_put){
335      if (date_fifo_get){
336        m_date_fifo.put_and_get(m_cpt_cycles);
337      } else {
338        m_date_fifo.simple_put(m_cpt_cycles);
339      }
340    } else {
341      if (date_fifo_get){
342        m_date_fifo.simple_get();
343      }
344    }
345   
346    m_cpt_cycles++;
347
348    return;
349
350  } // end transition()
351
352  /////////////////////////////
353  tmpl(void)::genMoore()
354    /////////////////////////////
355  {
356    ////////////////////////////////////////////////////////////
357    // Command signals on the p_vci port
358    ////////////////////////////////////////////////////////////
359     p_vci.cmd        = vci_param::CMD_WRITE;   
360     p_vci.be         = 0xF;                             
361     p_vci.srcid      = m_srcid;   
362     p_vci.pktid      = 0;     
363     p_vci.cons       = false;       
364     p_vci.wrap       = false;       
365     p_vci.contig     = true;       
366     p_vci.clen       = 0;         
367     p_vci.cfixed     = false;           
368     p_vci.rspack     = true;
369
370
371    switch ( r_cmd_fsm.read() ) {
372
373      //////////////////
374      case VCI_IDLE:
375        {
376          p_vci.cmdval  = false;                 
377          p_vci.address = 0; 
378          p_vci.plen    = 0;                                         
379          p_vci.wdata   = 0;                                       
380          p_vci.trdid   = 0;                 
381          p_vci.eop     = false;                                   
382          break;
383        }
384        //////////////////
385      case VCI_SINGLE_SEND:
386        {
387          p_vci.cmdval  = true;                 
388          p_vci.address = (addr_t)(m_address_to_send + (m_count*4)); 
389          p_vci.plen    = m_length*4;                                         
390          p_vci.wdata   = 0;                                       
391          p_vci.trdid   = m_id_to_send;                 
392          if (m_count == m_length - 1 ) {
393            p_vci.eop     = true;                                   
394          } else {
395            p_vci.eop     = false;                                   
396          }
397          break;
398        }
399        ///////////////////
400      case VCI_BC_SEND:
401        {
402          p_vci.cmdval  = true;                 
403          p_vci.address = (addr_t) m_address_to_send; 
404          p_vci.plen    = 4;                                         
405          p_vci.wdata   = 0;                                       
406          p_vci.pktid   = 1;     
407          p_vci.trdid   = 0;                 
408          p_vci.eop     = true;                                   
409          break;
410        }
411    } // end switch vci_cmd_fsm
412
413  } // end genMoore()
414
415}} // end name space
Note: See TracBrowser for help on using the repository browser.