source: trunk/platforms/caba-vdspin-vci_synthetic_initiator/top.cpp @ 103

Last change on this file since 103 was 103, checked in by choichil, 14 years ago

Platform using vci_simple_ram which is not the svn working copy (allow broadcast write commands ) and mapping table not filled yet

File size: 14.6 KB
Line 
1
2#include <stdint.h>
3#include <systemc>
4#include <sys/time.h>
5#include <iostream>
6#include <cstdlib>
7#include <cstdarg>
8
9#include "arithmetics.h"
10#include "mapping_table.h"
11#include "alloc_elems.h"
12#include "vci_simple_ram.h"
13//#include "vci_multi_tty.h"
14#include "vci_local_ring_fast.h"
15#include "virtual_dspin_router.h"
16#include "vci_synthetic_initiator.h"
17
18// MESH SIZE
19#define X_MAX           2
20#define Y_MAX           2
21#define N_CLUSTERS      X_MAX*Y_MAX
22// FLIT_WIDTH
23#define WIDTH_CMD       40
24#define WIDTH_RSP       33
25// Face of each DSPIN Router
26#define NORTH           0
27#define SOUTH           1
28#define EAST            2
29#define WEST            3
30#define LOCAL           4
31
32
33int _main(int argc, char *argv[])
34{
35        using namespace sc_core;
36        // Avoid repeating these everywhere
37        using soclib::common::IntTab;
38        using soclib::common::Segment;
39
40        using soclib::common::uint32_log2;
41
42        // Define VCI parameters
43        typedef soclib::caba::VciParams<4,8,40,1,1,1,8,4,4,1> vci_param;
44
45       
46        soclib::common::Loader loader(NULL);
47        // Mapping table primary network
48       
49        soclib::common::MappingTable maptab0(40, IntTab(2,10), IntTab(2,3), 0x00C00000);
50        soclib::common::MappingTable maptab1(40, IntTab(2,10), IntTab(2,3), 0x00C00000);
51
52
53        //maptab0.add(Segment("mc_r0" , MC0_R_BASE , MC0_R_SIZE , IntTab(0,0), false, true, IntTab(0,0)));
54        //maptab0.add(Segment("mc_m0" , MC0_M_BASE , MC0_M_SIZE , IntTab(0,0), true ));
55        //maptab0.add(Segment("mc_r1" , MC1_R_BASE , MC1_R_SIZE , IntTab(1,0), false, true, IntTab(1,0)));
56        //maptab0.add(Segment("mc_m1" , MC1_M_BASE , MC1_M_SIZE , IntTab(1,0), true ));
57        //maptab0.add(Segment("mc_r2" , MC2_R_BASE , MC2_R_SIZE , IntTab(2,0), false, true, IntTab(2,0)));
58        //maptab0.add(Segment("mc_m2" , MC2_M_BASE , MC2_M_SIZE , IntTab(2,0), true ));
59        //maptab0.add(Segment("mc_r3" , MC3_R_BASE , MC3_R_SIZE , IntTab(3,0), false, true, IntTab(3,0)));
60        //maptab0.add(Segment("mc_m3" , MC3_M_BASE , MC3_M_SIZE , IntTab(3,0), true ));
61
62        std::cout << maptab0 << std::endl;
63        // Signals
64
65        sc_clock        signal_clk("clk");
66        sc_signal<bool> signal_resetn("resetn");
67   
68        soclib::caba::VciSignals<vci_param> ** signal_vci_ini_synth_c0 = soclib::common::alloc_elems<soclib::caba::VciSignals<vci_param> >("signal_vci_ini_synth", 2, N_CLUSTERS);
69        soclib::caba::VciSignals<vci_param> ** signal_vci_ini_synth_c1 = soclib::common::alloc_elems<soclib::caba::VciSignals<vci_param> >("signal_vci_ini_synth", 2, N_CLUSTERS);
70        ///////////////////////////////////////////////////////////////
71        // VDSPIN Signals : one level for in and out, one level for X length in the mesh,
72        //                  one level for Y length in the mesh, last level for each port of the router
73        ///////////////////////////////////////////////////////////////
74        soclib::caba::DspinSignals<WIDTH_CMD> **** dspin_signals_cmd_c0 = soclib::common::alloc_elems<soclib::caba::DspinSignals<WIDTH_CMD> >("Dspin_cmd_signals_channel_0", 2, Y_MAX, X_MAX, 5 );
75        soclib::caba::DspinSignals<WIDTH_CMD> **** dspin_signals_cmd_c1 = soclib::common::alloc_elems<soclib::caba::DspinSignals<WIDTH_CMD> >("Dspin_cmd_signals_channel_1", 2, Y_MAX, X_MAX, 5 );
76        soclib::caba::DspinSignals<WIDTH_RSP> **** dspin_signals_rsp_c0 = soclib::common::alloc_elems<soclib::caba::DspinSignals<WIDTH_RSP> >("Dspin_rsp_signals_channel_0", 2, Y_MAX, X_MAX, 5 );
77        soclib::caba::DspinSignals<WIDTH_RSP> **** dspin_signals_rsp_c1 = soclib::common::alloc_elems<soclib::caba::DspinSignals<WIDTH_RSP> >("Dspin_rsp_signals_channel_2", 2, Y_MAX, X_MAX, 5 );
78
79        //soclib::caba::VciSignals<vci_param> * signal_vci_tgt_proc  = soclib::common::alloc_elems<soclib::caba::VciSignals<vci_param> >("signal_vci_tgt_proc",  N_CLUSTERS);
80
81        // N_CLUSTERS ring.
82        soclib::caba::VciLocalRingFast<vci_param, WIDTH_CMD, WIDTH_RSP> * local_ring_c0 = (soclib::caba::VciLocalRingFast<vci_param, WIDTH_CMD, WIDTH_RSP> *) malloc(sizeof(soclib::caba::VciLocalRingFast<vci_param, WIDTH_CMD, WIDTH_RSP> ) * N_CLUSTERS) ;
83        soclib::caba::VciLocalRingFast<vci_param, WIDTH_CMD, WIDTH_RSP> * local_ring_c1 = (soclib::caba::VciLocalRingFast<vci_param, WIDTH_CMD, WIDTH_RSP> *) malloc(sizeof(soclib::caba::VciLocalRingFast<vci_param, WIDTH_CMD, WIDTH_RSP> ) * N_CLUSTERS) ;
84        for(int i = 0 ; i < N_CLUSTERS ; i++){                                                            // ringid, fifo, fifo, nb_init, nb_tgt
85                new(&local_ring_c0[i]) soclib::caba::VciLocalRingFast<vci_param, WIDTH_CMD, WIDTH_RSP> ("cluster_c0" + i,maptab0, IntTab(i), 2, 18, 1, 1);
86                new(&local_ring_c1[i]) soclib::caba::VciLocalRingFast<vci_param, WIDTH_CMD, WIDTH_RSP> ("cluster_c1" + i,maptab1, IntTab(i), 2, 18, 1, 1);
87        }
88
89        // Virtual dspin routers
90        soclib::caba::VirtualDspinRouter<WIDTH_CMD> ** routers_cmd = (soclib::caba::VirtualDspinRouter<WIDTH_CMD> **) malloc(sizeof(soclib::caba::VirtualDspinRouter<WIDTH_CMD> *) * Y_MAX);
91        soclib::caba::VirtualDspinRouter<WIDTH_RSP> ** routers_rsp = (soclib::caba::VirtualDspinRouter<WIDTH_RSP> **) malloc(sizeof(soclib::caba::VirtualDspinRouter<WIDTH_RSP> *) * Y_MAX);
92
93        for(int i = 0; i < Y_MAX; i++ ){
94          routers_cmd[i] = (soclib::caba::VirtualDspinRouter<WIDTH_CMD> * ) malloc(sizeof(soclib::caba::VirtualDspinRouter<WIDTH_CMD>) * X_MAX);
95          routers_rsp[i] = (soclib::caba::VirtualDspinRouter<WIDTH_RSP> * ) malloc(sizeof(soclib::caba::VirtualDspinRouter<WIDTH_RSP>) * X_MAX);
96          for(int j = 0; j < X_MAX; i++){
97            new(&routers_cmd[i][j]) soclib::caba::VirtualDspinRouter<WIDTH_CMD> ("VDspinRouterCMD" + i + j, j, i, soclib::common::uint32_log2(X_MAX), soclib::common::uint32_log2(Y_MAX), 4, 4);
98            new(&routers_rsp[i][j]) soclib::caba::VirtualDspinRouter<WIDTH_RSP> ("VDspinRouterRSP" + i + j, j, i, soclib::common::uint32_log2(X_MAX), soclib::common::uint32_log2(Y_MAX), 4, 4);
99          }
100        }
101
102
103        ///////////////////////////////////////////////////////////////
104        // Components
105        ///////////////////////////////////////////////////////////////
106
107        // N_CLUSTERS VCI Synthetic Initiator (1 initiator per cluster/network)
108        soclib::caba::VciSyntheticInitiator<vci_param> * initiator_c0 = (soclib::caba::VciSyntheticInitiator<vci_param> *) malloc(sizeof(soclib::caba::VciSyntheticInitiator<vci_param> )* N_CLUSTERS);
109        soclib::caba::VciSyntheticInitiator<vci_param> * initiator_c1 = (soclib::caba::VciSyntheticInitiator<vci_param> *) malloc(sizeof(soclib::caba::VciSyntheticInitiator<vci_param> )* N_CLUSTERS);
110        for(int i = 0 ; i < Y_MAX; i++)
111                for(int j = 0 ; j < X_MAX ; j++){
112                        new(&initiator_c0[X_MAX*i+j]) soclib::caba::VciSyntheticInitiator<vci_param> ("Initiator_c0" + (i*X_MAX+j), maptab0, IntTab(i,j), 16, 0.5, 2, X_MAX, Y_MAX ); //, 0, 0, 0, 0, 0);
113                        new(&initiator_c1[X_MAX*i+j]) soclib::caba::VciSyntheticInitiator<vci_param> ("Initiator_c1" + (i*X_MAX+j), maptab0, IntTab(i,j), 16, 0.5, 2, X_MAX, Y_MAX ); //, 0, 0, 0, 0, 0);
114                }
115
116        soclib::caba::VciSimpleRam<vci_param> * ram_c0 = (soclib::caba::VciSimpleRam<vci_param> *) malloc(sizeof(soclib::caba::VciSimpleRam<vci_param>) * N_CLUSTERS);
117        soclib::caba::VciSimpleRam<vci_param> * ram_c1 = (soclib::caba::VciSimpleRam<vci_param> *) malloc(sizeof(soclib::caba::VciSimpleRam<vci_param>) * N_CLUSTERS);
118        for(int i = 0 ; i < Y_MAX ; i++)
119                for(int j = 0 ; j < X_MAX ; j++){
120                        new(&ram_c0[X_MAX*i+j]) soclib::caba::VciSimpleRam<vci_param> ("Ram_target_c0" + (i*X_MAX+j), IntTab(i,j), maptab0, loader, 0);
121                        new(&ram_c1[X_MAX*i+j]) soclib::caba::VciSimpleRam<vci_param> ("Ram_target_c1" + (i*X_MAX+j), IntTab(i,j), maptab1, loader, 0);
122                }
123
124        ///////////////////////////////////////////////////////////////
125        // Connection of Synthetic Initiator to each local ring per cluster
126        ///////////////////////////////////////////////////////////////
127        for(int i = 0 ; i < N_CLUSTERS ; i++){
128          local_ring_c0[i].p_clk(signal_clk);
129          local_ring_c0[i].p_resetn(signal_resetn);
130          local_ring_c0[i].p_to_initiator[0](signal_vci_ini_synth_c0[0][i]);
131          local_ring_c0[i].p_to_target[0](signal_vci_ini_synth_c0[1][i]);
132          initiator_c0[i].p_clk(signal_clk);
133          initiator_c0[i].p_resetn(signal_resetn);
134          initiator_c0[i].p_vci(signal_vci_ini_synth_c0[0][i]);
135          ram_c0[i].p_clk(signal_clk);
136          ram_c0[i].p_resetn(signal_resetn);
137          ram_c0[i].p_vci(signal_vci_ini_synth_c0[1][i]);
138          local_ring_c1[i].p_clk(signal_clk);
139          local_ring_c1[i].p_resetn(signal_resetn);
140          local_ring_c1[i].p_to_initiator[0](signal_vci_ini_synth_c1[0][i]);
141          local_ring_c1[i].p_to_target[0](signal_vci_ini_synth_c1[1][i]);
142          initiator_c1[i].p_clk(signal_clk);
143          initiator_c1[i].p_resetn(signal_resetn);
144          initiator_c1[i].p_vci(signal_vci_ini_synth_c1[0][i]);
145          ram_c1[i].p_clk(signal_clk);
146          ram_c1[i].p_resetn(signal_resetn);
147          ram_c1[i].p_vci(signal_vci_ini_synth_c1[1][i]);
148        }
149       
150        ///////////////////////////////////////////////////////////////
151        // Connection of each VDspin Router to each local ring and
152        // neighbors VDspin Router
153        ///////////////////////////////////////////////////////////////
154        for(int i = 0; i < Y_MAX ; i++){
155          for(int j = 0; j < X_MAX ; j++){
156            routers_cmd[i][j].p_clk(signal_clk);
157            routers_cmd[i][j].p_resetn(signal_resetn);
158            routers_rsp[i][j].p_clk(signal_clk);
159            routers_rsp[i][j].p_resetn(signal_resetn);
160            local_ring_c0[i*X_MAX+j].p_gate_cmd_in( dspin_signals_cmd_c0[0][i][j][LOCAL]);
161            local_ring_c0[i*X_MAX+j].p_gate_cmd_out(dspin_signals_cmd_c0[1][i][j][LOCAL] );
162            local_ring_c0[i*X_MAX+j].p_gate_rsp_in( dspin_signals_rsp_c0[0][i][j][LOCAL]);
163            local_ring_c0[i*X_MAX+j].p_gate_rsp_out(dspin_signals_rsp_c0[1][i][j][LOCAL] );
164            local_ring_c1[i*X_MAX+j].p_gate_cmd_in( dspin_signals_cmd_c1[0][i][j][LOCAL]);
165            local_ring_c1[i*X_MAX+j].p_gate_cmd_out(dspin_signals_cmd_c1[1][i][j][LOCAL] );
166            local_ring_c1[i*X_MAX+j].p_gate_rsp_in( dspin_signals_rsp_c1[0][i][j][LOCAL]);
167            local_ring_c1[i*X_MAX+j].p_gate_rsp_out(dspin_signals_rsp_c1[1][i][j][LOCAL] );
168            for(int k = 0; k < 5; k++){
169              if(i == 0){
170                if(j == 0){
171                  routers_cmd[i][j].p_out[0][k](dspin_signals_cmd_c0[0][i][j][k]);
172                  routers_cmd[i][j].p_out[1][k](dspin_signals_cmd_c1[0][i][j][k]);
173                  routers_cmd[i][j].p_in[0][k](dspin_signals_cmd_c0[1][i][j][k]);
174                  routers_cmd[i][j].p_in[1][k](dspin_signals_cmd_c1[1][i][j][k]);
175                  routers_rsp[i][j].p_out[0][k](dspin_signals_rsp_c0[0][i][j][k]);
176                  routers_rsp[i][j].p_out[1][k](dspin_signals_rsp_c1[0][i][j][k]);
177                  routers_rsp[i][j].p_in[0][k](dspin_signals_rsp_c0[1][i][j][k]);
178                  routers_rsp[i][j].p_in[1][k](dspin_signals_rsp_c1[1][i][j][k]);
179                } else {
180                  if(k == WEST){
181                        routers_cmd[i][j].p_out[0][k](dspin_signals_cmd_c0[1][i][j-1][EAST]);
182                        routers_cmd[i][j].p_out[1][k](dspin_signals_cmd_c1[1][i][j-1][EAST]);
183                        routers_cmd[i][j].p_in[0][k](dspin_signals_cmd_c0[0][i][j-1][EAST]);
184                        routers_cmd[i][j].p_in[1][k](dspin_signals_cmd_c1[0][i][j-1][EAST]);
185                        routers_rsp[i][j].p_out[0][k](dspin_signals_rsp_c0[1][i][j-1][EAST]);
186                        routers_rsp[i][j].p_out[1][k](dspin_signals_rsp_c1[1][i][j-1][EAST]);
187                        routers_rsp[i][j].p_in[0][k](dspin_signals_rsp_c0[0][i][j-1][EAST]);
188                        routers_rsp[i][j].p_in[1][k](dspin_signals_rsp_c1[0][i][j-1][EAST]);
189                  } else {
190                        routers_cmd[i][j].p_out[0][k](dspin_signals_cmd_c0[0][i][j][k]);
191                        routers_cmd[i][j].p_out[1][k](dspin_signals_cmd_c1[0][i][j][k]);
192                        routers_cmd[i][j].p_in[0][k](dspin_signals_cmd_c0[1][i][j][k]);
193                        routers_cmd[i][j].p_in[1][k](dspin_signals_cmd_c1[1][i][j][k]);
194                        routers_rsp[i][j].p_out[0][k](dspin_signals_rsp_c0[0][i][j][k]);
195                        routers_rsp[i][j].p_out[1][k](dspin_signals_rsp_c1[0][i][j][k]);
196                        routers_rsp[i][j].p_in[0][k](dspin_signals_rsp_c0[1][i][j][k]);
197                        routers_rsp[i][j].p_in[1][k](dspin_signals_rsp_c1[1][i][j][k]);
198                  }
199                }
200              } else {
201                if(k == SOUTH){
202                        routers_cmd[i][j].p_out[0][k](dspin_signals_cmd_c0[1][i-1][j][NORTH]);
203                        routers_cmd[i][j].p_out[1][k](dspin_signals_cmd_c1[1][i-1][j][NORTH]);
204                        routers_cmd[i][j].p_in[0][k](dspin_signals_cmd_c0[0][i-1][j][NORTH]);
205                        routers_cmd[i][j].p_in[1][k](dspin_signals_cmd_c1[0][i-1][j][NORTH]);
206                        routers_rsp[i][j].p_out[0][k](dspin_signals_rsp_c0[1][i-1][j][NORTH]);
207                        routers_rsp[i][j].p_out[1][k](dspin_signals_rsp_c1[1][i-1][j][NORTH]);
208                        routers_rsp[i][j].p_in[0][k](dspin_signals_rsp_c0[0][i-1][j][NORTH]);
209                        routers_rsp[i][j].p_in[1][k](dspin_signals_rsp_c1[0][i-1][j][NORTH]);
210                } else if(k == WEST){
211                   if(j == 0){
212                        routers_cmd[i][j].p_out[0][k](dspin_signals_cmd_c0[0][i][j][k]);
213                        routers_cmd[i][j].p_out[1][k](dspin_signals_cmd_c1[0][i][j][k]);
214                        routers_cmd[i][j].p_in[0][k](dspin_signals_cmd_c0[1][i][j][k]);
215                        routers_cmd[i][j].p_in[1][k](dspin_signals_cmd_c1[1][i][j][k]);
216                        routers_rsp[i][j].p_out[0][k](dspin_signals_rsp_c0[0][i][j][k]);
217                        routers_rsp[i][j].p_out[1][k](dspin_signals_rsp_c1[0][i][j][k]);
218                        routers_rsp[i][j].p_in[0][k](dspin_signals_rsp_c0[1][i][j][k]);
219                        routers_rsp[i][j].p_in[1][k](dspin_signals_rsp_c1[1][i][j][k]);
220                   } else {
221                        routers_cmd[i][j].p_out[0][k](dspin_signals_cmd_c0[1][i][j-1][EAST]);
222                        routers_cmd[i][j].p_out[1][k](dspin_signals_cmd_c1[1][i][j-1][EAST]);
223                        routers_cmd[i][j].p_in[0][k](dspin_signals_cmd_c0[0][i][j-1][EAST]);
224                        routers_cmd[i][j].p_in[1][k](dspin_signals_cmd_c1[0][i][j-1][EAST]);
225                        routers_rsp[i][j].p_out[0][k](dspin_signals_rsp_c0[1][i][j-1][EAST]);
226                        routers_rsp[i][j].p_out[1][k](dspin_signals_rsp_c1[1][i][j-1][EAST]);
227                        routers_rsp[i][j].p_in[0][k](dspin_signals_rsp_c0[0][i][j-1][EAST]);
228                        routers_rsp[i][j].p_in[1][k](dspin_signals_rsp_c1[0][i][j-1][EAST]);
229                   }
230                } else {
231                        routers_cmd[i][j].p_out[0][k](dspin_signals_cmd_c0[0][i][j][k]);
232                        routers_cmd[i][j].p_out[1][k](dspin_signals_cmd_c1[0][i][j][k]);
233                        routers_cmd[i][j].p_in[0][k](dspin_signals_cmd_c0[1][i][j][k]);
234                        routers_cmd[i][j].p_in[1][k](dspin_signals_cmd_c1[1][i][j][k]);
235                        routers_rsp[i][j].p_out[0][k](dspin_signals_rsp_c0[0][i][j][k]);
236                        routers_rsp[i][j].p_out[1][k](dspin_signals_rsp_c1[0][i][j][k]);
237                        routers_rsp[i][j].p_in[0][k](dspin_signals_rsp_c0[1][i][j][k]);
238                        routers_rsp[i][j].p_in[1][k](dspin_signals_rsp_c1[1][i][j][k]);
239                }
240              }
241            }
242          }
243        }
244
245        ////////////////////////////////////////////////////////
246
247
248
249        ////////////////////////////////////////////////
250        //             Simulation Loop                //
251        ////////////////////////////////////////////////
252        int ncycles;
253
254        if (argc == 2) {
255                ncycles = std::atoi(argv[1]);
256        } else {
257                std::cerr
258                        << std::endl
259                        << "The number of simulation cycles must "
260                           "be defined in the command line"
261                        << std::endl;
262                exit(1);
263        }
264
265        sc_start(sc_core::sc_time(0, SC_NS));
266        signal_resetn = false;
267
268        sc_start(sc_core::sc_time(1, SC_NS));
269        signal_resetn = true;
270
271        for (int i = 0; i < ncycles ; i+=100000) {
272                sc_start(sc_core::sc_time(100000, SC_NS));
273               
274        }
275
276        std::cout << "Hit ENTER to end simulation" << std::endl;
277        char buf[1];
278
279        std::cin.getline(buf,1);
280        return EXIT_SUCCESS;
281}
282
283int sc_main (int argc, char *argv[])
284{
285        try {
286                return _main(argc, argv);
287        } catch (std::exception &e) {
288                std::cout << e.what() << std::endl;
289        } catch (...) {
290                std::cout << "Unknown exception occured" << std::endl;
291                throw;
292        }
293        return 1;
294}
Note: See TracBrowser for help on using the repository browser.