source: trunk/platforms/caba-tsar-virtual_dspin_network-v0/top.cpp @ 3

Last change on this file since 3 was 3, checked in by nipo, 14 years ago

Import platforms

  • Property svn:eol-style set to native
  • Property svn:keywords set to "Author Date Id Rev URL Revision"
  • Property svn:mime-type set to text/plain
File size: 13.0 KB
Line 
1
2#include <systemc>
3#include <sys/time.h>
4#include <iostream>
5#include <cstdlib>
6#include <cstdarg>
7
8#include "mapping_table.h"
9#include "mips.h"
10#include "ississ2.h"
11#include "iss_simhelper.h"
12#include "vci_simple_ram.h"
13#include "vci_multi_tty.h"
14#include "vci_mem_cache.h"
15#include "vci_cc_xcache_wrapper.h"
16#include "vci_local_ring_network.h"
17#include "vci_simple_ring_network.h"
18#include "virtual_dspin_network.h"
19
20#ifdef USE_GDB_SERVER
21#include "iss/gdbserver.h"
22#endif
23
24#include "segmentation.h"
25
26int _main(int argc, char *argv[])
27{
28        using namespace sc_core;
29        // Avoid repeating these everywhere
30        using soclib::common::IntTab;
31        using soclib::common::Segment;
32
33        // Define VCI parameters
34        typedef soclib::caba::VciParams<4,8,32,1,1,1,8,4,4,1> vci_param;
35        typedef soclib::common::IssIss2<soclib::common::IssSimhelper<soclib::common::MipsElIss> > proc_iss;
36
37        // Mapping table primary network
38
39        soclib::common::MappingTable maptabp(32, IntTab(2,10), IntTab(2,3), 0x00C00000);
40
41        maptabp.add(Segment("reset", RESET_BASE, RESET_SIZE, IntTab(2,1), true));
42        maptabp.add(Segment("excep", EXCEP_BASE, EXCEP_SIZE, IntTab(2,1), true));
43        maptabp.add(Segment("tty"  , TTY_BASE  , TTY_SIZE  , IntTab(3,1), false));
44
45        maptabp.add(Segment("mc_r0" , MC0_R_BASE , MC0_R_SIZE , IntTab(0,0), false, true, IntTab(0,0)));
46        maptabp.add(Segment("mc_m0" , MC0_M_BASE , MC0_M_SIZE , IntTab(0,0), true ));
47        maptabp.add(Segment("mc_r1" , MC1_R_BASE , MC1_R_SIZE , IntTab(1,0), false, true, IntTab(1,0)));
48        maptabp.add(Segment("mc_m1" , MC1_M_BASE , MC1_M_SIZE , IntTab(1,0), true ));
49        maptabp.add(Segment("mc_r2" , MC2_R_BASE , MC2_R_SIZE , IntTab(2,0), false, true, IntTab(2,0)));
50        maptabp.add(Segment("mc_m2" , MC2_M_BASE , MC2_M_SIZE , IntTab(2,0), true ));
51        maptabp.add(Segment("mc_r3" , MC3_R_BASE , MC3_R_SIZE , IntTab(3,0), false, true, IntTab(3,0)));
52        maptabp.add(Segment("mc_m3" , MC3_M_BASE , MC3_M_SIZE , IntTab(3,0), true ));
53
54        std::cout << maptabp << std::endl;
55
56        // Mapping table coherence network
57
58        soclib::common::MappingTable maptabc(32, IntTab(2,10), IntTab(2,3), 0x00C00000);
59
60        maptabc.add(Segment("proc0" , PROC0_BASE , PROC0_SIZE , IntTab(0,0), false, true, IntTab(0,0)));
61        maptabc.add(Segment("proc1" , PROC1_BASE , PROC1_SIZE , IntTab(0,1), false, true, IntTab(0,1)));
62        maptabc.add(Segment("proc2" , PROC2_BASE , PROC2_SIZE , IntTab(0,2), false, true, IntTab(0,2)));
63        maptabc.add(Segment("proc3" , PROC3_BASE , PROC3_SIZE , IntTab(0,3), false, true, IntTab(0,3)));
64        maptabc.add(Segment("proc4" , PROC4_BASE , PROC4_SIZE , IntTab(1,0), false, true, IntTab(1,0)));
65        maptabc.add(Segment("proc5" , PROC5_BASE , PROC5_SIZE , IntTab(1,1), false, true, IntTab(1,1)));
66        maptabc.add(Segment("proc6" , PROC6_BASE , PROC6_SIZE , IntTab(1,2), false, true, IntTab(1,2)));
67        maptabc.add(Segment("proc7" , PROC7_BASE , PROC7_SIZE , IntTab(1,3), false, true, IntTab(1,3)));
68        maptabc.add(Segment("proc8" , PROC8_BASE , PROC8_SIZE , IntTab(2,0), false, true, IntTab(2,0)));
69        maptabc.add(Segment("proc9" , PROC9_BASE , PROC9_SIZE , IntTab(2,1), false, true, IntTab(2,1)));
70        maptabc.add(Segment("proc10" , PROC10_BASE , PROC10_SIZE , IntTab(2,2), false, true, IntTab(2,2)));
71        maptabc.add(Segment("proc11" , PROC11_BASE , PROC11_SIZE , IntTab(2,3), false, true, IntTab(2,3)));
72        maptabc.add(Segment("proc12" , PROC12_BASE , PROC12_SIZE , IntTab(3,0), false, true, IntTab(3,0)));
73        maptabc.add(Segment("proc13" , PROC13_BASE , PROC13_SIZE , IntTab(3,1), false, true, IntTab(3,1)));
74        maptabc.add(Segment("proc14" , PROC14_BASE , PROC14_SIZE , IntTab(3,2), false, true, IntTab(3,2)));
75        maptabc.add(Segment("proc15" , PROC15_BASE , PROC15_SIZE , IntTab(3,3), false, true, IntTab(3,3)));
76
77        std::cout << maptabc << std::endl;
78
79        // Mapping table external network
80
81        soclib::common::MappingTable maptabx(32, IntTab(8,4), IntTab(4,4), 0x00C00000);
82        maptabx.add(Segment("xram0" , MC0_M_BASE , MC0_M_SIZE , IntTab(0,0), false));
83        maptabx.add(Segment("xram1" , MC1_M_BASE , MC1_M_SIZE , IntTab(0,0), false));
84        maptabx.add(Segment("xram2" , MC2_M_BASE , MC2_M_SIZE , IntTab(0,0), false));
85        maptabx.add(Segment("xram3" , MC3_M_BASE , MC3_M_SIZE , IntTab(0,0), false));
86        std::cout << maptabx << std::endl;
87
88        // Signals
89
90        sc_clock        signal_clk("clk");
91        sc_signal<bool> signal_resetn("resetn");
92   
93        sc_signal<bool> ** signal_proc_it = soclib::common::alloc_elems<sc_signal<bool> >("signal_proc_it", 16, 6);
94
95        soclib::caba::VciSignals<vci_param> * signal_vci_ini_proc = soclib::common::alloc_elems<soclib::caba::VciSignals<vci_param> >("signal_vci_ini_proc", 16);
96        soclib::caba::VciSignals<vci_param> * signal_vci_tgt_proc = soclib::common::alloc_elems<soclib::caba::VciSignals<vci_param> >("signal_vci_tgt_proc", 16);
97
98        soclib::caba::VciSignals<vci_param> signal_vci_tgt_tty("vci_tgt_tty");
99
100        soclib::caba::VciSignals<vci_param> signal_vci_tgt_rom("vci_tgt_rom");
101
102        soclib::caba::VciSignals<vci_param> signal_vci_tgt_xram("vci_tgt_xram");
103
104        soclib::caba::VciSignals<vci_param> * signal_vci_ixr_memc = soclib::common::alloc_elems<soclib::caba::VciSignals<vci_param> >("signal_vci_ixr_memc", 4);
105        soclib::caba::VciSignals<vci_param> * signal_vci_ini_memc = soclib::common::alloc_elems<soclib::caba::VciSignals<vci_param> >("signal_vci_ini_memc", 4);
106        soclib::caba::VciSignals<vci_param> * signal_vci_tgt_memc = soclib::common::alloc_elems<soclib::caba::VciSignals<vci_param> >("signal_vci_tgt_memc", 4);
107
108        sc_signal<bool> * signal_tty_irq = soclib::common::alloc_elems<sc_signal<bool> >("signal_tty_irq", 16);
109
110        soclib::caba::GateSignals gate_PN[4][2];
111        soclib::caba::GateSignals gate_CN[4][2];
112
113
114
115        ///////////////////////////////////////////////////////////////
116        // Components
117        ///////////////////////////////////////////////////////////////
118
119        // VCI ports indexation : 3 initiateurs et 5 cibles
120
121        // INIT0 : proc0_ini
122        // INIT1 : memc_ini
123        // INIT2 : memc_ixr
124
125        // TGT 0 : rom_tgt
126        // TGT 1 : tty_tgt
127        // TGT 2 : xram_tgt
128        // TGT 3 : memc_tgt
129        // TGT 4 : proc0_tgt
130
131        soclib::common::Loader loader("soft/bin.soft");
132
133        // 16 MIPS processors (4 processors per cluster)
134        soclib::caba::VciCcXcacheWrapper<vci_param, proc_iss> * proc = (soclib::caba::VciCcXcacheWrapper<vci_param, proc_iss > *) malloc(sizeof(soclib::caba::VciCcXcacheWrapper<vci_param, proc_iss> )*16);
135        for(int i=0; i<4; i++)
136                for(int j=0; j<4; j++)
137                        new(&proc[4*i+j]) soclib::caba::VciCcXcacheWrapper<vci_param, proc_iss> ("proc" + (4*i+j), 4*i+j, maptabp, maptabc,IntTab(i,j),IntTab(i,j),4,64,16,4,64,16,CLEANUP_OFFSET);
138
139        // ROM which contains boot code
140        soclib::caba::VciSimpleRam<vci_param>
141        rom("rom", IntTab(2,1), maptabp, loader);
142
143        // External RAM
144        soclib::caba::VciSimpleRam<vci_param>
145        xram("xram",IntTab(0,0),maptabx, loader);
146
147        // Distribuated memory caches (1 memory cache per cluster)
148        soclib::caba::VciMemCache<vci_param> * memc = (soclib::caba::VciMemCache<vci_param> *) malloc(sizeof(soclib::caba::VciMemCache<vci_param>)*4);
149        for(int i=0; i<4; i++)
150                new(&memc[i]) soclib::caba::VciMemCache<vci_param>("memc" + (i),maptabp,maptabc,maptabx,IntTab(i,0),IntTab(i,0),IntTab(i,0),16,256,16);
151
152        // Multi TTY Controller : 1 display per processor       
153        soclib::caba::VciMultiTty<vci_param>
154        tty("tty",IntTab(3,1),maptabp,"tty0","tty1","tty2","tty3","tty4","tty5","tty6","tty7","tty8","tty9","tty10","tty11","tty12","tty13","tty14","tty15",NULL);
155
156        // Local ring interconnects : 1 direct ring per cluster
157        soclib::caba::VciLocalRingNetwork<vci_param> * clusterPN = (soclib::caba::VciLocalRingNetwork<vci_param> *) malloc(sizeof(soclib::caba::VciLocalRingNetwork<vci_param> )*4);
158        for(int i=0; i<4; i++)
159                new(&clusterPN[i]) soclib::caba::VciLocalRingNetwork<vci_param>("clusterPN" + i,maptabp, IntTab(i), 2, 18, 4, i/2+1 );
160
161        // Local ring interconnects : 1 coherence ring per cluster
162        soclib::caba::VciLocalRingNetwork<vci_param> * clusterCN = (soclib::caba::VciLocalRingNetwork<vci_param> *) malloc(sizeof(soclib::caba::VciLocalRingNetwork<vci_param> )*4);
163        for(int i=0; i<4; i++)
164                new(&clusterCN[i]) soclib::caba::VciLocalRingNetwork<vci_param>("clusterCN" + i,maptabc, IntTab(i), 2, 2, 1, 4 );
165
166        // External network
167        soclib::caba::VciSimpleRingNetwork<vci_param>
168        xring("xring",maptabx, IntTab(), 2, 4, 1);
169
170        // Global interconnect : virtual dspin
171        soclib::caba::VirtualDspinNetwork<2, 2, 1, 1, 37, 1, 3, 5, 6, 0, 35, 33, 1, 3, 8, 9, 0, 18, 18, 19, 24, 29, 34> network("network", 2, 2, NULL);
172
173        ///////////////////////////////////////////////////////////////
174        // Net-list description
175        ///////////////////////////////////////////////////////////////
176
177        // Virtual Dspin Network
178        network.p_clk(signal_clk);
179        network.p_resetn(signal_resetn);
180        for(int i=0; i<2; i++){
181                for(int j=0; j<2; j++){
182                        // GatePN[][1]
183                        network.p_out_cmd[0][i][j].data(        gate_PN[j+2*i][1].cmd_data);
184                        network.p_out_cmd[0][i][j].read(        gate_PN[j+2*i][1].cmd_r_wok);
185                        network.p_out_cmd[0][i][j].write(       gate_PN[j+2*i][1].cmd_w_rok);
186                        network.p_in_rsp[0][i][j].data(         gate_PN[j+2*i][1].rsp_data);
187                        network.p_in_rsp[0][i][j].read(         gate_PN[j+2*i][1].rsp_r_wok);
188                        network.p_in_rsp[0][i][j].write(        gate_PN[j+2*i][1].rsp_w_rok);
189                        // GateCN[][1]
190                        network.p_out_cmd[1][i][j].data(        gate_CN[j+2*i][1].cmd_data);
191                        network.p_out_cmd[1][i][j].read(        gate_CN[j+2*i][1].cmd_r_wok);
192                        network.p_out_cmd[1][i][j].write(       gate_CN[j+2*i][1].cmd_w_rok);
193                        network.p_in_rsp[1][i][j].data(         gate_CN[j+2*i][1].rsp_data);
194                        network.p_in_rsp[1][i][j].read(         gate_CN[j+2*i][1].rsp_r_wok);
195                        network.p_in_rsp[1][i][j].write(        gate_CN[j+2*i][1].rsp_w_rok);
196                        // GatePN[][0]
197                        network.p_in_cmd[0][i][j].data(         gate_PN[j+2*i][0].cmd_data);
198                        network.p_in_cmd[0][i][j].read(         gate_PN[j+2*i][0].cmd_r_wok);
199                        network.p_in_cmd[0][i][j].write(        gate_PN[j+2*i][0].cmd_w_rok);
200                        network.p_out_rsp[0][i][j].data(        gate_PN[j+2*i][0].rsp_data);
201                        network.p_out_rsp[0][i][j].read(        gate_PN[j+2*i][0].rsp_r_wok);
202                        network.p_out_rsp[0][i][j].write(       gate_PN[j+2*i][0].rsp_w_rok);
203                        // GateCN[][0]
204                        network.p_in_cmd[1][i][j].data(         gate_CN[j+2*i][0].cmd_data);
205                        network.p_in_cmd[1][i][j].read(         gate_CN[j+2*i][0].cmd_r_wok);
206                        network.p_in_cmd[1][i][j].write(        gate_CN[j+2*i][0].cmd_w_rok);
207                        network.p_out_rsp[1][i][j].data(        gate_CN[j+2*i][0].rsp_data);
208                        network.p_out_rsp[1][i][j].read(        gate_CN[j+2*i][0].rsp_r_wok);
209                        network.p_out_rsp[1][i][j].write(       gate_CN[j+2*i][0].rsp_w_rok);
210                }
211        }
212 
213        // Processors
214        for(int i=0; i<16; i++){
215                proc[i].p_clk(signal_clk); 
216                proc[i].p_resetn(signal_resetn); 
217                proc[i].p_vci_ini(signal_vci_ini_proc[i]);
218                proc[i].p_vci_tgt(signal_vci_tgt_proc[i]);
219                for(int j=0; j<6; j++)
220                        proc[i].p_irq[j](signal_proc_it[i][j]);
221        }
222
223        // ROM
224        rom.p_clk(signal_clk);
225        rom.p_resetn(signal_resetn);
226        rom.p_vci(signal_vci_tgt_rom);
227
228        // TTY
229        tty.p_clk(signal_clk);
230        tty.p_resetn(signal_resetn);
231        tty.p_vci(signal_vci_tgt_tty);
232        for(int i=0; i<16; i++)
233                tty.p_irq[i](signal_tty_irq[i]);
234
235        // Memory caches
236        for(int i=0; i<4; i++){
237                memc[i].p_clk(signal_clk);
238                memc[i].p_resetn(signal_resetn);
239                memc[i].p_vci_tgt(signal_vci_tgt_memc[i]);     
240                memc[i].p_vci_ini(signal_vci_ini_memc[i]);
241                memc[i].p_vci_ixr(signal_vci_ixr_memc[i]);
242        }
243
244        // XRAM
245        xram.p_clk(signal_clk);
246        xram.p_resetn(signal_resetn);
247        xram.p_vci(signal_vci_tgt_xram);       
248
249        // XRING
250        xring.p_clk(signal_clk);
251        xring.p_resetn(signal_resetn);
252        for(int i=0; i<4; i++)
253                xring.p_to_initiator[i](signal_vci_ixr_memc[i]);
254        xring.p_to_target[0](signal_vci_tgt_xram);
255
256        // direct ring
257        for(int i=0; i<4; i++){
258                clusterPN[i].p_clk(signal_clk);
259                clusterPN[i].p_resetn(signal_resetn);
260                clusterPN[i].p_to_target[0](signal_vci_tgt_memc[i]);
261                clusterPN[i].p_gate_initiator(gate_PN[i][1]);
262                clusterPN[i].p_gate_target(gate_PN[i][0]);
263                for(int j=0; j<4; j++)
264                        clusterPN[i].p_to_initiator[j](signal_vci_ini_proc[i*4+j]);
265        }
266
267        clusterPN[2].p_to_target[1](signal_vci_tgt_rom);
268        clusterPN[3].p_to_target[1](signal_vci_tgt_tty);
269
270        // coherence ring
271        for(int i=0; i<4; i++){
272                clusterCN[i].p_clk(signal_clk);
273                clusterCN[i].p_resetn(signal_resetn);
274                clusterCN[i].p_to_initiator[0](signal_vci_ini_memc[i]);
275                clusterCN[i].p_gate_initiator(gate_CN[i][1]);
276                clusterCN[i].p_gate_target(gate_CN[i][0]);
277                for(int j=0; j<4; j++)
278                        clusterCN[i].p_to_target[j](signal_vci_tgt_proc[i*4+j]);
279        }
280
281        ////////////////////////////////////////////////////////
282
283        int ncycles;
284
285#ifndef SOCVIEW
286        if (argc == 2) {
287                ncycles = std::atoi(argv[1]);
288        } else {
289                std::cerr
290                        << std::endl
291                        << "The number of simulation cycles must "
292                           "be defined in the command line"
293                        << std::endl;
294                exit(1);
295        }
296
297        sc_start(sc_core::sc_time(0, SC_NS));
298        signal_resetn = false;
299
300        sc_start(sc_core::sc_time(1, SC_NS));
301        signal_resetn = true;
302
303        for (int i = 0; i < ncycles ; i+=100000) {
304                sc_start(sc_core::sc_time(100000, SC_NS));
305               
306        }
307
308        std::cout << "Hit ENTER to end simulation" << std::endl;
309        char buf[1];
310
311        std::cin.getline(buf,1);
312        return EXIT_SUCCESS;
313#else
314        ncycles = 1;
315        sc_start(sc_core::sc_time(0, SC_NS));
316        signal_resetn = false;
317        sc_start(sc_core::sc_time(1, SC_NS));
318        signal_resetn = true;
319
320        debug();
321        return EXIT_SUCCESS;
322#endif
323}
324
325int sc_main (int argc, char *argv[])
326{
327        try {
328                return _main(argc, argv);
329        } catch (std::exception &e) {
330                std::cout << e.what() << std::endl;
331        } catch (...) {
332                std::cout << "Unknown exception occured" << std::endl;
333                throw;
334        }
335        return 1;
336}
Note: See TracBrowser for help on using the repository browser.