source: trunk/softs/test_llsc/top.cpp@ 571

Last change on this file since 571 was 571, checked in by meunier, 13 years ago

Correction of the "double barrier" problem from the user point of view for the generated llsc tests (use of 2 distinct barriers)

File size: 39.1 KB
Line 
1/////////////////////////////////////////////////////////////////////////
2// File: top.cpp
3// Author: Alain Greiner
4// Copyright: UPMC/LIP6
5// Date : may 2013
6// This program is released under the GNU public license
7/////////////////////////////////////////////////////////////////////////
8// This file define a generic TSAR architecture.
9// The physical address space is 40 bits.
10//
11// The number of clusters cannot be larger than 256.
12// The number of processors per cluster cannot be larger than 8.
13//
14// - It uses four dspin_local_crossbar per cluster as local interconnect
15// - It uses two virtual_dspin routers per cluster as global interconnect
16// - It uses the vci_cc_vcache_wrapper
17// - It uses the vci_mem_cache
18// - It contains one vci_xicu per cluster.
19// - It contains one vci_multi_dma per cluster.
20// - It contains one vci_simple_ram per cluster to model the L3 cache.
21//
22// The communication between the MemCache and the Xram is 64 bits.
23//
24// All clusters are identical, but the cluster 0 (called io_cluster),
25// contains 6 extra components:
26// - the boot rom (BROM)
27// - the disk controller (BDEV)
28// - the multi-channel network controller (MNIC)
29// - the multi-channel chained buffer dma controller (CDMA)
30// - the multi-channel tty controller (MTTY)
31// - the frame buffer controller (FBUF)
32//
33// It is build with one single component implementing a cluster,
34// defined in files tsar_xbar_cluster.* (with * = cpp, h, sd)
35//
36// The IRQs are connected to XICUs as follow:
37// - The IRQ_IN[0] to IRQ_IN[7] ports are not used in all clusters.
38// - The DMA IRQs are connected to IRQ_IN[8] to IRQ_IN[15] in all clusters.
39// - The TTY IRQs are connected to IRQ_IN[16] to IRQ_IN[30] in I/O cluster.
40// - The BDEV IRQ is connected to IRQ_IN[31] in I/O cluster.
41//
42// Some hardware parameters are used when compiling the OS, and are used
43// by this top.cpp file. They must be defined in the hard_config.h file :
44// - CLUSTER_X : number of clusters in a row (power of 2)
45// - CLUSTER_Y : number of clusters in a column (power of 2)
46// - CLUSTER_SIZE : size of the segment allocated to a cluster
47// - NB_PROCS_MAX : number of processors per cluster (power of 2)
48// - NB_DMA_CHANNELS : number of DMA channels per cluster (< 9)
49// - NB_TTY_CHANNELS : number of TTY channels in I/O cluster (< 16)
50// - NB_NIC_CHANNELS : number of NIC channels in I/O cluster (< 9)
51//
52// Some other hardware parameters are not used when compiling the OS,
53// and can be directly defined in this top.cpp file:
54// - XRAM_LATENCY : external ram latency
55// - MEMC_WAYS : L2 cache number of ways
56// - MEMC_SETS : L2 cache number of sets
57// - L1_IWAYS
58// - L1_ISETS
59// - L1_DWAYS
60// - L1_DSETS
61// - FBUF_X_SIZE : width of frame buffer (pixels)
62// - FBUF_Y_SIZE : heigth of frame buffer (lines)
63// - BDEV_SECTOR_SIZE : block size for block drvice
64// - BDEV_IMAGE_NAME : file pathname for block device
65// - NIC_RX_NAME : file pathname for NIC received packets
66// - NIC_TX_NAME : file pathname for NIC transmited packets
67// - NIC_TIMEOUT : max number of cycles before closing a container
68/////////////////////////////////////////////////////////////////////////
69// General policy for 40 bits physical address decoding:
70// All physical segments base addresses are multiple of 1 Mbytes
71// (=> the 24 LSB bits = 0, and the 16 MSB bits define the target)
72// The (x_width + y_width) MSB bits (left aligned) define
73// the cluster index, and the LADR bits define the local index:
74// | X_ID | Y_ID |---| LADR | OFFSET |
75// |x_width|y_width|---| 8 | 24 |
76/////////////////////////////////////////////////////////////////////////
77// General policy for 14 bits SRCID decoding:
78// Each component is identified by (x_id, y_id, l_id) tuple.
79// | X_ID | Y_ID |---| L_ID |
80// |x_width|y_width|---| 6 |
81/////////////////////////////////////////////////////////////////////////
82
83#include <systemc>
84#include <sys/time.h>
85#include <iostream>
86#include <sstream>
87#include <cstdlib>
88#include <cstdarg>
89#include <stdint.h>
90
91#include "gdbserver.h"
92#include "mapping_table.h"
93#include "tsar_xbar_cluster.h"
94#include "alloc_elems.h"
95
96///////////////////////////////////////////////////
97// OS
98///////////////////////////////////////////////////
99
100//#define USE_ALMOS
101#define USE_GIET
102
103#ifdef USE_ALMOS
104#ifdef USE_GIET
105#error "Can't use Two different OS"
106#endif
107#endif
108
109#ifndef USE_ALMOS
110#ifndef USE_GIET
111#error "You need to specify one OS"
112#endif
113#endif
114
115///////////////////////////////////////////////////
116// Parallelisation
117///////////////////////////////////////////////////
118#define USE_OPENMP 0
119
120#if USE_OPENMP
121#include <omp.h>
122#endif
123
124// cluster index (computed from x,y coordinates)
125#define cluster(x,y) (y + YMAX * x)
126
127#define min(x, y) (x < y ? x : y)
128
129///////////////////////////////////////////////////////////
130// DSPIN parameters
131///////////////////////////////////////////////////////////
132
133#define dspin_cmd_width 39
134#define dspin_rsp_width 32
135
136///////////////////////////////////////////////////////////
137// VCI parameters
138///////////////////////////////////////////////////////////
139
140#define vci_cell_width_int 4
141#define vci_cell_width_ext 8
142
143#ifdef USE_ALMOS
144#define vci_address_width 32
145#endif
146#ifdef USE_GIET
147#define vci_address_width 40
148#endif
149#define vci_plen_width 8
150#define vci_rerror_width 1
151#define vci_clen_width 1
152#define vci_rflag_width 1
153#define vci_srcid_width 14
154#define vci_pktid_width 4
155#define vci_trdid_width 4
156#define vci_wrplen_width 1
157
158////////////////////////////////////////////////////////////
159// Main Hardware Parameters values
160//////////////////////i/////////////////////////////////////
161
162#ifdef USE_ALMOS
163#include "almos/hard_config.h"
164#define PREFIX_OS "almos/"
165#endif
166#ifdef USE_GIET
167#include "scripts/soft/hard_config.h"
168#define PREFIX_OS "giet_vm/"
169#endif
170
171////////////////////////////////////////////////////////////
172// Secondary Hardware Parameters
173//////////////////////i/////////////////////////////////////
174
175#define XMAX CLUSTER_X
176#define YMAX CLUSTER_Y
177
178#define XRAM_LATENCY 0
179
180#define MEMC_WAYS 16
181#define MEMC_SETS 256
182
183#define L1_IWAYS 4
184#define L1_ISETS 64
185
186#define L1_DWAYS 4
187#define L1_DSETS 64
188
189#ifdef USE_ALMOS
190#define FBUF_X_SIZE 512
191#define FBUF_Y_SIZE 512
192#endif
193#ifdef USE_GIET
194#define FBUF_X_SIZE 128
195#define FBUF_Y_SIZE 128
196#endif
197
198#ifdef USE_GIET
199#define BDEV_SECTOR_SIZE 512
200#define BDEV_IMAGE_NAME PREFIX_OS"display/images.raw"
201#endif
202#ifdef USE_ALMOS
203#define BDEV_SECTOR_SIZE 4096
204#define BDEV_IMAGE_NAME PREFIX_OS"hdd-img.bin"
205#endif
206
207#define NIC_RX_NAME PREFIX_OS"nic/rx_packets.txt"
208#define NIC_TX_NAME PREFIX_OS"nic/tx_packets.txt"
209#define NIC_TIMEOUT 10000
210
211#define NORTH 0
212#define SOUTH 1
213#define EAST 2
214#define WEST 3
215
216////////////////////////////////////////////////////////////
217// Software to be loaded in ROM & RAM
218//////////////////////i/////////////////////////////////////
219
220#ifdef USE_ALMOS
221#define soft_name PREFIX_OS"bootloader.bin",\
222 PREFIX_OS"kernel-soclib.bin@0xbfc10000:D",\
223 PREFIX_OS"arch-info.bib@0xBFC08000:D"
224#endif
225#ifdef USE_GIET
226#define soft_pathname "scripts/soft/soft.elf"
227#endif
228
229////////////////////////////////////////////////////////////
230// DEBUG Parameters default values
231//////////////////////i/////////////////////////////////////
232
233#define MAX_FROZEN_CYCLES 100000000
234
235/////////////////////////////////////////////////////////
236// Physical segments definition
237/////////////////////////////////////////////////////////
238// There is 3 segments replicated in all clusters
239// and 5 specific segments in the "IO" cluster
240// (containing address 0xBF000000)
241/////////////////////////////////////////////////////////
242
243#ifdef USE_GIET
244 // specific segments in "IO" cluster : absolute physical address
245 #define BROM_BASE 0x00BFC00000
246 #define BROM_SIZE 0x0000100000 // 1 Mbytes
247
248 #define FBUF_BASE 0x00B2000000
249 #define FBUF_SIZE (FBUF_X_SIZE * FBUF_Y_SIZE * 2)
250
251 #define BDEV_BASE 0x00B3000000
252 #define BDEV_SIZE 0x0000001000 // 4 Kbytes
253
254 #define MTTY_BASE 0x00B4000000
255 #define MTTY_SIZE 0x0000001000 // 4 Kbytes
256
257 #define MNIC_BASE 0x00B5000000
258 #define MNIC_SIZE 0x0000080000 // 512 Kbytes (for 8 channels)
259
260 #define CDMA_BASE 0x00B6000000
261 #define CDMA_SIZE 0x0000004000 * NB_CMA_CHANNELS
262
263 // replicated segments : address is incremented by a cluster offset
264 // offset = cluster(x,y) << (address_width-x_width-y_width);
265
266 #define MEMC_BASE 0x0000000000
267 #define MEMC_SIZE 0x0010000000 // 256 Mbytes per cluster
268
269 #define XICU_BASE 0x00B0000000
270 #define XICU_SIZE 0x0000001000 // 4 Kbytes
271
272 #define MDMA_BASE 0x00B1000000
273 #define MDMA_SIZE 0x0000001000 * NB_DMA_CHANNELS // 4 Kbytes per channel
274
275 #define SIMH_BASE 0x00B7000000
276 #define SIMH_SIZE 0x0000001000
277#endif
278
279#ifdef USE_ALMOS
280 #define CLUSTER_INC (0x80000000ULL / (XMAX * YMAX) * 2)
281
282 #define MEMC_BASE 0x0000000000
283 #define MEMC_SIZE min(0x02000000, (0x80000000 / (XMAX * YMAX)))
284
285 #define BROM_BASE 0x00BFC00000
286 #define BROM_SIZE 0x0000100000 // 1 Mbytes
287
288 #define XICU_BASE (MEMC_SIZE)
289 #define XICU_SIZE 0x0000001000 // 4 Kbytes
290
291 #define MDMA_BASE (XICU_BASE + XICU_SIZE)
292 #define MDMA_SIZE 0x0000001000 * NB_DMA_CHANNELS // 4 Kbytes per channel
293
294 #define BDEV_BASE ((cluster_io_id * (CLUSTER_INC)) + MDMA_BASE + MDMA_SIZE)
295 #define BDEV_SIZE 0x0000001000 // 4 Kbytes
296
297 #define MTTY_BASE (BDEV_BASE + BDEV_SIZE)
298 #define MTTY_SIZE 0x0000001000 // 4 Kbytes
299
300 #define FBUF_BASE (MTTY_BASE + MTTY_SIZE)
301 #define FBUF_SIZE (FBUF_X_SIZE * FBUF_Y_SIZE * 2) // Should be 0x80000
302
303 // Unused in almos
304 #define MNIC_BASE (FBUF_BASE + FBUF_SIZE)
305 #define MNIC_SIZE 0x0000001000
306
307 #define CDMA_BASE (MNIC_BASE + MNIC_SIZE)
308 #define CDMA_SIZE 0x0000004000 * NB_CMA_CHANNELS
309
310#endif
311
312
313////////////////////////////////////////////////////////////////////
314// TGTID definition in direct space
315// For all components: global TGTID = global SRCID = cluster_index
316////////////////////////////////////////////////////////////////////
317
318#define MEMC_TGTID 0
319#define XICU_TGTID 1
320#define MDMA_TGTID 2
321#define MTTY_TGTID 3
322#define FBUF_TGTID 4
323#define BDEV_TGTID 5
324#define MNIC_TGTID 6
325#define BROM_TGTID 7
326#define CDMA_TGTID 8
327#define SIMH_TGTID 9
328
329bool stop_called = false;
330
331/////////////////////////////////
332int _main(int argc, char *argv[])
333{
334 using namespace sc_core;
335 using namespace soclib::caba;
336 using namespace soclib::common;
337
338#ifdef USE_GIET
339 char soft_name[256] = soft_pathname; // pathname to binary code
340#endif
341 uint64_t ncycles = 0xFFFFFFFFFFFFFFFF; // simulated cycles
342 char disk_name[256] = BDEV_IMAGE_NAME; // pathname to the disk image
343 char nic_rx_name[256] = NIC_RX_NAME; // pathname to the rx packets file
344 char nic_tx_name[256] = NIC_TX_NAME; // pathname to the tx packets file
345 ssize_t threads_nr = 1; // simulator's threads number
346 bool debug_ok = false; // trace activated
347 size_t debug_period = 1; // trace period
348 size_t debug_memc_id = 0; // index of memc to be traced
349 size_t debug_proc_id = 0; // index of proc to be traced
350 uint32_t debug_from = 0; // trace start cycle
351 uint32_t frozen_cycles = MAX_FROZEN_CYCLES; // monitoring frozen processor
352 size_t cluster_io_id; // index of cluster containing IOs
353 struct timeval t1,t2;
354 uint64_t ms1,ms2;
355
356 ////////////// command line arguments //////////////////////
357 if (argc > 1)
358 {
359 for (int n = 1; n < argc; n = n + 2)
360 {
361 if ((strcmp(argv[n], "-NCYCLES") == 0) && (n + 1 < argc))
362 {
363 ncycles = atoi(argv[n + 1]);
364 }
365 else if ((strcmp(argv[n], "-SOFT") == 0) && (n + 1 < argc))
366 {
367#ifdef USE_ALMOS
368 assert( 0 && "Can't define almos soft name" );
369#endif
370#ifdef USE_GIET
371 strcpy(soft_name, argv[n + 1]);
372#endif
373 }
374 else if ((strcmp(argv[n],"-DISK") == 0) && (n + 1 < argc))
375 {
376 strcpy(disk_name, argv[n + 1]);
377 }
378 else if ((strcmp(argv[n],"-DEBUG") == 0) && (n + 1 < argc))
379 {
380 debug_ok = true;
381 debug_from = atoi(argv[n + 1]);
382 }
383 else if ((strcmp(argv[n], "-MEMCID") == 0) && (n + 1 < argc))
384 {
385 debug_memc_id = atoi(argv[n + 1]);
386 assert((debug_memc_id < (XMAX * YMAX)) &&
387 "debug_memc_id larger than XMAX * YMAX" );
388 }
389 else if ((strcmp(argv[n], "-PROCID") == 0) && (n + 1 < argc))
390 {
391 debug_proc_id = atoi(argv[n + 1]);
392 assert((debug_proc_id < (XMAX * YMAX * NB_PROCS_MAX)) &&
393 "debug_proc_id larger than XMAX * YMAX * NB_PROCS");
394 }
395 else if ((strcmp(argv[n], "-THREADS") == 0) && ((n + 1) < argc))
396 {
397 threads_nr = atoi(argv[n + 1]);
398 threads_nr = (threads_nr < 1) ? 1 : threads_nr;
399 }
400 else if ((strcmp(argv[n], "-FROZEN") == 0) && (n + 1 < argc))
401 {
402 frozen_cycles = atoi(argv[n + 1]);
403 }
404 else if ((strcmp(argv[n], "-PERIOD") == 0) && (n + 1 < argc))
405 {
406 debug_period = atoi(argv[n + 1]);
407 }
408 else
409 {
410 std::cout << " Arguments are (key,value) couples." << std::endl;
411 std::cout << " The order is not important." << std::endl;
412 std::cout << " Accepted arguments are :" << std::endl << std::endl;
413 std::cout << " -SOFT pathname_for_embedded_soft" << std::endl;
414 std::cout << " -DISK pathname_for_disk_image" << std::endl;
415 std::cout << " -NCYCLES number_of_simulated_cycles" << std::endl;
416 std::cout << " -DEBUG debug_start_cycle" << std::endl;
417 std::cout << " -THREADS simulator's threads number" << std::endl;
418 std::cout << " -FROZEN max_number_of_lines" << std::endl;
419 std::cout << " -PERIOD number_of_cycles between trace" << std::endl;
420 std::cout << " -MEMCID index_memc_to_be_traced" << std::endl;
421 std::cout << " -PROCID index_proc_to_be_traced" << std::endl;
422 exit(0);
423 }
424 }
425 }
426
427 // checking hardware parameters
428 assert( ( (XMAX == 1) or (XMAX == 2) or (XMAX == 4) or
429 (XMAX == 8) or (XMAX == 16) ) and
430 "The XMAX parameter must be 1, 2, 4, 8 or 16" );
431
432 assert( ( (YMAX == 1) or (YMAX == 2) or (YMAX == 4) or
433 (YMAX == 8) or (YMAX == 16) ) and
434 "The YMAX parameter must be 1, 2, 4, 8 or 16" );
435
436 assert( ( (NB_PROCS_MAX == 1) or (NB_PROCS_MAX == 2) or
437 (NB_PROCS_MAX == 4) or (NB_PROCS_MAX == 8) ) and
438 "The NB_PROCS_MAX parameter must be 1, 2, 4 or 8" );
439
440 assert( (NB_DMA_CHANNELS < 9) and
441 "The NB_DMA_CHANNELS parameter must be smaller than 9" );
442
443 assert( (NB_TTY_CHANNELS < 15) and
444 "The NB_TTY_CHANNELS parameter must be smaller than 15" );
445
446 assert( (NB_NIC_CHANNELS < 9) and
447 "The NB_NIC_CHANNELS parameter must be smaller than 9" );
448
449#ifdef USE_GIET
450 assert( (vci_address_width == 40) and
451 "VCI address width with the GIET must be 40 bits" );
452#endif
453
454#ifdef USE_ALMOS
455 assert( (vci_address_width == 32) and
456 "VCI address width with ALMOS must be 32 bits" );
457#endif
458
459
460 std::cout << std::endl;
461 std::cout << " - XMAX = " << XMAX << std::endl;
462 std::cout << " - YMAX = " << YMAX << std::endl;
463 std::cout << " - NB_PROCS_MAX = " << NB_PROCS_MAX << std::endl;
464 std::cout << " - NB_DMA_CHANNELS = " << NB_DMA_CHANNELS << std::endl;
465 std::cout << " - NB_TTY_CHANNELS = " << NB_TTY_CHANNELS << std::endl;
466 std::cout << " - NB_NIC_CHANNELS = " << NB_NIC_CHANNELS << std::endl;
467 std::cout << " - MEMC_WAYS = " << MEMC_WAYS << std::endl;
468 std::cout << " - MEMC_SETS = " << MEMC_SETS << std::endl;
469 std::cout << " - RAM_LATENCY = " << XRAM_LATENCY << std::endl;
470 std::cout << " - MAX_FROZEN = " << frozen_cycles << std::endl;
471 std::cout << "[PROCS] " << NB_PROCS_MAX * XMAX * YMAX << std::endl;
472
473 std::cout << std::endl;
474 // Internal and External VCI parameters definition
475 typedef soclib::caba::VciParams<vci_cell_width_int,
476 vci_plen_width,
477 vci_address_width,
478 vci_rerror_width,
479 vci_clen_width,
480 vci_rflag_width,
481 vci_srcid_width,
482 vci_pktid_width,
483 vci_trdid_width,
484 vci_wrplen_width> vci_param_int;
485
486 typedef soclib::caba::VciParams<vci_cell_width_ext,
487 vci_plen_width,
488 vci_address_width,
489 vci_rerror_width,
490 vci_clen_width,
491 vci_rflag_width,
492 vci_srcid_width,
493 vci_pktid_width,
494 vci_trdid_width,
495 vci_wrplen_width> vci_param_ext;
496
497#if USE_OPENMP
498 omp_set_dynamic(false);
499 omp_set_num_threads(threads_nr);
500 std::cerr << "Built with openmp version " << _OPENMP << std::endl;
501#endif
502
503 // Define parameters depending on mesh size
504 size_t x_width;
505 size_t y_width;
506
507 if (XMAX == 1) x_width = 0;
508 else if (XMAX == 2) x_width = 1;
509 else if (XMAX <= 4) x_width = 2;
510 else if (XMAX <= 8) x_width = 3;
511 else x_width = 4;
512
513 if (YMAX == 1) y_width = 0;
514 else if (YMAX == 2) y_width = 1;
515 else if (YMAX <= 4) y_width = 2;
516 else if (YMAX <= 8) y_width = 3;
517 else y_width = 4;
518
519
520#ifdef USE_ALMOS
521 cluster_io_id = 0xbfc00000 >> (vci_address_width - x_width - y_width); // index of cluster containing IOs
522#else
523 cluster_io_id = 0;
524#endif
525
526 /////////////////////
527 // Mapping Tables
528 /////////////////////
529
530 // internal network
531 MappingTable maptabd(vci_address_width,
532 IntTab(x_width + y_width, 20 - x_width - y_width),
533 IntTab(x_width + y_width, vci_srcid_width - x_width - y_width),
534 0x00FF800000);
535
536 for (size_t x = 0; x < XMAX; x++)
537 {
538 for (size_t y = 0; y < YMAX; y++)
539 {
540 sc_uint<vci_address_width> offset;
541 offset = (sc_uint<vci_address_width>)cluster(x,y)
542 << (vci_address_width-x_width-y_width);
543
544 std::ostringstream si;
545 si << "seg_xicu_" << x << "_" << y;
546 maptabd.add(Segment(si.str(), XICU_BASE + offset, XICU_SIZE,
547 IntTab(cluster(x,y),XICU_TGTID), false));
548
549 std::ostringstream sd;
550 sd << "seg_mdma_" << x << "_" << y;
551 maptabd.add(Segment(sd.str(), MDMA_BASE + offset, MDMA_SIZE,
552 IntTab(cluster(x,y),MDMA_TGTID), false));
553
554 std::ostringstream sh;
555 sh << "seg_memc_" << x << "_" << y;
556 maptabd.add(Segment(sh.str(), MEMC_BASE + offset, MEMC_SIZE,
557 IntTab(cluster(x,y),MEMC_TGTID), true));
558
559 if ( cluster(x,y) == cluster_io_id )
560 {
561 maptabd.add(Segment("seg_mtty", MTTY_BASE, MTTY_SIZE,
562 IntTab(cluster(x,y),MTTY_TGTID), false));
563 maptabd.add(Segment("seg_fbuf", FBUF_BASE, FBUF_SIZE,
564 IntTab(cluster(x,y),FBUF_TGTID), false));
565 maptabd.add(Segment("seg_bdev", BDEV_BASE, BDEV_SIZE,
566 IntTab(cluster(x,y),BDEV_TGTID), false));
567 maptabd.add(Segment("seg_brom", BROM_BASE, BROM_SIZE,
568 IntTab(cluster(x,y),BROM_TGTID), true));
569 maptabd.add(Segment("seg_mnic", MNIC_BASE, MNIC_SIZE,
570 IntTab(cluster(x,y),MNIC_TGTID), false));
571 maptabd.add(Segment("seg_cdma", CDMA_BASE, CDMA_SIZE,
572 IntTab(cluster(x,y),CDMA_TGTID), false));
573 maptabd.add(Segment("seg_simh", SIMH_BASE, SIMH_SIZE,
574 IntTab(cluster(x,y),SIMH_TGTID), false));
575 }
576 }
577 }
578 std::cout << maptabd << std::endl;
579
580 // external network
581 MappingTable maptabx(vci_address_width,
582 IntTab(x_width+y_width),
583 IntTab(x_width+y_width),
584 0xFFFF000000ULL);
585
586 for (size_t x = 0; x < XMAX; x++)
587 {
588 for (size_t y = 0; y < YMAX ; y++)
589 {
590
591 sc_uint<vci_address_width> offset;
592 offset = (sc_uint<vci_address_width>)cluster(x,y)
593 << (vci_address_width-x_width-y_width);
594
595 std::ostringstream sh;
596 sh << "x_seg_memc_" << x << "_" << y;
597
598 maptabx.add(Segment(sh.str(), MEMC_BASE + offset,
599 MEMC_SIZE, IntTab(cluster(x,y)), false));
600 }
601
602 }
603 std::cout << maptabx << std::endl;
604
605 ////////////////////
606 // Signals
607 ///////////////////
608
609 sc_clock signal_clk("clk");
610 sc_signal<bool> signal_resetn("resetn");
611
612 // Horizontal inter-clusters DSPIN signals
613 DspinSignals<dspin_cmd_width>*** signal_dspin_h_cmd_inc =
614 alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_h_cmd_inc", XMAX-1, YMAX, 3);
615 DspinSignals<dspin_cmd_width>*** signal_dspin_h_cmd_dec =
616 alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_h_cmd_dec", XMAX-1, YMAX, 3);
617 DspinSignals<dspin_rsp_width>*** signal_dspin_h_rsp_inc =
618 alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_h_rsp_inc", XMAX-1, YMAX, 2);
619 DspinSignals<dspin_rsp_width>*** signal_dspin_h_rsp_dec =
620 alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_h_rsp_dec", XMAX-1, YMAX, 2);
621
622 // Vertical inter-clusters DSPIN signals
623 DspinSignals<dspin_cmd_width>*** signal_dspin_v_cmd_inc =
624 alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_v_cmd_inc", XMAX, YMAX-1, 3);
625 DspinSignals<dspin_cmd_width>*** signal_dspin_v_cmd_dec =
626 alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_v_cmd_dec", XMAX, YMAX-1, 3);
627 DspinSignals<dspin_rsp_width>*** signal_dspin_v_rsp_inc =
628 alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_v_rsp_inc", XMAX, YMAX-1, 2);
629 DspinSignals<dspin_rsp_width>*** signal_dspin_v_rsp_dec =
630 alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_v_rsp_dec", XMAX, YMAX-1, 2);
631
632 // Mesh boundaries DSPIN signals
633 DspinSignals<dspin_cmd_width>**** signal_dspin_false_cmd_in =
634 alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_false_cmd_in" , XMAX, YMAX, 4, 3);
635 DspinSignals<dspin_cmd_width>**** signal_dspin_false_cmd_out =
636 alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_false_cmd_out", XMAX, YMAX, 4, 3);
637 DspinSignals<dspin_rsp_width>**** signal_dspin_false_rsp_in =
638 alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_false_rsp_in" , XMAX, YMAX, 4, 2);
639 DspinSignals<dspin_rsp_width>**** signal_dspin_false_rsp_out =
640 alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_false_rsp_out", XMAX, YMAX, 4, 2);
641
642
643 ////////////////////////////
644 // Loader
645 ////////////////////////////
646
647 soclib::common::Loader loader(soft_name);
648
649 typedef soclib::common::GdbServer<soclib::common::Mips32ElIss> proc_iss;
650 proc_iss::set_loader(loader);
651
652 ////////////////////////////
653 // Clusters construction
654 ////////////////////////////
655
656 TsarXbarCluster<dspin_cmd_width,
657 dspin_rsp_width,
658 vci_param_int,
659 vci_param_ext>* clusters[XMAX][YMAX];
660
661#if USE_OPENMP
662#pragma omp parallel
663 {
664#pragma omp for
665#endif
666 for (size_t i = 0; i < (XMAX * YMAX); i++)
667 {
668 size_t x = i / YMAX;
669 size_t y = i % YMAX;
670
671#if USE_OPENMP
672#pragma omp critical
673 {
674#endif
675 std::cout << std::endl;
676 std::cout << "Cluster_" << x << "_" << y << std::endl;
677 std::cout << std::endl;
678
679 std::ostringstream sc;
680 sc << "cluster_" << x << "_" << y;
681 clusters[x][y] = new TsarXbarCluster<dspin_cmd_width,
682 dspin_rsp_width,
683 vci_param_int,
684 vci_param_ext>
685 (
686 sc.str().c_str(),
687 NB_PROCS_MAX,
688 NB_TTY_CHANNELS,
689 NB_DMA_CHANNELS,
690 x,
691 y,
692 cluster(x,y),
693 maptabd,
694 maptabx,
695 x_width,
696 y_width,
697 vci_srcid_width - x_width - y_width, // l_id width,
698 MEMC_TGTID,
699 XICU_TGTID,
700 MDMA_TGTID,
701 FBUF_TGTID,
702 MTTY_TGTID,
703 BROM_TGTID,
704 MNIC_TGTID,
705 CDMA_TGTID,
706 BDEV_TGTID,
707 SIMH_TGTID,
708 MEMC_WAYS,
709 MEMC_SETS,
710 L1_IWAYS,
711 L1_ISETS,
712 L1_DWAYS,
713 L1_DSETS,
714 XRAM_LATENCY,
715 (cluster(x,y) == cluster_io_id),
716 FBUF_X_SIZE,
717 FBUF_Y_SIZE,
718 disk_name,
719 BDEV_SECTOR_SIZE,
720 NB_NIC_CHANNELS,
721 nic_rx_name,
722 nic_tx_name,
723 NIC_TIMEOUT,
724 NB_CMA_CHANNELS,
725 loader,
726 frozen_cycles,
727 debug_from,
728 debug_ok and (cluster(x,y) == debug_memc_id),
729 debug_ok and (cluster(x,y) == debug_proc_id)
730 );
731
732#if USE_OPENMP
733 } // end critical
734#endif
735 } // end for
736#if USE_OPENMP
737 }
738#endif
739
740 ///////////////////////////////////////////////////////////////
741 // Net-list
742 ///////////////////////////////////////////////////////////////
743
744 // Clock & RESET
745 for (size_t x = 0; x < (XMAX); x++){
746 for (size_t y = 0; y < YMAX; y++){
747 clusters[x][y]->p_clk (signal_clk);
748 clusters[x][y]->p_resetn (signal_resetn);
749 }
750 }
751
752 // Inter Clusters horizontal connections
753 if (XMAX > 1){
754 for (size_t x = 0; x < (XMAX-1); x++){
755 for (size_t y = 0; y < YMAX; y++){
756 for (size_t k = 0; k < 3; k++){
757 clusters[x][y]->p_cmd_out[EAST][k] (signal_dspin_h_cmd_inc[x][y][k]);
758 clusters[x+1][y]->p_cmd_in[WEST][k] (signal_dspin_h_cmd_inc[x][y][k]);
759 clusters[x][y]->p_cmd_in[EAST][k] (signal_dspin_h_cmd_dec[x][y][k]);
760 clusters[x+1][y]->p_cmd_out[WEST][k] (signal_dspin_h_cmd_dec[x][y][k]);
761 }
762
763 for (size_t k = 0; k < 2; k++){
764 clusters[x][y]->p_rsp_out[EAST][k] (signal_dspin_h_rsp_inc[x][y][k]);
765 clusters[x+1][y]->p_rsp_in[WEST][k] (signal_dspin_h_rsp_inc[x][y][k]);
766 clusters[x][y]->p_rsp_in[EAST][k] (signal_dspin_h_rsp_dec[x][y][k]);
767 clusters[x+1][y]->p_rsp_out[WEST][k] (signal_dspin_h_rsp_dec[x][y][k]);
768 }
769 }
770 }
771 }
772 std::cout << std::endl << "Horizontal connections established" << std::endl;
773
774 // Inter Clusters vertical connections
775 if (YMAX > 1) {
776 for (size_t y = 0; y < (YMAX-1); y++){
777 for (size_t x = 0; x < XMAX; x++){
778 for (size_t k = 0; k < 3; k++){
779 clusters[x][y]->p_cmd_out[NORTH][k] (signal_dspin_v_cmd_inc[x][y][k]);
780 clusters[x][y+1]->p_cmd_in[SOUTH][k] (signal_dspin_v_cmd_inc[x][y][k]);
781 clusters[x][y]->p_cmd_in[NORTH][k] (signal_dspin_v_cmd_dec[x][y][k]);
782 clusters[x][y+1]->p_cmd_out[SOUTH][k] (signal_dspin_v_cmd_dec[x][y][k]);
783 }
784
785 for (size_t k = 0; k < 2; k++){
786 clusters[x][y]->p_rsp_out[NORTH][k] (signal_dspin_v_rsp_inc[x][y][k]);
787 clusters[x][y+1]->p_rsp_in[SOUTH][k] (signal_dspin_v_rsp_inc[x][y][k]);
788 clusters[x][y]->p_rsp_in[NORTH][k] (signal_dspin_v_rsp_dec[x][y][k]);
789 clusters[x][y+1]->p_rsp_out[SOUTH][k] (signal_dspin_v_rsp_dec[x][y][k]);
790 }
791 }
792 }
793 }
794 std::cout << "Vertical connections established" << std::endl;
795
796 // East & West boundary cluster connections
797 for (size_t y = 0; y < YMAX; y++)
798 {
799 for (size_t k = 0; k < 3; k++)
800 {
801 clusters[0][y]->p_cmd_in[WEST][k] (signal_dspin_false_cmd_in[0][y][WEST][k]);
802 clusters[0][y]->p_cmd_out[WEST][k] (signal_dspin_false_cmd_out[0][y][WEST][k]);
803 clusters[XMAX-1][y]->p_cmd_in[EAST][k] (signal_dspin_false_cmd_in[XMAX-1][y][EAST][k]);
804 clusters[XMAX-1][y]->p_cmd_out[EAST][k] (signal_dspin_false_cmd_out[XMAX-1][y][EAST][k]);
805 }
806
807 for (size_t k = 0; k < 2; k++)
808 {
809 clusters[0][y]->p_rsp_in[WEST][k] (signal_dspin_false_rsp_in[0][y][WEST][k]);
810 clusters[0][y]->p_rsp_out[WEST][k] (signal_dspin_false_rsp_out[0][y][WEST][k]);
811 clusters[XMAX-1][y]->p_rsp_in[EAST][k] (signal_dspin_false_rsp_in[XMAX-1][y][EAST][k]);
812 clusters[XMAX-1][y]->p_rsp_out[EAST][k] (signal_dspin_false_rsp_out[XMAX-1][y][EAST][k]);
813 }
814 }
815
816 // North & South boundary clusters connections
817 for (size_t x = 0; x < XMAX; x++)
818 {
819 for (size_t k = 0; k < 3; k++)
820 {
821 clusters[x][0]->p_cmd_in[SOUTH][k] (signal_dspin_false_cmd_in[x][0][SOUTH][k]);
822 clusters[x][0]->p_cmd_out[SOUTH][k] (signal_dspin_false_cmd_out[x][0][SOUTH][k]);
823 clusters[x][YMAX-1]->p_cmd_in[NORTH][k] (signal_dspin_false_cmd_in[x][YMAX-1][NORTH][k]);
824 clusters[x][YMAX-1]->p_cmd_out[NORTH][k] (signal_dspin_false_cmd_out[x][YMAX-1][NORTH][k]);
825 }
826
827 for (size_t k = 0; k < 2; k++)
828 {
829 clusters[x][0]->p_rsp_in[SOUTH][k] (signal_dspin_false_rsp_in[x][0][SOUTH][k]);
830 clusters[x][0]->p_rsp_out[SOUTH][k] (signal_dspin_false_rsp_out[x][0][SOUTH][k]);
831 clusters[x][YMAX-1]->p_rsp_in[NORTH][k] (signal_dspin_false_rsp_in[x][YMAX-1][NORTH][k]);
832 clusters[x][YMAX-1]->p_rsp_out[NORTH][k] (signal_dspin_false_rsp_out[x][YMAX-1][NORTH][k]);
833 }
834 }
835 std::cout << "North, South, West, East connections established" << std::endl;
836 std::cout << std::endl;
837
838
839 ////////////////////////////////////////////////////////
840 // Simulation
841 ///////////////////////////////////////////////////////
842
843 sc_start(sc_core::sc_time(0, SC_NS));
844 signal_resetn = false;
845
846 // network boundaries signals
847 for (size_t x = 0; x < XMAX ; x++){
848 for (size_t y = 0; y < YMAX ; y++){
849 for (size_t a = 0; a < 4; a++){
850 for (size_t k = 0; k < 3; k++){
851 signal_dspin_false_cmd_in [x][y][a][k].write = false;
852 signal_dspin_false_cmd_in [x][y][a][k].read = true;
853 signal_dspin_false_cmd_out[x][y][a][k].write = false;
854 signal_dspin_false_cmd_out[x][y][a][k].read = true;
855 }
856
857 for (size_t k = 0; k < 2; k++){
858 signal_dspin_false_rsp_in [x][y][a][k].write = false;
859 signal_dspin_false_rsp_in [x][y][a][k].read = true;
860 signal_dspin_false_rsp_out[x][y][a][k].write = false;
861 signal_dspin_false_rsp_out[x][y][a][k].read = true;
862 }
863 }
864 }
865 }
866
867 sc_start(sc_core::sc_time(1, SC_NS));
868 signal_resetn = true;
869
870 if (gettimeofday(&t1, NULL) != 0)
871 {
872 perror("gettimeofday");
873 return EXIT_FAILURE;
874 }
875
876 for (uint64_t n = 1; n < ncycles && !stop_called; n++)
877 {
878 // Monitor a specific address for L1 & L2 caches
879 //clusters[0][0]->proc[0]->cache_monitor(0x800002c000ULL);
880 //clusters[1][0]->memc->copies_monitor(0x800002C000ULL);
881
882 if( (n % 5000000) == 0)
883 {
884
885 if (gettimeofday(&t2, NULL) != 0)
886 {
887 perror("gettimeofday");
888 return EXIT_FAILURE;
889 }
890
891 ms1 = (uint64_t) t1.tv_sec * 1000ULL + (uint64_t) t1.tv_usec / 1000;
892 ms2 = (uint64_t) t2.tv_sec * 1000ULL + (uint64_t) t2.tv_usec / 1000;
893 std::cerr << "platform clock frequency " << (double) 5000000 / (double) (ms2 - ms1) << "Khz" << std::endl;
894
895 if (gettimeofday(&t1, NULL) != 0)
896 {
897 perror("gettimeofday");
898 return EXIT_FAILURE;
899 }
900 }
901
902 if (debug_ok and (n > debug_from) and (n % debug_period == 0))
903 {
904 std::cout << "****************** cycle " << std::dec << n ;
905 std::cout << " ************************************************" << std::endl;
906
907 // trace proc[debug_proc_id]
908 size_t l = debug_proc_id % NB_PROCS_MAX ;
909 size_t y = (debug_proc_id / NB_PROCS_MAX) % YMAX ;
910 size_t x = debug_proc_id / (YMAX * NB_PROCS_MAX) ;
911
912 std::ostringstream proc_signame;
913 proc_signame << "[SIG]PROC_" << x << "_" << y << "_" << l ;
914 std::ostringstream p2m_signame;
915 p2m_signame << "[SIG]PROC_" << x << "_" << y << "_" << l << " P2M" ;
916 std::ostringstream m2p_signame;
917 m2p_signame << "[SIG]PROC_" << x << "_" << y << "_" << l << " M2P" ;
918 std::ostringstream p_cmd_signame;
919 p_cmd_signame << "[SIG]PROC_" << x << "_" << y << "_" << l << " CMD" ;
920 std::ostringstream p_rsp_signame;
921 p_rsp_signame << "[SIG]PROC_" << x << "_" << y << "_" << l << " RSP" ;
922
923 for (int _x = 0, _y = 0; _x != XMAX; (_y == YMAX - 1 ? _x++, _y = 0 : _y++)) {
924 for (int _l = 0; _l < NB_PROCS_MAX; _l++) {
925 clusters[_x][_y]->proc[_l]->print_trace();
926 }
927 }
928 //clusters[x][y]->wi_proc[l]->print_trace();
929 //clusters[x][y]->signal_vci_ini_proc[l].print_trace(proc_signame.str());
930 //clusters[x][y]->signal_dspin_p2m_proc[l].print_trace(p2m_signame.str());
931 //clusters[x][y]->signal_dspin_m2p_proc[l].print_trace(m2p_signame.str());
932 //clusters[x][y]->signal_dspin_cmd_proc_i[l].print_trace(p_cmd_signame.str());
933 //clusters[x][y]->signal_dspin_rsp_proc_i[l].print_trace(p_rsp_signame.str());
934
935 //clusters[x][y]->xbar_rsp_d->print_trace();
936 //clusters[x][y]->xbar_cmd_d->print_trace();
937 //clusters[x][y]->signal_dspin_cmd_l2g_d.print_trace("[SIG]L2G CMD");
938 //clusters[x][y]->signal_dspin_cmd_g2l_d.print_trace("[SIG]G2L CMD");
939 //clusters[x][y]->signal_dspin_rsp_l2g_d.print_trace("[SIG]L2G RSP");
940 //clusters[x][y]->signal_dspin_rsp_g2l_d.print_trace("[SIG]G2L RSP");
941
942 // trace memc[debug_memc_id]
943 x = debug_memc_id / YMAX;
944 y = debug_memc_id % YMAX;
945
946 std::ostringstream smemc;
947 smemc << "[SIG]MEMC_" << x << "_" << y;
948 std::ostringstream sxram;
949 sxram << "[SIG]XRAM_" << x << "_" << y;
950 std::ostringstream sm2p;
951 sm2p << "[SIG]MEMC_" << x << "_" << y << " M2P" ;
952 std::ostringstream sp2m;
953 sp2m << "[SIG]MEMC_" << x << "_" << y << " P2M" ;
954 std::ostringstream m_cmd_signame;
955 m_cmd_signame << "[SIG]MEMC_" << x << "_" << y << " CMD" ;
956 std::ostringstream m_rsp_signame;
957 m_rsp_signame << "[SIG]MEMC_" << x << "_" << y << " RSP" ;
958
959 clusters[x][y]->memc->print_trace();
960 //clusters[x][y]->wt_memc->print_trace();
961 //clusters[x][y]->signal_vci_tgt_memc.print_trace(smemc.str());
962 //clusters[x][y]->signal_vci_xram.print_trace(sxram.str());
963 //clusters[x][y]->signal_dspin_p2m_memc.print_trace(sp2m.str());
964 //clusters[x][y]->signal_dspin_m2p_memc.print_trace(sm2p.str());
965 //clusters[x][y]->signal_dspin_cmd_memc_t.print_trace(m_cmd_signame.str());
966 //clusters[x][y]->signal_dspin_rsp_memc_t.print_trace(m_rsp_signame.str());
967
968 // trace replicated peripherals
969 //clusters[1][1]->mdma->print_trace();
970 //clusters[1][1]->signal_vci_tgt_mdma.print_trace("[SIG]MDMA_TGT_1_1");
971 //clusters[1][1]->signal_vci_ini_mdma.print_trace("[SIG]MDMA_INI_1_1");
972
973
974 // trace external peripherals
975 //size_t io_x = cluster_io_id / YMAX;
976 //size_t io_y = cluster_io_id % YMAX;
977
978 //clusters[io_x][io_y]->brom->print_trace();
979 //clusters[io_x][io_y]->wt_brom->print_trace();
980 //clusters[io_x][io_y]->signal_vci_tgt_brom.print_trace("[SIG]BROM");
981 //clusters[io_x][io_y]->signal_dspin_cmd_brom_t.print_trace("[SIG]BROM CMD");
982 //clusters[io_x][io_y]->signal_dspin_rsp_brom_t.print_trace("[SIG]BROM RSP");
983
984 //clusters[io_x][io_y]->bdev->print_trace();
985 //clusters[io_x][io_y]->signal_vci_tgt_bdev.print_trace("[SIG]BDEV_TGT");
986 //clusters[io_x][io_y]->signal_vci_ini_bdev.print_trace("[SIG]BDEV_INI");
987 }
988
989 sc_start(sc_core::sc_time(1, SC_NS));
990 }
991
992
993 // Free memory
994 for (size_t i = 0; i < (XMAX * YMAX); i++)
995 {
996 size_t x = i / YMAX;
997 size_t y = i % YMAX;
998 delete clusters[x][y];
999 }
1000
1001 dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_h_cmd_inc, XMAX - 1, YMAX, 3);
1002 dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_h_cmd_dec, XMAX - 1, YMAX, 3);
1003 dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_h_rsp_inc, XMAX - 1, YMAX, 2);
1004 dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_h_rsp_dec, XMAX - 1, YMAX, 2);
1005 dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_v_cmd_inc, XMAX, YMAX - 1, 3);
1006 dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_v_cmd_dec, XMAX, YMAX - 1, 3);
1007 dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_v_rsp_inc, XMAX, YMAX - 1, 2);
1008 dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_v_rsp_dec, XMAX, YMAX - 1, 2);
1009 dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_false_cmd_in, XMAX, YMAX, 4, 3);
1010 dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_false_cmd_out, XMAX, YMAX, 4, 3);
1011 dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_false_rsp_in, XMAX, YMAX, 4, 2);
1012 dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_false_rsp_out, XMAX, YMAX, 4, 2);
1013
1014 return EXIT_SUCCESS;
1015}
1016
1017
1018void handler(int dummy = 0) {
1019 stop_called = true;
1020 sc_stop();
1021}
1022
1023void voidhandler(int dummy = 0) {}
1024
1025int sc_main (int argc, char *argv[])
1026{
1027 signal(SIGINT, handler);
1028 signal(SIGPIPE, voidhandler);
1029
1030 try {
1031 return _main(argc, argv);
1032 } catch (std::exception &e) {
1033 std::cout << e.what() << std::endl;
1034 } catch (...) {
1035 std::cout << "Unknown exception occured" << std::endl;
1036 throw;
1037 }
1038 return 1;
1039}
1040
1041
1042// Local Variables:
1043// tab-width: 3
1044// c-basic-offset: 3
1045// c-file-offsets:((innamespace . 0)(inline-open . 0))
1046// indent-tabs-mode: nil
1047// End:
1048
1049// vim: filetype=cpp:expandtab:shiftwidth=3:tabstop=3:softtabstop=3
Note: See TracBrowser for help on using the repository browser.