Ticket #26: top.cpp

File top.cpp, 8.9 KB (added by alexandre.chagoya-garzon@…, 17 years ago)
Line 
1/*
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 * Copyright (c) UPMC, Lip6, SoC
23 * Nicolas Pouillon <nipo@ssji.net>, 2006-2007
24 *
25 * Maintainers: nipo
26 */
27
28#include <iostream>
29#include <cstdlib>
30#include <cstdio>
31
32#include "mips32.h"
33#include "mapping_table.h"
34#include "gdbserver.h"
35#include "vci_xcache_wrapper.h"
36#include "vci_timer.h"
37#include "vci_framebuffer.h"
38#include "vci_fd_access.h"
39#include "vci_ram.h"
40#include "vci_multi_tty.h"
41#include "vci_vgmn.h"
42#include "vci_locks.h"
43#include "vci_dma.h"
44
45#include "segmentation.h"
46
47#define FB_WIDTH 256
48#define FB_HEIGHT 144
49
50using namespace std;
51using namespace sc_core;
52using namespace soclib::caba;
53using namespace soclib::common;
54
55typedef VciParams<4,6,32,1,1,1,8,1,1,1> vci_param;
56
57int _main(int argc, char *argv[])
58{
59 char * simulation_ncycles_var = getenv ("SIMULATION_N_CYCLES");
60 char * simulation_ncpus_var = getenv ("SIMULATION_N_CPUS");
61 long int n_cycles = 0, n_cpus = 0;
62
63 /*
64 * Check the parameters : param 1 is the name of the simulated application.
65 */
66
67 if (argc != 2)
68 {
69 cout << "[PLATFORM] Wrong number of arguments." << endl;
70 cout << "Usage : ./simulation application_name" << endl;
71 exit (-1);
72 }
73
74 /*
75 * Simulation cycles
76 */
77
78 if (simulation_ncycles_var == NULL)
79 {
80 cout << "[PLATFORM] SIMULATION_N_CYCLES not defined." << endl;
81 n_cycles = -1;
82 }
83 else
84 {
85 n_cycles = strtol(simulation_ncycles_var, (char **)NULL, 10);
86 if (n_cycles == 0)
87 {
88 cout << "[PLATFORM] Invalid SIMULATION_N_CYCLES value, defaulting to infinite." << endl;
89 n_cycles = -1;
90 }
91 }
92
93 if (n_cycles == -1)
94 {
95 cout << "[PLATFORM] Infinite simulation." << endl;
96 }
97 else
98 {
99 cout << "[PLATFORM] Simulating " << n_cycles << " cycle(s)." << endl;
100 }
101
102 /*
103 * Number of CPUs
104 */
105
106 if (simulation_ncpus_var == NULL)
107 {
108 cout << "[PLATFORM] SIMULATION_N_CPUS not defined." << endl;
109 n_cpus = 1;
110 }
111 else
112 {
113 n_cpus = strtol(simulation_ncpus_var, (char **)NULL, 10);
114 if (n_cpus == 0)
115 {
116 cout << "[PLATFORM] Invalid SIMULATION_N_CPUS value, defaulting to 1." << endl;
117 n_cpus = 1;
118 }
119 }
120
121 cout << "[PLATFORM] Using " << n_cpus << " CPU(s)." << endl;
122
123 /*
124 * Mapping table for the mips
125 */
126
127 MappingTable maptab(32, IntTab(8), IntTab(8), 0x00300000);
128
129 maptab.add(Segment("reset", RESET_BASE, RESET_SIZE, IntTab(0), false));
130 maptab.add(Segment("excep", EXCEP_BASE, EXCEP_SIZE, IntTab(0), false));
131 maptab.add(Segment("memory", MEMORY_BASE, MEMORY_SIZE , IntTab(0), false));
132 maptab.add(Segment("cmemory", CHANNEL_MEMORY_BASE, CHANNEL_MEMORY_SIZE , IntTab(1), false));
133 maptab.add(Segment("tty", TTY_BASE, TTY_SIZE, IntTab(2), false));
134 maptab.add(Segment("timer", TIMER_BASE, TIMER_SIZE, IntTab(3), false));
135 maptab.add(Segment("fb", FB_BASE, FB_SIZE, IntTab(4), false));
136 maptab.add(Segment("fd", FD_BASE, FD_SIZE, IntTab(5), false, true, IntTab(n_cpus)));
137 maptab.add(Segment("dma", DMA_BASE, DMA_SIZE, IntTab(6), false));
138 maptab.add(Segment("locks", LOCKS_BASE, LOCKS_SIZE, IntTab(7), false));
139
140
141 /*
142 * Signals
143 */
144
145 sc_clock signal_clk("signal_clk");
146 sc_signal<bool> signal_resetn("signal_resetn");
147
148 sc_signal<bool> signal_fd_it("signal_fd_it");
149 sc_signal<bool> * signal_mips_it[n_cpus][6];
150 VciSignals<vci_param> * signal_vci_m[n_cpus];
151
152 for (int i = 0; i < n_cpus; i++)
153 {
154 char m_name[32];
155
156 sprintf (m_name, "signal_vci_m%d", i);
157 signal_vci_m[i] = new VciSignals<vci_param> (m_name);
158
159 for (int j = 0; j < 6; j++)
160 {
161 char it_name[32];
162
163 sprintf (it_name, "signal_mips%d_it%d", i, j);
164 signal_mips_it[i][j] = new sc_signal<bool> (it_name);
165 }
166 }
167
168 VciSignals<vci_param> signal_vci_vcimultiram0("signal_vci_vcimultiram0");
169 VciSignals<vci_param> signal_vci_vcicram0("signal_vci_vcicram0");
170 VciSignals<vci_param> signal_vci_tty("signal_vci_tty");
171 VciSignals<vci_param> signal_vci_timer("signal_vci_timer");
172 VciSignals<vci_param> signal_vci_framebuffer("signal_vci_framebuffer");
173 VciSignals<vci_param> signal_vci_fd_i("signal_vci_fd_i");
174 VciSignals<vci_param> signal_vci_fd_t("signal_vci_fd_t");
175 soclib::caba::VciSignals<vci_param> signal_vci_dmai("signal_vci_dmai");
176 soclib::caba::VciSignals<vci_param> signal_vci_dmat("signal_vci_dmat");
177 soclib::caba::VciSignals<vci_param> signal_vci_locks("signal_vci_locks");
178
179
180 /*
181 * Processors
182 */
183
184 VciXcacheWrapper<vci_param, GdbServer<Mips32ElIss> > * cache[n_cpus];
185
186 for (int i = 0; i < n_cpus; i++)
187 {
188 char cache_name[32];
189
190 sprintf (cache_name, "CPU%d", i);
191 cache[i] = new VciXcacheWrapper<vci_param, GdbServer<Mips32ElIss> > (cache_name, i, maptab, IntTab(i), 4, 1, 8, 4, 1, 8);
192
193 cache[i] -> p_clk (signal_clk);
194 cache[i] -> p_resetn (signal_resetn);
195 cache[i] -> p_vci (*signal_vci_m[i]);
196
197 for (int j = 0; j < 6; j ++)
198 {
199 cache[i] -> p_irq[j] (*signal_mips_it[i][j]);
200 }
201 }
202
203 /*
204 * Memory
205 */
206
207 Loader loader(argv[1]);
208 VciRam<vci_param> vcimultiram0("vcimultiram0", IntTab(0), maptab, loader);
209
210 vcimultiram0 . p_clk(signal_clk);
211 vcimultiram0 . p_resetn(signal_resetn);
212 vcimultiram0 . p_vci(signal_vci_vcimultiram0);
213
214
215 /*
216 * Channel Memory
217 */
218
219 VciRam<vci_param> vcicram0("vcicmemory", IntTab(1), maptab, loader);
220
221 vcicram0 . p_clk(signal_clk);
222 vcicram0 . p_resetn(signal_resetn);
223 vcicram0 . p_vci(signal_vci_vcicram0);
224
225
226
227 /*
228 * TTY
229 */
230
231 VciMultiTty<vci_param> vcitty("vcitty", IntTab(2), maptab, "tty0", "tty1", NULL);
232
233 vcitty . p_clk (signal_clk);
234 vcitty . p_resetn (signal_resetn);
235 vcitty . p_vci (signal_vci_tty);
236 vcitty . p_irq[0] (*signal_mips_it[0][1]);
237 vcitty . p_irq[1] (*signal_mips_it[0][2]);
238
239 /*
240 * Timer
241 */
242
243 VciTimer<vci_param> vcitimer("vcittimer", IntTab(3), maptab, n_cpus);
244
245 vcitimer . p_clk (signal_clk);
246 vcitimer . p_resetn (signal_resetn);
247 vcitimer . p_vci (signal_vci_timer);
248
249 for (int i = 0; i < n_cpus; i += 1)
250 {
251 vcitimer . p_irq[i] (*signal_mips_it[i][0]);
252 }
253
254 /*
255<<<<<<< HEAD:top.cpp
256 * Framebuffer
257 */
258
259 VciFrameBuffer<vci_param> vcifb("fb0", IntTab(4), maptab, FB_WIDTH, FB_HEIGHT);
260
261 vcifb . p_clk (signal_clk);
262 vcifb . p_resetn (signal_resetn);
263 vcifb . p_vci (signal_vci_framebuffer);
264
265 /*
266 * FD
267 */
268
269 VciFdAccess<vci_param> vcifd("vcifd", maptab, IntTab(n_cpus), IntTab(5));
270
271 vcifd . p_clk (signal_clk);
272 vcifd . p_resetn (signal_resetn);
273 vcifd . p_vci_initiator (signal_vci_fd_i);
274 vcifd . p_vci_target (signal_vci_fd_t);
275 vcifd . p_irq (signal_fd_it);
276
277/*
278 * DMA
279 */
280
281 soclib::caba::VciDma<vci_param> vcidma("vcidma", maptab, IntTab(n_cpus+2), IntTab(6), (1<<(vci_param::K-1)));
282
283
284 vcidma.p_clk(signal_clk);
285 vcidma.p_resetn(signal_resetn);
286 vcidma.p_vci_target(signal_vci_dmat);
287 vcidma.p_vci_initiator(signal_vci_dmai);
288 vcidma.p_irq(*signal_mips_it[0][3]);
289
290/*
291 * LOCKS
292 */
293
294 soclib::caba::VciLocks<vci_param> vcilocks("vcilocks", IntTab(7), maptab);
295
296
297 vcilocks.p_clk(signal_clk);
298 vcilocks.p_resetn(signal_resetn);
299 vcilocks.p_vci(signal_vci_locks);
300
301
302 /*
303 * Network
304 */
305
306 VciVgmn<vci_param> vgmn("vgmn",maptab, n_cpus + 2, 8, 1, 8);
307
308 vgmn . p_clk (signal_clk);
309 vgmn . p_resetn (signal_resetn);
310
311 for (int i = 0; i < n_cpus; i++)
312 {
313 vgmn . p_to_initiator[i] (*signal_vci_m[i]);
314 }
315
316 vgmn . p_to_initiator[n_cpus] (signal_vci_fd_i);
317 vgmn . p_to_initiator[n_cpus+1] (signal_vci_dmai);
318
319 vgmn . p_to_target[0] (signal_vci_vcimultiram0);
320 vgmn . p_to_target[1] (signal_vci_vcicram0);
321 vgmn . p_to_target[2] (signal_vci_tty);
322 vgmn . p_to_target[3] (signal_vci_timer);
323 vgmn . p_to_target[4] (signal_vci_framebuffer);
324 vgmn . p_to_target[5] (signal_vci_fd_t);
325 vgmn . p_to_target[6] (signal_vci_dmat);
326 vgmn . p_to_target[7] (signal_vci_locks);
327
328 /*
329 * Start of simulation
330 */
331
332 sc_start(sc_core::sc_time(0, SC_NS));
333 signal_resetn = false;
334
335 sc_start(sc_core::sc_time(1, SC_NS));
336 signal_resetn = true;
337
338 if (n_cycles == -1)
339 {
340 sc_start();
341 }
342 else
343 {
344 sc_start(sc_core::sc_time(n_cycles, SC_NS));
345 }
346
347 return EXIT_SUCCESS;
348}
349
350int sc_main (int argc, char *argv[])
351{
352 try
353 {
354 return _main(argc, argv);
355 }
356 catch (exception &e)
357 {
358 cout << e.what() << endl;
359 }
360 catch (...)
361 {
362 cout << "Unknown exception occured" << endl;
363 throw;
364 }
365
366 return 1;
367}