source: trunk/platforms/tsarv4_multi_cluster_ring_vdspin/top.cpp @ 9

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

updating multi-cluster platform

  • Property svn:executable set to *
File size: 20.7 KB
Line 
1#include <systemc>
2#include <sys/time.h>
3#include <iostream>
4#include <sstream>
5#include <cstdlib>
6#include <cstdarg>
7
8#include "mapping_table.h"
9#include "mips32.h"
10#include "vci_simple_ram.h"
11#include "vci_multi_tty.h"
12#include "vci_local_ring_network_2.h"
13#include "vci_mem_cache_v4.h"
14#include "vci_cc_xcache_wrapper_v4.h"
15#include "vci_logger.h"
16#include "vci_timer.h"
17#include "vci_icu.h"
18#include "vci_dma_tsar_v2.h"
19#include "vci_framebuffer.h"
20#include "vci_block_device_tsar_v2.h"
21#include "vci_vgmn.h"
22#include "virtual_dspin_network.h"
23
24#ifdef USE_GDB_SERVER
25#include "iss/gdbserver.h"
26#endif
27
28#include "segmentation.h"
29
30//#define  VCI_LOGGER_ON_L1
31
32#define CYCLES 100000
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        // Define VCI parameters
41        typedef soclib::caba::VciParams<4,8,32,1,1,1,8,4,4,1> vci_param;
42        typedef soclib::common::Mips32ElIss proc_iss;
43
44        // Mapping table primary network
45
46        soclib::common::MappingTable maptabp(32, IntTab(2,10), IntTab(4,4), 0xFFC00000);
47
48  // CLUSTER 0 : 0x00000000 -> 0x3FFFFFFF
49        maptabp.add(Segment("mc_m0" , MC0_M_BASE , MC0_M_SIZE , IntTab(0,0), true ));
50        maptabp.add(Segment("timer0", TIMER0_BASE, TIMER0_SIZE, IntTab(0,1), false));
51
52  // CLUSTER 1 : 0x40000000 -> 0x7FFFFFFF
53        maptabp.add(Segment("mc_m1" , MC1_M_BASE , MC1_M_SIZE , IntTab(1,0), true ));
54        maptabp.add(Segment("timer1", TIMER1_BASE, TIMER1_SIZE, IntTab(1,1), false));
55
56  // CLUSTER 2 : 0x80000000 -> 0xBFFFFFFF
57        maptabp.add(Segment("mc_m2" , MC2_M_BASE , MC2_M_SIZE , IntTab(2,0), true ));
58        maptabp.add(Segment("timer2", TIMER2_BASE, TIMER2_SIZE, IntTab(2,1), false));
59
60        maptabp.add(Segment("boot", BOOT_BASE, BOOT_SIZE, IntTab(2,2), true));
61        maptabp.add(Segment("ktext" , KTEXT_LMA_BASE , KTEXT_LMA_SIZE , IntTab(2,2), true));
62        maptabp.add(Segment("kdata" , KDATA_LMA_BASE , KDATA_LMA_SIZE , IntTab(2,2), true));
63       
64        maptabp.add(Segment("data" , UDATA_LMA_BASE , UDATA_LMA_SIZE , IntTab(2,2), true));
65        maptabp.add(Segment("text" , UTEXT_LMA_BASE , UTEXT_LMA_SIZE , IntTab(2,2), true));
66
67        maptabp.add(Segment("tty"  , TTY_BASE  , TTY_SIZE  , IntTab(2,3), false));
68        maptabp.add(Segment("icu", ICU_BASE, ICU_SIZE, IntTab(2,4), false));
69        maptabp.add(Segment("dma", DMA_BASE, DMA_SIZE, IntTab(2,5), false));
70        maptabp.add(Segment("bd", BD_BASE, BD_SIZE, IntTab(2,6), false));
71
72  // CLUSTER 3 : 0xC0000000 -> 0xFFFFFFFFF
73        maptabp.add(Segment("mc_m3" , MC3_M_BASE , MC3_M_SIZE , IntTab(3,0), true ));
74        maptabp.add(Segment("timer3", TIMER3_BASE, TIMER3_SIZE, IntTab(3,1), false));
75        maptabp.add(Segment("fb", FB_BASE, FB_SIZE, IntTab(3,2), false));
76
77        std::cout << maptabp << std::endl;
78
79        // Mapping table coherence network
80
81        soclib::common::MappingTable maptabc(32, IntTab(2,10), IntTab(4,4), 0x00C00000);
82
83        maptabc.add(Segment("proc0" , PROC0_BASE , PROC0_SIZE , IntTab(0,0), false, true, IntTab(0,0)));
84        maptabc.add(Segment("proc1" , PROC1_BASE , PROC1_SIZE , IntTab(0,1), false, true, IntTab(0,1)));
85        maptabc.add(Segment("proc2" , PROC2_BASE , PROC2_SIZE , IntTab(0,2), false, true, IntTab(0,2)));
86        maptabc.add(Segment("proc3" , PROC3_BASE , PROC3_SIZE , IntTab(0,3), false, true, IntTab(0,3)));
87        maptabc.add(Segment("proc4" , PROC4_BASE , PROC4_SIZE , IntTab(1,0), false, true, IntTab(1,0)));
88        maptabc.add(Segment("proc5" , PROC5_BASE , PROC5_SIZE , IntTab(1,1), false, true, IntTab(1,1)));
89        maptabc.add(Segment("proc6" , PROC6_BASE , PROC6_SIZE , IntTab(1,2), false, true, IntTab(1,2)));
90        maptabc.add(Segment("proc7" , PROC7_BASE , PROC7_SIZE , IntTab(1,3), false, true, IntTab(1,3)));
91        maptabc.add(Segment("proc8" , PROC8_BASE , PROC8_SIZE , IntTab(2,0), false, true, IntTab(2,0)));
92        maptabc.add(Segment("proc9" , PROC9_BASE , PROC9_SIZE , IntTab(2,1), false, true, IntTab(2,1)));
93        maptabc.add(Segment("proc10" , PROC10_BASE , PROC10_SIZE , IntTab(2,2), false, true, IntTab(2,2)));
94        maptabc.add(Segment("proc11" , PROC11_BASE , PROC11_SIZE , IntTab(2,3), false, true, IntTab(2,3)));
95        maptabc.add(Segment("proc12" , PROC12_BASE , PROC12_SIZE , IntTab(3,0), false, true, IntTab(3,0)));
96        maptabc.add(Segment("proc13" , PROC13_BASE , PROC13_SIZE , IntTab(3,1), false, true, IntTab(3,1)));
97        maptabc.add(Segment("proc14" , PROC14_BASE , PROC14_SIZE , IntTab(3,2), false, true, IntTab(3,2)));
98        maptabc.add(Segment("proc15" , PROC15_BASE , PROC15_SIZE , IntTab(3,3), false, true, IntTab(3,3)));
99
100        maptabc.add(Segment("mc_m0" , MC0_M_BASE , MC0_M_SIZE , IntTab(0,4), false ));
101        maptabc.add(Segment("mc_m1" , MC1_M_BASE , MC1_M_SIZE , IntTab(1,4), false ));
102        maptabc.add(Segment("mc_m2" , MC2_M_BASE , MC2_M_SIZE , IntTab(2,4), false ));
103        maptabc.add(Segment("mc_m3" , MC3_M_BASE , MC3_M_SIZE , IntTab(3,4), false ));
104
105        maptabc.add(Segment("boot", BOOT_BASE, BOOT_SIZE, IntTab(2,4), false));
106        maptabc.add(Segment("ktext" , KTEXT_LMA_BASE , KTEXT_LMA_SIZE , IntTab(2,4), false));
107        maptabc.add(Segment("kdata" , KDATA_LMA_BASE , KDATA_LMA_SIZE , IntTab(2,4), false));
108       
109        maptabc.add(Segment("data" , UDATA_LMA_BASE , UDATA_LMA_SIZE , IntTab(2,4), false));
110        maptabc.add(Segment("text" , UTEXT_LMA_BASE , UTEXT_LMA_SIZE , IntTab(2,4), false));
111
112
113        std::cout << maptabc << std::endl;
114
115        // Mapping table external network
116
117        soclib::common::MappingTable maptabx(32, IntTab(8,4), IntTab(4,4), 0x00C00000);
118        maptabx.add(Segment("xram0" , MC0_M_BASE , MC0_M_SIZE , IntTab(0,0), false));
119        maptabx.add(Segment("xram1" , MC1_M_BASE , MC1_M_SIZE , IntTab(0,0), false));
120        maptabx.add(Segment("xram2" , MC2_M_BASE , MC2_M_SIZE , IntTab(0,0), false));
121        maptabx.add(Segment("xram3" , MC3_M_BASE , MC3_M_SIZE , IntTab(0,0), false));
122        std::cout << maptabx << std::endl;
123
124        // Signals
125
126        sc_clock        signal_clk("clk");
127        sc_signal<bool> signal_resetn("resetn");
128   
129        sc_signal<bool> ** signal_proc_it = soclib::common::alloc_elems<sc_signal<bool> >("signal_proc_it", 16, 6);
130
131        soclib::caba::VciSignals<vci_param> * signal_vci_ini_rw_proc = soclib::common::alloc_elems<soclib::caba::VciSignals<vci_param> >("signal_vci_ini_rw_proc", 16);
132        soclib::caba::VciSignals<vci_param> * signal_vci_ini_c_proc = soclib::common::alloc_elems<soclib::caba::VciSignals<vci_param> >("signal_vci_ini_c_proc", 16);
133        soclib::caba::VciSignals<vci_param> * signal_vci_tgt_proc = soclib::common::alloc_elems<soclib::caba::VciSignals<vci_param> >("signal_vci_tgt_proc", 16);
134
135        soclib::caba::VciSignals<vci_param> signal_vci_tgt_tty("vci_tgt_tty");
136
137        soclib::caba::VciSignals<vci_param> signal_vci_tgt_rom("vci_tgt_rom");
138
139        soclib::caba::VciSignals<vci_param> signal_vci_tgt_xram("vci_tgt_xram");
140
141        soclib::caba::VciSignals<vci_param> * signal_vci_ixr_memc = soclib::common::alloc_elems<soclib::caba::VciSignals<vci_param> >("signal_vci_ixr_memc", 4);
142        soclib::caba::VciSignals<vci_param> * signal_vci_ini_memc = soclib::common::alloc_elems<soclib::caba::VciSignals<vci_param> >("signal_vci_ini_memc", 4);
143        soclib::caba::VciSignals<vci_param> * signal_vci_tgt_memc = soclib::common::alloc_elems<soclib::caba::VciSignals<vci_param> >("signal_vci_tgt_memc", 4);
144        soclib::caba::VciSignals<vci_param> * signal_vci_tgt_cleanup_memc = soclib::common::alloc_elems<soclib::caba::VciSignals<vci_param> >("signal_vci_tgt_cleanup_memc", 4);
145
146        soclib::caba::VciSignals<vci_param> signal_vci_icu("signal_vci_icu");
147        soclib::caba::VciSignals<vci_param> signal_vci_dmai("signal_vci_dmai");
148        soclib::caba::VciSignals<vci_param> signal_vci_dmat("signal_vci_dmat");
149        soclib::caba::VciSignals<vci_param> signal_vci_vcifb("signal_vci_vcifb");
150        soclib::caba::VciSignals<vci_param> signal_vci_vcibd_t("signal_vci_vcibd_t");
151        soclib::caba::VciSignals<vci_param> signal_vci_vcibd_i("signal_vci_vcibd_i");
152
153        soclib::caba::VciSignals<vci_param> * signal_vci_vcitimer = soclib::common::alloc_elems<soclib::caba::VciSignals<vci_param> >("signal_vci_vcitimer",4);
154
155        sc_signal<bool> signal_icu_irq0("signal_icu_irq0");
156        sc_signal<bool> signal_icu_irq1("signal_icu_irq1");
157        sc_signal<bool> signal_icu_irq2("signal_icu_irq2");
158        sc_signal<bool> signal_icu_irq3("signal_icu_irq3");
159        sc_signal<bool> signal_icu_irq4("signal_icu_irq4");
160        sc_signal<bool> signal_icu_irq5("signal_icu_irq5");
161        sc_signal<bool> signal_icu_irq6("signal_icu_irq6");
162
163        sc_signal<bool> signal_tty_irq4("signal_tty_irq4"); 
164        sc_signal<bool> signal_tty_irq5("signal_tty_irq5"); 
165        sc_signal<bool> signal_tty_irq6("signal_tty_irq6"); 
166        sc_signal<bool> signal_tty_irq7("signal_tty_irq7"); 
167        sc_signal<bool> signal_tty_irq8("signal_tty_irq8"); 
168        sc_signal<bool> signal_tty_irq9("signal_tty_irq9"); 
169        sc_signal<bool> signal_tty_irq10("signal_tty_irq10"); 
170        sc_signal<bool> signal_tty_irq11("signal_tty_irq11"); 
171        sc_signal<bool> signal_tty_irq12("signal_tty_irq12"); 
172        sc_signal<bool> signal_tty_irq13("signal_tty_irq13"); 
173        sc_signal<bool> signal_tty_irq14("signal_tty_irq14"); 
174        sc_signal<bool> signal_tty_irq15("signal_tty_irq15"); 
175
176
177        soclib::caba::GateSignals2<37,33> gate_PN[4][2];
178        soclib::caba::GateSignals2<37,33> gate_CN[4][2];
179
180
181
182        ///////////////////////////////////////////////////////////////
183        // Components
184        ///////////////////////////////////////////////////////////////
185
186        // VCI ports indexation : 3 initiateurs et 5 cibles
187
188        // INIT0 : proc0_ini
189        // INIT1 : memc_ini
190        // INIT2 : memc_ixr
191
192        // TGT 0 : rom_tgt
193        // TGT 1 : tty_tgt
194        // TGT 2 : xram_tgt
195        // TGT 3 : memc_tgt
196        // TGT 4 : proc0_tgt
197
198        soclib::common::Loader loader("soft/bin.soft");
199
200        // 16 MIPS processors (4 processors per cluster)
201        soclib::caba::VciCcXCacheWrapperV4<vci_param, proc_iss> * proc = (soclib::caba::VciCcXCacheWrapperV4<vci_param, proc_iss > *) malloc(sizeof(soclib::caba::VciCcXCacheWrapperV4<vci_param, proc_iss> )*16);
202        for(int i=0; i<4; i++)
203                for(int j=0; j<4; j++)
204                        new(&proc[4*i+j]) soclib::caba::VciCcXCacheWrapperV4<vci_param, proc_iss> ("proc" + (4*i+j), 4*i+j, maptabp, maptabc,IntTab(i,j),IntTab(i,j),IntTab(i,j),4,64,16,4,64,16);
205
206        // ROM which contains boot code
207        soclib::caba::VciSimpleRam<vci_param> 
208        rom("rom", IntTab(2,2), maptabp, loader);
209
210        // External RAM
211        soclib::caba::VciSimpleRam<vci_param> 
212        xram("xram",IntTab(0,0),maptabx, loader);
213
214        // Distributed memory caches (1 memory cache per cluster)
215        soclib::caba::VciMemCacheV4<vci_param> * memc = (soclib::caba::VciMemCacheV4<vci_param> *) malloc(sizeof(soclib::caba::VciMemCacheV4<vci_param>)*4);
216        for(int i=0; i<4; i++) //  x_init    c_init    p_tgt     c_tgt
217                new(&memc[i]) soclib::caba::VciMemCacheV4<vci_param>("memc" + (i),maptabp,maptabc,maptabx,IntTab(i,0),IntTab(i,4),IntTab(i,0),IntTab(i,4),16,256,16,4096);
218
219        // Multi TTY Controller : 1 display per processor       
220        soclib::caba::VciMultiTty<vci_param> 
221        tty("tty",IntTab(2,3),maptabp,"tty0","tty1","tty2","tty3","tty4","tty5","tty6","tty7","tty8","tty9","tty10","tty11","tty12","tty13","tty14","tty15",NULL);
222
223  // ICU controller : 1 in the third cluster
224        soclib::caba::VciIcu<vci_param> vciicu("vciicu", IntTab(2,4), maptabp,7);
225
226  // Dma controller : 1 in the third custer
227        soclib::caba::VciDmaTsarV2<vci_param> vcidma("vcidma", maptabp, IntTab(2,4), IntTab(2,5), 64);//(1<<(vci_param::K-1)));
228
229  // Block device : 1 in the third cluster
230        soclib::caba::VciBlockDeviceTsarV2<vci_param> vcibd("vcitbd", maptabp, IntTab(2,5), IntTab(2,6), "hdd-img.bin");
231
232  // FrameBuffer : 1 in the fourth cluster
233        soclib::caba::VciFrameBuffer<vci_param> vcifb("vcifb", IntTab(3,2), maptabp, FB_XSIZE, FB_YSIZE);
234
235  // Multi Timer, 1 per cluster
236        soclib::caba::VciTimer<vci_param> * vcitimer = (soclib::caba::VciTimer<vci_param> *) malloc(sizeof(soclib::caba::VciTimer<vci_param>)*4);
237  for(int i=0; i<4; i++)
238    new(&vcitimer[i]) soclib::caba::VciTimer<vci_param>("vcittimer"+i, IntTab(i,1), maptabp, 4);
239
240        // Local ring interconnects : 1 direct ring per cluster
241        soclib::caba::VciLocalRingNetwork2<vci_param, 37, 33> * clusterPN = (soclib::caba::VciLocalRingNetwork2<vci_param, 37, 33> *) malloc(sizeof(soclib::caba::VciLocalRingNetwork2<vci_param, 37, 33> )*4);
242       
243        new(&clusterPN[0]) soclib::caba::VciLocalRingNetwork2<vci_param, 37, 33>("clusterPN0",maptabp, IntTab(0), 2, 18, 4, 2 );
244        new(&clusterPN[1]) soclib::caba::VciLocalRingNetwork2<vci_param, 37, 33>("clusterPN1",maptabp, IntTab(1), 2, 18, 4, 2 );
245        new(&clusterPN[2]) soclib::caba::VciLocalRingNetwork2<vci_param, 37, 33>("clusterPN2",maptabp, IntTab(2), 2, 18, 6, 7 );
246        new(&clusterPN[3]) soclib::caba::VciLocalRingNetwork2<vci_param, 37, 33>("clusterPN3",maptabp, IntTab(3), 2, 18, 4, 3 );
247
248        // Local ring interconnects : 1 coherence ring per cluster
249        soclib::caba::VciLocalRingNetwork2<vci_param, 37, 33> * clusterCN = (soclib::caba::VciLocalRingNetwork2<vci_param, 37, 33> *) malloc(sizeof(soclib::caba::VciLocalRingNetwork2<vci_param, 37, 33> )*4);
250
251        new(&clusterCN[0]) soclib::caba::VciLocalRingNetwork2<vci_param, 37, 33>("clusterCN0",maptabc, IntTab(0), 2, 18, 5, 5 );
252        new(&clusterCN[1]) soclib::caba::VciLocalRingNetwork2<vci_param, 37, 33>("clusterCN1",maptabc, IntTab(1), 2, 18, 5, 5 );
253        new(&clusterCN[2]) soclib::caba::VciLocalRingNetwork2<vci_param, 37, 33>("clusterCN2",maptabc, IntTab(2), 2, 18, 5, 5 );
254        new(&clusterCN[3]) soclib::caba::VciLocalRingNetwork2<vci_param, 37, 33>("clusterCN3",maptabc, IntTab(3), 2, 18, 5, 5 );
255
256        // Local ring interconnects : 1 coherence ring per cluster
257        //soclib::caba::VciLocalRingNetwork2<vci_param, 37, 33> * clusterCN = (soclib::caba::VciLocalRingNetwork2<vci_param, 37, 33> *) malloc(sizeof(soclib::caba::VciLocalRingNetwork2<vci_param, 37, 33> )*4);
258        //for(int i=0; i<4; i++)
259        //      new(&clusterCN[i]) soclib::caba::VciLocalRingNetwork2<vci_param, 37, 33>("clusterCN" + i,maptabc, IntTab(i), 2, 2, 5, 5 );
260
261        // External network
262        soclib::caba::VciVgmn<vci_param> 
263        xring("xring",maptabx, 4, 1, 2, 8);
264
265        // Global interconnect : virtual dspin
266        soclib::caba::VirtualDspinNetwork<2, 2, 1, 1, 37, 1, 3, 6, 7, 0, 36, 33, 1, 3, 15, 16, 0, 18, 18, 32, 33, 34, 35> network("network", 2, 2, NULL);
267
268        ///////////////////////////////////////////////////////////////
269        // Net-list description
270        ///////////////////////////////////////////////////////////////
271
272        // Virtual Dspin Network
273        network.p_clk(signal_clk);
274        network.p_resetn(signal_resetn);
275        for(int i=0; i<2; i++){
276                for(int j=0; j<2; j++){
277                        // GatePN[][1]
278                        network.p_out_cmd[0][i][j].data(        gate_PN[j+2*i][1].cmd_data);
279                        network.p_out_cmd[0][i][j].read(        gate_PN[j+2*i][1].cmd_r_wok);
280                        network.p_out_cmd[0][i][j].write(       gate_PN[j+2*i][1].cmd_w_rok);
281                        network.p_in_rsp[0][i][j].data(         gate_PN[j+2*i][1].rsp_data);
282                        network.p_in_rsp[0][i][j].read(         gate_PN[j+2*i][1].rsp_r_wok);
283                        network.p_in_rsp[0][i][j].write(        gate_PN[j+2*i][1].rsp_w_rok);
284                        // GateCN[][1]
285                        network.p_out_cmd[1][i][j].data(        gate_CN[j+2*i][1].cmd_data);
286                        network.p_out_cmd[1][i][j].read(        gate_CN[j+2*i][1].cmd_r_wok);
287                        network.p_out_cmd[1][i][j].write(       gate_CN[j+2*i][1].cmd_w_rok);
288                        network.p_in_rsp[1][i][j].data(         gate_CN[j+2*i][1].rsp_data);
289                        network.p_in_rsp[1][i][j].read(         gate_CN[j+2*i][1].rsp_r_wok);
290                        network.p_in_rsp[1][i][j].write(        gate_CN[j+2*i][1].rsp_w_rok);
291                        // GatePN[][0]
292                        network.p_in_cmd[0][i][j].data(         gate_PN[j+2*i][0].cmd_data);
293                        network.p_in_cmd[0][i][j].read(         gate_PN[j+2*i][0].cmd_r_wok);
294                        network.p_in_cmd[0][i][j].write(        gate_PN[j+2*i][0].cmd_w_rok);
295                        network.p_out_rsp[0][i][j].data(        gate_PN[j+2*i][0].rsp_data);
296                        network.p_out_rsp[0][i][j].read(        gate_PN[j+2*i][0].rsp_r_wok);
297                        network.p_out_rsp[0][i][j].write(       gate_PN[j+2*i][0].rsp_w_rok);
298                        // GateCN[][0]
299                        network.p_in_cmd[1][i][j].data(         gate_CN[j+2*i][0].cmd_data);
300                        network.p_in_cmd[1][i][j].read(         gate_CN[j+2*i][0].cmd_r_wok);
301                        network.p_in_cmd[1][i][j].write(        gate_CN[j+2*i][0].cmd_w_rok);
302                        network.p_out_rsp[1][i][j].data(        gate_CN[j+2*i][0].rsp_data);
303                        network.p_out_rsp[1][i][j].read(        gate_CN[j+2*i][0].rsp_r_wok);
304                        network.p_out_rsp[1][i][j].write(       gate_CN[j+2*i][0].rsp_w_rok);
305                }
306        }
307       
308        // Processors
309        for(int i=0; i<16; i++){
310                proc[i].p_clk(signal_clk); 
311                proc[i].p_resetn(signal_resetn); 
312                proc[i].p_vci_ini_rw(signal_vci_ini_rw_proc[i]);
313                proc[i].p_vci_ini_c(signal_vci_ini_c_proc[i]);
314                proc[i].p_vci_tgt(signal_vci_tgt_proc[i]);
315                for(int j=0; j<6; j++)
316                        proc[i].p_irq[j](signal_proc_it[i][j]); 
317        }
318#ifdef VCI_LOGGER_ON_L1
319  vci_logger0.p_clk(signal_clk);
320  vci_logger0.p_resetn(signal_resetn);
321  vci_logger0.p_vci(signal_vci_ini_rw_proc[0]);
322#endif
323
324        // ROM
325        rom.p_clk(signal_clk);
326        rom.p_resetn(signal_resetn);
327        rom.p_vci(signal_vci_tgt_rom);
328
329        // TTY
330        tty.p_clk(signal_clk);
331        tty.p_resetn(signal_resetn);
332        tty.p_vci(signal_vci_tgt_tty);
333        tty.p_irq[0](signal_icu_irq1); 
334        tty.p_irq[1](signal_icu_irq2); 
335        tty.p_irq[2](signal_icu_irq3); 
336        tty.p_irq[3](signal_icu_irq4); 
337        tty.p_irq[4](signal_tty_irq4);
338        tty.p_irq[5](signal_tty_irq5);
339        tty.p_irq[6](signal_tty_irq6);
340        tty.p_irq[7](signal_tty_irq7); 
341        tty.p_irq[8](signal_tty_irq8);
342        tty.p_irq[9](signal_tty_irq9);
343        tty.p_irq[10](signal_tty_irq10);
344        tty.p_irq[11](signal_tty_irq11); 
345        tty.p_irq[12](signal_tty_irq12);
346        tty.p_irq[13](signal_tty_irq13);
347        tty.p_irq[14](signal_tty_irq14);
348        tty.p_irq[15](signal_tty_irq15); 
349
350  // DMA
351        vcidma.p_clk(signal_clk);
352        vcidma.p_resetn(signal_resetn);
353        vcidma.p_vci_target(signal_vci_dmat);
354        vcidma.p_vci_initiator(signal_vci_dmai);
355        vcidma.p_irq(signal_icu_irq5); 
356
357  // Block Device
358        vcibd.p_clk(signal_clk);
359        vcibd.p_resetn(signal_resetn);
360        vcibd.p_vci_target(signal_vci_vcibd_t);
361  vcibd.p_vci_initiator(signal_vci_vcibd_i);
362  vcibd.p_irq(signal_icu_irq6);
363
364  // Frame Buffer
365        vcifb.p_clk(signal_clk);
366        vcifb.p_resetn(signal_resetn);
367        vcifb.p_vci(signal_vci_vcifb);
368
369  // TIMERs
370  for(int i=0; i<4; i++){
371    vcitimer[i].p_clk(signal_clk);
372    vcitimer[i].p_resetn(signal_resetn);
373    vcitimer[i].p_vci(signal_vci_vcitimer[i]);
374    vcitimer[i].p_irq[1](signal_proc_it[1+i*4][0]); 
375    vcitimer[i].p_irq[2](signal_proc_it[2+i*4][0]); 
376    vcitimer[i].p_irq[3](signal_proc_it[3+i*4][0]);
377  }
378  for(int i=0; i<4; i++){
379    if(i!=2){
380      vcitimer[i].p_irq[0](signal_proc_it[0+i*4][0]); 
381    }
382  }
383  vcitimer[2].p_irq[0](signal_icu_irq0);
384
385  // ICU
386        vciicu.p_clk(signal_clk);
387        vciicu.p_resetn(signal_resetn);
388        vciicu.p_vci(signal_vci_icu);
389        vciicu.p_irq_in[0](signal_icu_irq0);
390        vciicu.p_irq_in[1](signal_icu_irq1);
391        vciicu.p_irq_in[2](signal_icu_irq2);
392        vciicu.p_irq_in[3](signal_icu_irq3);
393        vciicu.p_irq_in[4](signal_icu_irq4);
394        vciicu.p_irq_in[5](signal_icu_irq5);
395        vciicu.p_irq_in[6](signal_icu_irq6);
396        vciicu.p_irq(signal_proc_it[8][0]);
397
398
399        // Memory caches
400        for(int i=0; i<4; i++){
401                memc[i].p_clk(signal_clk);
402                memc[i].p_resetn(signal_resetn);
403                memc[i].p_vci_tgt(signal_vci_tgt_memc[i]);     
404                memc[i].p_vci_ini(signal_vci_ini_memc[i]);
405                memc[i].p_vci_tgt_cleanup(signal_vci_tgt_cleanup_memc[i]);
406                memc[i].p_vci_ixr(signal_vci_ixr_memc[i]);
407        }
408
409        // XRAM
410        xram.p_clk(signal_clk);
411        xram.p_resetn(signal_resetn);
412        xram.p_vci(signal_vci_tgt_xram);       
413
414        // XRING
415        xring.p_clk(signal_clk);
416        xring.p_resetn(signal_resetn);
417        for(int i=0; i<4; i++)
418                xring.p_to_initiator[i](signal_vci_ixr_memc[i]);
419        xring.p_to_target[0](signal_vci_tgt_xram);
420
421        // direct ring
422        for(int i=0; i<4; i++){
423                clusterPN[i].p_clk(signal_clk);
424                clusterPN[i].p_resetn(signal_resetn);
425                clusterPN[i].p_to_target[0](signal_vci_tgt_memc[i]);
426                clusterPN[i].p_to_target[1](signal_vci_vcitimer[i]);
427                clusterPN[i].p_gate_initiator(gate_PN[i][1]);
428                clusterPN[i].p_gate_target(gate_PN[i][0]);
429                for(int j=0; j<4; j++)
430                        clusterPN[i].p_to_initiator[j](signal_vci_ini_rw_proc[i*4+j]);
431        }
432
433        clusterPN[2].p_to_initiator[4](signal_vci_dmai);
434        clusterPN[2].p_to_initiator[5](signal_vci_vcibd_i);
435
436        clusterPN[2].p_to_target[2](signal_vci_tgt_rom);
437        clusterPN[2].p_to_target[3](signal_vci_tgt_tty);
438        clusterPN[2].p_to_target[4](signal_vci_icu);
439        clusterPN[2].p_to_target[5](signal_vci_dmat);
440        clusterPN[2].p_to_target[6](signal_vci_vcibd_t);
441        clusterPN[3].p_to_target[2](signal_vci_vcifb);
442
443        // coherence ring
444        for(int i=0; i<4; i++){
445                clusterCN[i].p_clk(signal_clk);
446                clusterCN[i].p_resetn(signal_resetn);
447                clusterCN[i].p_to_initiator[4](signal_vci_ini_memc[i]);
448                clusterCN[i].p_to_target[4](signal_vci_tgt_cleanup_memc[i]);
449                clusterCN[i].p_gate_initiator(gate_CN[i][1]);
450                clusterCN[i].p_gate_target(gate_CN[i][0]);
451                for(int j=0; j<4; j++){
452                        clusterCN[i].p_to_target[j](signal_vci_tgt_proc[i*4+j]);
453                        clusterCN[i].p_to_initiator[j](signal_vci_ini_c_proc[i*4+j]);
454    }
455        }
456
457        ////////////////////////////////////////////////////////
458
459        int ncycles;
460#ifndef SOCVIEW
461
462        sc_start(sc_core::sc_time(0, SC_NS));
463        signal_resetn = false;
464
465        sc_start(sc_core::sc_time(1, SC_NS));
466        signal_resetn = true;
467
468        while(1)
469        {
470          sc_start(sc_core::sc_time(CYCLES, SC_NS));
471
472        }
473
474        std::cout << "Hit ENTER to end simulation" << std::endl;
475        char buf[1];
476
477        std::cin.getline(buf,1);
478
479        return EXIT_SUCCESS;
480#else
481        ncycles = 1;
482        sc_start(sc_core::sc_time(0, SC_NS));
483        signal_resetn = false;
484        sc_start(sc_core::sc_time(1, SC_NS));
485        signal_resetn = true;
486
487        debug();
488        return EXIT_SUCCESS;
489#endif
490}
491
492int sc_main (int argc, char *argv[])
493{
494        try {
495                return _main(argc, argv);
496        } catch (std::exception &e) {
497                std::cout << e.what() << std::endl;
498        } catch (...) {
499                std::cout << "Unknown exception occured" << std::endl;
500                throw;
501        }
502        return 1;
503}
Note: See TracBrowser for help on using the repository browser.