source: trunk/platforms/tsar_generic_iob/top.cpp @ 817

Last change on this file since 817 was 817, checked in by alain, 10 years ago

Using both BPP (Big Physical Pages) and SPP (Small Physical Pages)
for Boot an kernel mapping on tsar_generic_iob platform.

File size: 69.5 KB
Line 
1///////////////////////////////////////////////////////////////////////////////
2// File: top.cpp  (for tsar_generic_iob platform)
3// Author: Alain Greiner
4// Copyright: UPMC/LIP6
5// Date : august 2013
6// This program is released under the GNU public license
7///////////////////////////////////////////////////////////////////////////////
8// This file define a generic TSAR architecture with an IO network emulating
9// an external bus (i.e. Hypertransport) to access 7 external peripherals:
10//
11// - BROM : boot ROM
12// - FBUF : Frame Buffer
13// - MTTY : multi TTY (one channel)
14// - MNIC : Network controller (up to 2 channels)
15// - CDMA : Chained Buffer DMA controller (up to 4 channels)
16// - BDEV : Dlock Device controler (one channel)
17// - IOPI : HWI to SWI translator.
18//
19// The internal physical address space is 40 bits, and the cluster index
20// is defined by the 8 MSB bits, using a fixed format: X is encoded on 4 bits,
21// Y is encodes on 4 bits, whatever the actual mesh size.
22// => at most 16 * 16 clusters. Each cluster contains up to 4 processors.
23//
24// It contains 3 networks:
25//
26// 1) the "INT" network supports Read/Write transactions
27//    between processors and L2 caches or peripherals.
28//    (VCI ADDDRESS = 40 bits / VCI DATA width = 32 bits)
29//    It supports also coherence transactions between L1 & L2 caches.
30// 3) the "RAM" network emulates the 3D network between L2 caches
31//    and L3 caches, and is implemented as a 2D mesh between the L2 caches,
32//    the two IO bridges and the physical RAMs disributed in all clusters.
33//    (VCI ADDRESS = 40 bits / VCI DATA = 64 bits)
34// 4) the IOX network connects the two IO bridge components to the
35//    7 external peripheral controllers.
36//    (VCI ADDDRESS = 40 bits / VCI DATA width = 64 bits)
37//
38// The external peripherals HWI IRQs are translated to WTI IRQs by the
39// external IOPIC component, that must be configured by the OS to route
40// these WTI ITQS to one or several internal XICU components.
41// - IOPIC HWI[1:0]     connected to IRQ_NIC_RX[1:0]
42// - IOPIC HWI[3:2]     connected to IRQ_NIC_TX[1:0]
43// - IOPIC HWI[7:4]     connected to IRQ_CMA_TX[3:0]]
44// - IOPIC HWI[8]       connected to IRQ_BDEV
45// - IOPIC HWI[9]       connected to IRQ_TTY_RX[0]
46//
47// Besides the external peripherals, each cluster contains one XICU component,
48// and one multi channels DMA component.
49// The XICU component is mainly used to handle WTI IRQs, as only 5 HWI IRQs
50// are connected to XICU in each cluster:
51// - IRQ_IN[0] : MMC
52// - IRQ_IN[1] : DMA channel 0
53// - IRQ_IN[2] : DMA channel 1
54// - IRQ_IN[3] : DMA channel 2
55// - IRQ_IN[4] : DMA channel 3
56//
57// All clusters are identical, but cluster(0,0) and cluster(XMAX-1,YMAX-1)
58// contain an extra IO bridge component. These IOB0 & IOB1 components are
59// connected to the three networks (INT, RAM, IOX).
60//
61// - It uses two dspin_local_crossbar per cluster to implement the
62//   local interconnect correponding to the INT network.
63// - It uses three dspin_local_crossbar per cluster to implement the
64//   local interconnect correponding to the coherence INT network.
65// - It uses two virtual_dspin_router per cluster to implement
66//   the INT network (routing both the direct and coherence trafic).
67// - It uses two dspin_router per cluster to implement the RAM network.
68// - It uses the vci_cc_vcache_wrapper.
69// - It uses the vci_mem_cache.
70// - It contains one vci_xicu and one vci_multi_dma per cluster.
71// - It contains one vci_simple ram per cluster to model the L3 cache.
72//
73// The TsarIobCluster component is defined in files
74// tsar_iob_cluster.* (with * = cpp, h, sd)
75//
76// The main hardware parameters must be defined in the hard_config.h file :
77// - X_SIZE           : number of clusters in a row
78// - Y_SIZE           : number of clusters in a column
79// - NB_PROCS_MAX     : number of processors per cluster (power of 2)
80// - NB_TTY_CHANNELS  : number of TTY channels in I/O network (must be 1)
81// - NB_NIC_CHANNELS  : number of NIC channels in I/O network (up to 2)
82// - NB_CMA_CHANNELS  : number of CMA channels in I/O network (up to 4)
83// - FBUF_X_SIZE      : width of frame buffer (pixels)
84// - FBUF_Y_SIZE      : heigth of frame buffer (lines)
85// - XCU_NB_INPUTS    : number of HWIs = number of WTIs = number of PTIs
86//
87// Some secondary hardware parameters must be defined in this top.cpp file:
88// - XRAM_LATENCY     : external ram latency
89// - MEMC_WAYS        : L2 cache number of ways
90// - MEMC_SETS        : L2 cache number of sets
91// - L1_IWAYS
92// - L1_ISETS
93// - L1_DWAYS
94// - L1_DSETS
95// - BDEV_IMAGE_NAME  : file pathname for block device
96// - NIC_RX_NAME      : file pathname for NIC received packets
97// - NIC_TX_NAME      : file pathname for NIC transmited packets
98// - NIC_TIMEOUT      : max number of cycles before closing a container
99//
100// General policy for 40 bits physical address decoding:
101// All physical segments base addresses are multiple of 1 Mbytes
102// (=> the 24 LSB bits = 0, and the 16 MSB bits define the target)
103// The (x_width + y_width) MSB bits (left aligned) define
104// the cluster index, and the LADR bits define the local index:
105//      |X_ID|Y_ID|  LADR  |     OFFSET          |
106//      |  4 |  4 |   8    |       24            |
107//
108// General policy for 14 bits SRCID decoding:
109// Each component is identified by (x_id, y_id, l_id) tuple.
110//      |X_ID|Y_ID| L_ID |
111//      |  4 |  4 |  6   |
112/////////////////////////////////////////////////////////////////////////
113
114#include <systemc>
115#include <sys/time.h>
116#include <iostream>
117#include <sstream>
118#include <cstdlib>
119#include <cstdarg>
120#include <stdint.h>
121
122#include "gdbserver.h"
123#include "mapping_table.h"
124
125#include "tsar_iob_cluster.h"
126#include "vci_chbuf_dma.h"
127#include "vci_multi_tty.h"
128#include "vci_multi_nic.h"
129#include "vci_simple_rom.h"
130#include "vci_block_device_tsar.h"
131#include "vci_framebuffer.h"
132#include "vci_iox_network.h"
133#include "vci_iox_network.h"
134#include "vci_iopic.h"
135
136#include "alloc_elems.h"
137
138///////////////////////////////////////////////////
139//      OS
140///////////////////////////////////////////////////
141#define USE_ALMOS 0
142
143#define almos_bootloader_pathname "bootloader.bin"
144#define almos_kernel_pathname     "kernel-soclib.bin@0xbfc10000:D"
145#define almos_archinfo_pathname   "arch-info.bin@0xBFC08000:D"
146
147///////////////////////////////////////////////////
148//               Parallelisation
149///////////////////////////////////////////////////
150
151#define USING_OPENMP           0
152
153#if USING_OPENMP
154#include <omp.h>
155#endif
156
157///////////////////////////////////////////////////////////
158//          DSPIN parameters
159///////////////////////////////////////////////////////////
160
161#define dspin_int_cmd_width   39
162#define dspin_int_rsp_width   32
163
164#define dspin_ram_cmd_width   64
165#define dspin_ram_rsp_width   64
166
167///////////////////////////////////////////////////////////
168//         VCI fields width  for the 3 VCI networks
169///////////////////////////////////////////////////////////
170
171#define vci_cell_width_int    4
172#define vci_cell_width_ext    8
173
174#define vci_plen_width        8
175#define vci_address_width     40
176#define vci_rerror_width      1
177#define vci_clen_width        1
178#define vci_rflag_width       1
179#define vci_srcid_width       14
180#define vci_pktid_width       4
181#define vci_trdid_width       4
182#define vci_wrplen_width      1
183
184////////////////////////////////////////////////////////////
185//    Main Hardware Parameters values
186//////////////////////i/////////////////////////////////////
187
188#include "hard_config.h"
189
190////////////////////////////////////////////////////////////
191//    Secondary Hardware Parameters values
192//////////////////////i/////////////////////////////////////
193
194#define XMAX                  X_SIZE
195#define YMAX                  Y_SIZE
196
197#define XRAM_LATENCY          0
198
199#define MEMC_WAYS             16
200#define MEMC_SETS             256
201
202#define L1_IWAYS              4
203#define L1_ISETS              64
204
205#define L1_DWAYS              4
206#define L1_DSETS              64
207
208#define BDEV_IMAGE_NAME       "../../../giet_vm/hdd/virt_hdd.dmg"
209
210#define NIC_RX_NAME           "/dev/null"
211#define NIC_TX_NAME           "/dev/null"
212#define NIC_TIMEOUT           10000
213
214#define NORTH                 0
215#define SOUTH                 1
216#define EAST                  2
217#define WEST                  3
218
219#define cluster(x,y)   ((y) + ((x) << 4))
220
221////////////////////////////////////////////////////////////
222//    Software to be loaded in ROM & RAM
223//////////////////////i/////////////////////////////////////
224
225#define BOOT_SOFT_NAME        "../../softs/tsar_boot/preloader.elf"
226
227////////////////////////////////////////////////////////////
228//     DEBUG Parameters default values
229//////////////////////i/////////////////////////////////////
230
231#define MAX_FROZEN_CYCLES     100000
232
233/////////////////////////////////////////////////////////
234//    Physical segments definition
235/////////////////////////////////////////////////////////
236
237// All physical segments base addresses and sizes are defined
238// in the hard_config.h file. For replicated segments, the
239// base address is incremented by a cluster offset:
240// offset  = cluster(x,y) << (address_width-x_width-y_width);
241
242////////////////////////////////////////////////////////////////////////
243//          SRCID definition
244////////////////////////////////////////////////////////////////////////
245// All initiators are in the same indexing space (14 bits).
246// The SRCID is structured in two fields:
247// - The 8 MSB bits define the cluster index (left aligned)
248// - The 6  LSB bits define the local index.
249// Two different initiators cannot have the same SRCID, but a given
250// initiator can have two alias SRCIDs:
251// - Internal initiators (procs, mdma) are replicated in all clusters,
252//   and each initiator has one single SRCID.
253// - External initiators (bdev, cdma) are not replicated, but can be
254//   accessed in 2 clusters : cluster_iob0 and cluster_iob1.
255//   They have the same local index, but two different cluster indexes.
256//
257// As cluster_iob0 and cluster_iob1 contain both internal initiators
258// and external initiators, they must have different local indexes.
259// Consequence: For a local interconnect, the INI_ID port index
260// is NOT equal to the SRCID local index, and the local interconnect
261// must make a translation: SRCID => INI_ID
262////////////////////////////////////////////////////////////////////////
263
264#define PROC_LOCAL_SRCID             0x0    // from 0 to 7
265#define MDMA_LOCAL_SRCID             0x8
266#define IOBX_LOCAL_SRCID             0x9
267#define MEMC_LOCAL_SRCID             0xA
268#define CDMA_LOCAL_SRCID             0xB
269#define BDEV_LOCAL_SRCID             0xC
270#define IOPI_LOCAL_SRCID             0xD
271
272///////////////////////////////////////////////////////////////////////
273//     TGT_ID and INI_ID port indexing for INT local interconnect
274///////////////////////////////////////////////////////////////////////
275
276#define INT_MEMC_TGT_ID              0
277#define INT_XICU_TGT_ID              1
278#define INT_MDMA_TGT_ID              2
279#define INT_IOBX_TGT_ID              3
280
281#define INT_PROC_INI_ID              0   // from 0 to (NB_PROCS_MAX-1)
282#define INT_MDMA_INI_ID              (NB_PROCS_MAX)
283#define INT_IOBX_INI_ID              (NB_PROCS_MAX+1)
284
285///////////////////////////////////////////////////////////////////////
286//     TGT_ID and INI_ID port indexing for RAM local interconnect
287///////////////////////////////////////////////////////////////////////
288
289#define RAM_XRAM_TGT_ID              0
290
291#define RAM_MEMC_INI_ID              0
292#define RAM_IOBX_INI_ID              1
293
294///////////////////////////////////////////////////////////////////////
295//     TGT_ID and INI_ID port indexing for I0X local interconnect
296///////////////////////////////////////////////////////////////////////
297
298#define IOX_FBUF_TGT_ID              0
299#define IOX_BDEV_TGT_ID              1
300#define IOX_MNIC_TGT_ID              2
301#define IOX_CDMA_TGT_ID              3
302#define IOX_BROM_TGT_ID              4
303#define IOX_MTTY_TGT_ID              5
304#define IOX_IOPI_TGT_ID              6
305#define IOX_IOB0_TGT_ID              7
306#define IOX_IOB1_TGT_ID              8
307
308#define IOX_BDEV_INI_ID              0
309#define IOX_CDMA_INI_ID              1
310#define IOX_IOPI_INI_ID              2
311#define IOX_IOB0_INI_ID              3
312#define IOX_IOB1_INI_ID              4
313
314////////////////////////////////////////////////////////////////////////
315int _main(int argc, char *argv[])
316////////////////////////////////////////////////////////////////////////
317{
318   using namespace sc_core;
319   using namespace soclib::caba;
320   using namespace soclib::common;
321
322
323   char     soft_name[256]   = BOOT_SOFT_NAME;             // pathname: binary code
324   size_t   ncycles          = 4000000000;                 // simulated cycles
325   char     disk_name[256]   = BDEV_IMAGE_NAME;            // pathname: disk image
326   char     nic_rx_name[256] = NIC_RX_NAME;                // pathname: rx packets file
327   char     nic_tx_name[256] = NIC_TX_NAME;                // pathname: tx packets file
328   ssize_t  threads_nr       = 1;                          // simulator's threads number
329   bool     debug_ok         = false;                      // trace activated
330   size_t   debug_memc_id    = 0xFFFFFFFF;                 // index of traced memc
331   size_t   debug_proc_id    = 0xFFFFFFFF;                 // index of traced proc
332   size_t   debug_xram_id    = 0xFFFFFFFF;                 // index of traced xram
333   bool     debug_iob        = false;                      // trace iob0 & iob1 when true
334   uint32_t debug_from       = 0;                          // trace start cycle
335   uint32_t frozen_cycles    = MAX_FROZEN_CYCLES;          // monitoring frozen processor
336   size_t   cluster_iob0     = cluster(0,0);               // cluster containing IOB0
337   size_t   cluster_iob1     = cluster(XMAX-1,YMAX-1);     // cluster containing IOB1
338   size_t   x_width          = X_WIDTH;                    // # of bits for x
339   size_t   y_width          = Y_WIDTH;                    // # of bits for y
340   size_t   p_width          = P_WIDTH;                    // # of bits for lpid
341
342#if USING_OPENMP
343   size_t   simul_period     = 1000000;
344#else
345   size_t   simul_period     = 1;
346#endif
347
348   assert( (X_WIDTH == 4) and (Y_WIDTH == 4) and
349   "ERROR: we must have X_WIDTH == Y_WIDTH == 4");
350
351   assert( P_WIDTH <= 3 and
352   "ERROR: we must have P_WIDTH <= 3");
353
354   ////////////// command line arguments //////////////////////
355   if (argc > 1)
356   {
357      for (int n = 1; n < argc; n = n + 2)
358      {
359         if ((strcmp(argv[n],"-NCYCLES") == 0) && (n+1<argc))
360         {
361            ncycles = atoi(argv[n+1]);
362         }
363         else if ((strcmp(argv[n],"-SOFT") == 0) && (n+1<argc) )
364         {
365            strcpy(soft_name, argv[n+1]);
366         }
367         else if ((strcmp(argv[n],"-DEBUG") == 0) && (n+1<argc) )
368         {
369            debug_ok = true;
370            debug_from = atoi(argv[n+1]);
371         }
372         else if ((strcmp(argv[n],"-DISK") == 0) && (n+1<argc) )
373         {
374            strcpy(disk_name, argv[n+1]);
375         }
376         else if ((strcmp(argv[n],"-MEMCID") == 0) && (n+1<argc) )
377         {
378            debug_memc_id = atoi(argv[n+1]);
379            size_t x = debug_memc_id >> 4;
380            size_t y = debug_memc_id & 0xF;
381            if( (x>=XMAX) || (y>=YMAX) )
382            {
383                std::cout << "MEMCID parameter does'nt fit XMAX/YMAX" << std::endl;
384                exit(0);
385            }
386         }
387         else if ((strcmp(argv[n],"-XRAMID") == 0) && (n+1<argc) )
388         {
389            debug_xram_id = atoi(argv[n+1]);
390            size_t x = debug_xram_id >> 4;
391            size_t y = debug_xram_id & 0xF;
392            if( (x>=XMAX) || (y>=YMAX) )
393            {
394                std::cout << "XRAMID parameter does'nt fit XMAX/YMAX" << std::endl;
395                exit(0);
396            }
397         }
398         else if ((strcmp(argv[n],"-IOB") == 0) && (n+1<argc) )
399         {
400            debug_iob = atoi(argv[n+1]);
401         }
402         else if ((strcmp(argv[n],"-PROCID") == 0) && (n+1<argc) )
403         {
404            debug_proc_id     = atoi(argv[n+1]);
405            size_t cluster_xy = debug_proc_id >> P_WIDTH ;
406            size_t x          = cluster_xy >> 4;
407            size_t y          = cluster_xy & 0xF;
408            if( (x>=XMAX) || (y>=YMAX) )
409            {
410                std::cout << "PROCID parameter does'nt fit XMAX/YMAX" << std::endl;
411                exit(0);
412            }
413         }
414         else if ((strcmp(argv[n], "-THREADS") == 0) && ((n+1) < argc))
415         {
416            threads_nr = atoi(argv[n+1]);
417            threads_nr = (threads_nr < 1) ? 1 : threads_nr;
418         }
419         else if ((strcmp(argv[n], "-FROZEN") == 0) && (n+1 < argc))
420         {
421            frozen_cycles = atoi(argv[n+1]);
422         }
423         else
424         {
425            std::cout << "   Arguments are (key,value) couples." << std::endl;
426            std::cout << "   The order is not important." << std::endl;
427            std::cout << "   Accepted arguments are :" << std::endl << std::endl;
428            std::cout << "     -SOFT pathname_for_embedded_soft" << std::endl;
429            std::cout << "     -DISK pathname_for_disk_image" << std::endl;
430            std::cout << "     -NCYCLES number_of_simulated_cycles" << std::endl;
431            std::cout << "     -DEBUG debug_start_cycle" << std::endl;
432            std::cout << "     -THREADS simulator's threads number" << std::endl;
433            std::cout << "     -FROZEN max_number_of_lines" << std::endl;
434            std::cout << "     -MEMCID index_memc_to_be_traced" << std::endl;
435            std::cout << "     -XRAMID index_xram_to_be_traced" << std::endl;
436            std::cout << "     -PROCID index_proc_to_be_traced" << std::endl;
437            std::cout << "     -IOB    non_zero_value" << std::endl;
438            exit(0);
439         }
440      }
441   }
442
443   // checking hardware parameters
444   assert( (XMAX <= 16) and
445           "The XMAX parameter cannot be larger than 16" );
446
447   assert( (YMAX <= 16) and
448           "The YMAX parameter cannot be larger than 16" );
449
450   assert( (NB_PROCS_MAX <= (1 << P_WIDTH)) and
451           "NB_PROCS_MAX parameter cannot be larger than 2^P_WIDTH" );
452
453   assert( (NB_DMA_CHANNELS <= 4) and
454           "The NB_DMA_CHANNELS parameter cannot be larger than 4" );
455
456   assert( (NB_TTY_CHANNELS == 1) and
457           "The NB_TTY_CHANNELS parameter must be 1" );
458
459   assert( (NB_NIC_CHANNELS == 2) and
460           "The NB_NIC_CHANNELS parameter must be 2" );
461
462   std::cout << std::endl << std::dec
463             << " - XMAX            = " << XMAX << std::endl
464             << " - YMAX            = " << YMAX << std::endl
465             << " - NB_PROCS_MAX    = " << NB_PROCS_MAX << std::endl
466             << " - NB_TTY_CHANNELS = " << NB_TTY_CHANNELS <<  std::endl
467             << " - NB_DMA_CHANNELS = " << NB_DMA_CHANNELS <<  std::endl
468             << " - NB_NIC_CHANNELS = " << NB_NIC_CHANNELS <<  std::endl
469             << " - MEMC_WAYS       = " << MEMC_WAYS << std::endl
470             << " - MEMC_SETS       = " << MEMC_SETS << std::endl
471             << " - RAM_LATENCY     = " << XRAM_LATENCY << std::endl
472             << " - MAX_FROZEN      = " << frozen_cycles << std::endl
473             << " - DEBUG_PROCID    = " << debug_proc_id << std::endl
474             << " - DEBUG_MEMCID    = " << debug_memc_id << std::endl
475             << " - DEBUG_XRAMID    = " << debug_xram_id << std::endl;
476
477   std::cout << std::endl;
478
479#if USING_OPENMP
480   omp_set_dynamic(false);
481   omp_set_num_threads(threads_nr);
482   std::cerr << "Built with openmp version " << _OPENMP << std::endl;
483#endif
484
485   // Define VciParams objects
486   typedef soclib::caba::VciParams<vci_cell_width_int,
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_int;
496
497   typedef soclib::caba::VciParams<vci_cell_width_ext,
498                                   vci_plen_width,
499                                   vci_address_width,
500                                   vci_rerror_width,
501                                   vci_clen_width,
502                                   vci_rflag_width,
503                                   vci_srcid_width,
504                                   vci_pktid_width,
505                                   vci_trdid_width,
506                                   vci_wrplen_width> vci_param_ext;
507
508   /////////////////////////////////////////////////////////////////////
509   // INT network mapping table
510   // - two levels address decoding for commands
511   // - two levels srcid decoding for responses
512   // - NB_PROCS_MAX + 2 (MDMA, IOBX) local initiators per cluster
513   // - 4 local targets (MEMC, XICU, MDMA, IOBX) per cluster
514   /////////////////////////////////////////////////////////////////////
515   MappingTable maptab_int( vci_address_width,
516                            IntTab(x_width + y_width, 16 - x_width - y_width),
517                            IntTab(x_width + y_width, vci_srcid_width - x_width - y_width),
518                            0x00FF000000);
519
520   for (size_t x = 0; x < XMAX; x++)
521   {
522      for (size_t y = 0; y < YMAX; y++)
523      {
524         uint64_t offset = ((uint64_t)cluster(x,y))
525                              << (vci_address_width-x_width-y_width);
526         bool config    = true;
527         bool cacheable = true;
528
529         // the four following segments are defined in all clusters
530
531         std::ostringstream    smemc_conf;
532         smemc_conf << "int_seg_memc_conf_" << x << "_" << y;
533         maptab_int.add(Segment(smemc_conf.str(), SEG_MMC_BASE+offset, SEG_MMC_SIZE,
534                     IntTab(cluster(x,y), INT_MEMC_TGT_ID), not cacheable, config ));
535
536         std::ostringstream    smemc_xram;
537         smemc_xram << "int_seg_memc_xram_" << x << "_" << y;
538         maptab_int.add(Segment(smemc_xram.str(), SEG_RAM_BASE+offset, SEG_RAM_SIZE,
539                     IntTab(cluster(x,y), INT_MEMC_TGT_ID), cacheable));
540
541         std::ostringstream    sxicu;
542         sxicu << "int_seg_xicu_" << x << "_" << y;
543         maptab_int.add(Segment(sxicu.str(), SEG_XCU_BASE+offset, SEG_XCU_SIZE,
544                     IntTab(cluster(x,y), INT_XICU_TGT_ID), not cacheable));
545
546         std::ostringstream    smdma;
547         smdma << "int_seg_mdma_" << x << "_" << y;
548         maptab_int.add(Segment(smdma.str(), SEG_DMA_BASE+offset, SEG_DMA_SIZE,
549                     IntTab(cluster(x,y), INT_MDMA_TGT_ID), not cacheable));
550
551         // the following segments are only defined in cluster_iob0 or in cluster_iob1
552
553         if ( (cluster(x,y) == cluster_iob0) or (cluster(x,y) == cluster_iob1) )
554         {
555            std::ostringstream    siobx;
556            siobx << "int_seg_iobx_" << x << "_" << y;
557            maptab_int.add(Segment(siobx.str(), SEG_IOB_BASE+offset, SEG_IOB_SIZE,
558                        IntTab(cluster(x,y), INT_IOBX_TGT_ID), not cacheable, config ));
559
560            std::ostringstream    stty;
561            stty << "int_seg_mtty_" << x << "_" << y;
562            maptab_int.add(Segment(stty.str(), SEG_TTY_BASE+offset, SEG_TTY_SIZE,
563                        IntTab(cluster(x,y), INT_IOBX_TGT_ID), not cacheable));
564
565            std::ostringstream    sfbf;
566            sfbf << "int_seg_fbuf_" << x << "_" << y;
567            maptab_int.add(Segment(sfbf.str(), SEG_FBF_BASE+offset, SEG_FBF_SIZE,
568                        IntTab(cluster(x,y), INT_IOBX_TGT_ID), not cacheable));
569
570            std::ostringstream    sbdv;
571            sbdv << "int_seg_bdev_" << x << "_" << y;
572            maptab_int.add(Segment(sbdv.str(), SEG_IOC_BASE+offset, SEG_IOC_SIZE,
573                        IntTab(cluster(x,y), INT_IOBX_TGT_ID), not cacheable));
574
575            std::ostringstream    snic;
576            snic << "int_seg_mnic_" << x << "_" << y;
577            maptab_int.add(Segment(snic.str(), SEG_NIC_BASE+offset, SEG_NIC_SIZE,
578                        IntTab(cluster(x,y), INT_IOBX_TGT_ID), not cacheable));
579
580            std::ostringstream    srom;
581            srom << "int_seg_brom_" << x << "_" << y;
582            maptab_int.add(Segment(srom.str(), SEG_ROM_BASE+offset, SEG_ROM_SIZE,
583                        IntTab(cluster(x,y), INT_IOBX_TGT_ID), cacheable ));
584
585            std::ostringstream    sdma;
586            sdma << "int_seg_cdma_" << x << "_" << y;
587            maptab_int.add(Segment(sdma.str(), SEG_CMA_BASE+offset, SEG_CMA_SIZE,
588                        IntTab(cluster(x,y), INT_IOBX_TGT_ID), not cacheable));
589
590            std::ostringstream    spic;
591            spic << "int_seg_iopi_" << x << "_" << y;
592            maptab_int.add(Segment(spic.str(), SEG_PIC_BASE+offset, SEG_PIC_SIZE,
593                        IntTab(cluster(x,y), INT_IOBX_TGT_ID), not cacheable));
594         }
595
596         // This define the mapping between the SRCIDs
597         // and the port index on the local interconnect.
598
599         maptab_int.srcid_map( IntTab( cluster(x,y), MDMA_LOCAL_SRCID ),
600                               IntTab( cluster(x,y), INT_MDMA_INI_ID ) );
601
602         maptab_int.srcid_map( IntTab( cluster(x,y), IOBX_LOCAL_SRCID ),
603                               IntTab( cluster(x,y), INT_IOBX_INI_ID ) );
604
605         maptab_int.srcid_map( IntTab( cluster(x,y), IOPI_LOCAL_SRCID ),
606                               IntTab( cluster(x,y), INT_IOBX_INI_ID ) );
607
608         for ( size_t p = 0 ; p < NB_PROCS_MAX; p++ )
609         maptab_int.srcid_map( IntTab( cluster(x,y), PROC_LOCAL_SRCID+p ),
610                               IntTab( cluster(x,y), INT_PROC_INI_ID+p ) );
611      }
612   }
613   std::cout << "INT network " << maptab_int << std::endl;
614
615    /////////////////////////////////////////////////////////////////////////
616    // RAM network mapping table
617    // - two levels address decoding for commands
618    // - two levels srcid decoding for responses
619    // - 2 local initiators (MEMC, IOBX) per cluster
620    //   (IOBX component only in cluster_iob0 and cluster_iob1)
621    // - 1 local target (XRAM) per cluster
622    ////////////////////////////////////////////////////////////////////////
623    MappingTable maptab_ram( vci_address_width,
624                             IntTab(x_width+y_width, 0),
625                             IntTab(x_width+y_width, vci_srcid_width - x_width - y_width),
626                             0x00FF000000);
627
628    for (size_t x = 0; x < XMAX; x++)
629    {
630        for (size_t y = 0; y < YMAX ; y++)
631        {
632            uint64_t offset = ((uint64_t)cluster(x,y))
633                                << (vci_address_width-x_width-y_width);
634
635            std::ostringstream sxram;
636            sxram << "ext_seg_xram_" << x << "_" << y;
637            maptab_ram.add(Segment(sxram.str(), SEG_RAM_BASE+offset,
638                           SEG_RAM_SIZE, IntTab(cluster(x,y), RAM_XRAM_TGT_ID), false));
639        }
640    }
641
642    // This define the mapping between the initiators SRCID
643    // and the port index on the RAM local interconnect.
644    // External initiator have two alias SRCID (iob0 / iob1)
645
646    maptab_ram.srcid_map( IntTab( cluster_iob0, CDMA_LOCAL_SRCID ),
647                          IntTab( cluster_iob0, RAM_IOBX_INI_ID ) );
648
649    maptab_ram.srcid_map( IntTab( cluster_iob1, CDMA_LOCAL_SRCID ),
650                          IntTab( cluster_iob1, RAM_IOBX_INI_ID ) );
651
652    maptab_ram.srcid_map( IntTab( cluster_iob0, BDEV_LOCAL_SRCID ),
653                          IntTab( cluster_iob0, RAM_IOBX_INI_ID ) );
654
655    maptab_ram.srcid_map( IntTab( cluster_iob1, BDEV_LOCAL_SRCID ),
656                          IntTab( cluster_iob1, RAM_IOBX_INI_ID ) );
657
658    maptab_ram.srcid_map( IntTab( cluster_iob0, IOPI_LOCAL_SRCID ),
659                          IntTab( cluster_iob0, RAM_IOBX_INI_ID ) );
660
661    maptab_ram.srcid_map( IntTab( cluster_iob1, IOPI_LOCAL_SRCID ),
662                          IntTab( cluster_iob1, RAM_IOBX_INI_ID ) );
663
664    maptab_ram.srcid_map( IntTab( cluster_iob0, MEMC_LOCAL_SRCID ),
665                          IntTab( cluster_iob0, RAM_MEMC_INI_ID ) );
666
667    maptab_ram.srcid_map( IntTab( cluster_iob1, MEMC_LOCAL_SRCID ),
668                          IntTab( cluster_iob1, RAM_MEMC_INI_ID ) );
669
670    std::cout << "RAM network " << maptab_ram << std::endl;
671
672    ///////////////////////////////////////////////////////////////////////
673    // IOX network mapping table
674    // - two levels address decoding for commands (9, 7) bits
675    // - two levels srcid decoding for responses
676    // - 5 initiators (IOB0, IOB1, BDEV, CDMA, IOPI)
677    // - 9 targets (IOB0, IOB1, BDEV, CDMA, MTTY, FBUF, BROM, MNIC, IOPI)
678    //
679    // Address bit 32 is used to determine if a command must be routed to
680    // IOB0 or IOB1.
681    ///////////////////////////////////////////////////////////////////////
682    MappingTable maptab_iox(
683          vci_address_width,
684          IntTab(x_width + y_width - 1, 16 - x_width - y_width + 1),
685          IntTab(x_width + y_width    , vci_param_ext::S - x_width - y_width),
686          0x00FF000000);
687
688    // External peripherals segments
689    // When there is more than one cluster, external peripherals can be accessed
690    // through two segments, depending on the used IOB (IOB0 or IOB1).
691
692    const uint64_t iob0_base = ((uint64_t)cluster_iob0)
693       << (vci_address_width - x_width - y_width);
694
695    maptab_iox.add(Segment("iox_seg_mtty_0", SEG_TTY_BASE + iob0_base, SEG_TTY_SIZE,
696                   IntTab(0, IOX_MTTY_TGT_ID), false));
697    maptab_iox.add(Segment("iox_seg_fbuf_0", SEG_FBF_BASE + iob0_base, SEG_FBF_SIZE,
698                   IntTab(0, IOX_FBUF_TGT_ID), false));
699    maptab_iox.add(Segment("iox_seg_bdev_0", SEG_IOC_BASE + iob0_base, SEG_IOC_SIZE,
700                   IntTab(0, IOX_BDEV_TGT_ID), false));
701    maptab_iox.add(Segment("iox_seg_mnic_0", SEG_NIC_BASE + iob0_base, SEG_NIC_SIZE,
702                   IntTab(0, IOX_MNIC_TGT_ID), false));
703    maptab_iox.add(Segment("iox_seg_cdma_0", SEG_CMA_BASE + iob0_base, SEG_CMA_SIZE,
704                   IntTab(0, IOX_CDMA_TGT_ID), false));
705    maptab_iox.add(Segment("iox_seg_brom_0", SEG_ROM_BASE + iob0_base, SEG_ROM_SIZE,
706                   IntTab(0, IOX_BROM_TGT_ID), false));
707    maptab_iox.add(Segment("iox_seg_iopi_0", SEG_PIC_BASE + iob0_base, SEG_PIC_SIZE,
708                   IntTab(0, IOX_IOPI_TGT_ID), false));
709
710    if ( cluster_iob0 != cluster_iob1 )
711    {
712       const uint64_t iob1_base = ((uint64_t)cluster_iob1)
713          << (vci_address_width - x_width - y_width);
714
715        maptab_iox.add(Segment("iox_seg_mtty_1", SEG_TTY_BASE + iob1_base, SEG_TTY_SIZE,
716                   IntTab(0, IOX_MTTY_TGT_ID), false));
717        maptab_iox.add(Segment("iox_seg_fbuf_1", SEG_FBF_BASE + iob1_base, SEG_FBF_SIZE,
718                   IntTab(0, IOX_FBUF_TGT_ID), false));
719        maptab_iox.add(Segment("iox_seg_bdev_1", SEG_IOC_BASE + iob1_base, SEG_IOC_SIZE,
720                   IntTab(0, IOX_BDEV_TGT_ID), false));
721        maptab_iox.add(Segment("iox_seg_mnic_1", SEG_NIC_BASE + iob1_base, SEG_NIC_SIZE,
722                   IntTab(0, IOX_MNIC_TGT_ID), false));
723        maptab_iox.add(Segment("iox_seg_cdma_1", SEG_CMA_BASE + iob1_base, SEG_CMA_SIZE,
724                   IntTab(0, IOX_CDMA_TGT_ID), false));
725        maptab_iox.add(Segment("iox_seg_brom_1", SEG_ROM_BASE + iob1_base, SEG_ROM_SIZE,
726                   IntTab(0, IOX_BROM_TGT_ID), false));
727        maptab_iox.add(Segment("iox_seg_iopi_1", SEG_PIC_BASE + iob1_base, SEG_PIC_SIZE,
728                   IntTab(0, IOX_IOPI_TGT_ID), false));
729    }
730
731    // If there is more than one cluster, external peripherals
732    // can access RAM through two segments (IOB0 / IOB1).
733    // As IOMMU is not activated, addresses are 40 bits (physical addresses),
734    // and the choice depends on address bit A[32].
735    for (size_t x = 0; x < XMAX; x++)
736    {
737        for (size_t y = 0; y < YMAX ; y++)
738        {
739            const bool wti       = true;
740            const bool cacheable = true;
741
742            const uint64_t offset = ((uint64_t)cluster(x,y))
743                << (vci_address_width-x_width-y_width);
744
745            const uint64_t xicu_base = SEG_XCU_BASE + offset;
746
747            if ( (y & 0x1) == 0 ) // use IOB0
748            {
749                std::ostringstream sxcu0;
750                sxcu0 << "iox_seg_xcu0_" << x << "_" << y;
751                maptab_iox.add(Segment(sxcu0.str(), xicu_base, SEG_XCU_SIZE,
752                            IntTab(0, IOX_IOB0_TGT_ID), not cacheable, wti));
753
754                std::ostringstream siob0;
755                siob0 << "iox_seg_ram0_" << x << "_" << y;
756                maptab_iox.add(Segment(siob0.str(), offset, SEG_XCU_BASE,
757                            IntTab(0, IOX_IOB0_TGT_ID), not cacheable, not wti));
758            }
759            else                  // USE IOB1
760            {
761                std::ostringstream sxcu1;
762                sxcu1 << "iox_seg_xcu1_" << x << "_" << y;
763                maptab_iox.add(Segment(sxcu1.str(), xicu_base, SEG_XCU_SIZE,
764                            IntTab(0, IOX_IOB1_TGT_ID), not cacheable, wti));
765
766                std::ostringstream siob1;
767                siob1 << "iox_seg_ram1_" << x << "_" << y;
768                maptab_iox.add(Segment(siob1.str(), offset, SEG_XCU_BASE,
769                            IntTab(0, IOX_IOB1_TGT_ID), not cacheable, not wti));
770            }
771        }
772    }
773
774    // This define the mapping between the external initiators (SRCID)
775    // and the port index on the IOX local interconnect.
776
777    maptab_iox.srcid_map( IntTab( 0, CDMA_LOCAL_SRCID ) ,
778                          IntTab( 0, IOX_CDMA_INI_ID  ) );
779    maptab_iox.srcid_map( IntTab( 0, BDEV_LOCAL_SRCID ) ,
780                          IntTab( 0, IOX_BDEV_INI_ID  ) );
781    maptab_iox.srcid_map( IntTab( 0, IOPI_LOCAL_SRCID ) ,
782                          IntTab( 0, IOX_IOPI_INI_ID  ) );
783    maptab_iox.srcid_map( IntTab( 0, IOX_IOB0_INI_ID  ) ,
784                          IntTab( 0, IOX_IOB0_INI_ID  ) );
785
786    if ( cluster_iob0 != cluster_iob1 )
787    {
788        maptab_iox.srcid_map( IntTab( 0, IOX_IOB1_INI_ID ) ,
789                              IntTab( 0, IOX_IOB1_INI_ID ) );
790    }
791
792    std::cout << "IOX network " << maptab_iox << std::endl;
793
794    ////////////////////
795    // Signals
796    ///////////////////
797
798    sc_clock                          signal_clk("clk");
799    sc_signal<bool>                   signal_resetn("resetn");
800
801    sc_signal<bool>                   signal_irq_false;
802    sc_signal<bool>                   signal_irq_bdev;
803    sc_signal<bool>                   signal_irq_mtty_rx;
804    sc_signal<bool>                   signal_irq_mnic_rx[NB_NIC_CHANNELS];
805    sc_signal<bool>                   signal_irq_mnic_tx[NB_NIC_CHANNELS];
806    sc_signal<bool>                   signal_irq_cdma[NB_CMA_CHANNELS];
807
808    // VCI signals for IOX network
809    VciSignals<vci_param_ext>         signal_vci_ini_iob0("signal_vci_ini_iob0");
810    VciSignals<vci_param_ext>         signal_vci_ini_iob1("signal_vci_ini_iob1");
811    VciSignals<vci_param_ext>         signal_vci_ini_bdev("signal_vci_ini_bdev");
812    VciSignals<vci_param_ext>         signal_vci_ini_cdma("signal_vci_ini_cdma");
813    VciSignals<vci_param_ext>         signal_vci_ini_iopi("signal_vci_ini_iopi");
814
815    VciSignals<vci_param_ext>         signal_vci_tgt_iob0("signal_vci_tgt_iob0");
816    VciSignals<vci_param_ext>         signal_vci_tgt_iob1("signal_vci_tgt_iob1");
817    VciSignals<vci_param_ext>         signal_vci_tgt_mtty("signal_vci_tgt_mtty");
818    VciSignals<vci_param_ext>         signal_vci_tgt_fbuf("signal_vci_tgt_fbuf");
819    VciSignals<vci_param_ext>         signal_vci_tgt_mnic("signal_vci_tgt_mnic");
820    VciSignals<vci_param_ext>         signal_vci_tgt_brom("signal_vci_tgt_brom");
821    VciSignals<vci_param_ext>         signal_vci_tgt_bdev("signal_vci_tgt_bdev");
822    VciSignals<vci_param_ext>         signal_vci_tgt_cdma("signal_vci_tgt_cdma");
823    VciSignals<vci_param_ext>         signal_vci_tgt_iopi("signal_vci_ini_iopi");
824
825   // Horizontal inter-clusters INT network DSPIN
826   DspinSignals<dspin_int_cmd_width>*** signal_dspin_int_cmd_h_inc =
827      alloc_elems<DspinSignals<dspin_int_cmd_width> >("signal_dspin_int_cmd_h_inc", XMAX-1, YMAX, 3);
828   DspinSignals<dspin_int_cmd_width>*** signal_dspin_int_cmd_h_dec =
829      alloc_elems<DspinSignals<dspin_int_cmd_width> >("signal_dspin_int_cmd_h_dec", XMAX-1, YMAX, 3);
830   DspinSignals<dspin_int_rsp_width>*** signal_dspin_int_rsp_h_inc =
831      alloc_elems<DspinSignals<dspin_int_rsp_width> >("signal_dspin_int_rsp_h_inc", XMAX-1, YMAX, 2);
832   DspinSignals<dspin_int_rsp_width>*** signal_dspin_int_rsp_h_dec =
833      alloc_elems<DspinSignals<dspin_int_rsp_width> >("signal_dspin_int_rsp_h_dec", XMAX-1, YMAX, 2);
834
835   // Vertical inter-clusters INT network DSPIN
836   DspinSignals<dspin_int_cmd_width>*** signal_dspin_int_cmd_v_inc =
837      alloc_elems<DspinSignals<dspin_int_cmd_width> >("signal_dspin_int_cmd_v_inc", XMAX, YMAX-1, 3);
838   DspinSignals<dspin_int_cmd_width>*** signal_dspin_int_cmd_v_dec =
839      alloc_elems<DspinSignals<dspin_int_cmd_width> >("signal_dspin_int_cmd_v_dec", XMAX, YMAX-1, 3);
840   DspinSignals<dspin_int_rsp_width>*** signal_dspin_int_rsp_v_inc =
841      alloc_elems<DspinSignals<dspin_int_rsp_width> >("signal_dspin_int_rsp_v_inc", XMAX, YMAX-1, 2);
842   DspinSignals<dspin_int_rsp_width>*** signal_dspin_int_rsp_v_dec =
843      alloc_elems<DspinSignals<dspin_int_rsp_width> >("signal_dspin_int_rsp_v_dec", XMAX, YMAX-1, 2);
844
845   // Mesh boundaries INT network DSPIN
846   DspinSignals<dspin_int_cmd_width>**** signal_dspin_false_int_cmd_in =
847      alloc_elems<DspinSignals<dspin_int_cmd_width> >("signal_dspin_false_int_cmd_in", XMAX, YMAX, 4, 3);
848   DspinSignals<dspin_int_cmd_width>**** signal_dspin_false_int_cmd_out =
849      alloc_elems<DspinSignals<dspin_int_cmd_width> >("signal_dspin_false_int_cmd_out", XMAX, YMAX, 4, 3);
850   DspinSignals<dspin_int_rsp_width>**** signal_dspin_false_int_rsp_in =
851      alloc_elems<DspinSignals<dspin_int_rsp_width> >("signal_dspin_false_int_rsp_in", XMAX, YMAX, 4, 2);
852   DspinSignals<dspin_int_rsp_width>**** signal_dspin_false_int_rsp_out =
853      alloc_elems<DspinSignals<dspin_int_rsp_width> >("signal_dspin_false_int_rsp_out", XMAX, YMAX, 4, 2);
854
855
856   // Horizontal inter-clusters RAM network DSPIN
857   DspinSignals<dspin_ram_cmd_width>** signal_dspin_ram_cmd_h_inc =
858      alloc_elems<DspinSignals<dspin_ram_cmd_width> >("signal_dspin_ram_cmd_h_inc", XMAX-1, YMAX);
859   DspinSignals<dspin_ram_cmd_width>** signal_dspin_ram_cmd_h_dec =
860      alloc_elems<DspinSignals<dspin_ram_cmd_width> >("signal_dspin_ram_cmd_h_dec", XMAX-1, YMAX);
861   DspinSignals<dspin_ram_rsp_width>** signal_dspin_ram_rsp_h_inc =
862      alloc_elems<DspinSignals<dspin_ram_rsp_width> >("signal_dspin_ram_rsp_h_inc", XMAX-1, YMAX);
863   DspinSignals<dspin_ram_rsp_width>** signal_dspin_ram_rsp_h_dec =
864      alloc_elems<DspinSignals<dspin_ram_rsp_width> >("signal_dspin_ram_rsp_h_dec", XMAX-1, YMAX);
865
866   // Vertical inter-clusters RAM network DSPIN
867   DspinSignals<dspin_ram_cmd_width>** signal_dspin_ram_cmd_v_inc =
868      alloc_elems<DspinSignals<dspin_ram_cmd_width> >("signal_dspin_ram_cmd_v_inc", XMAX, YMAX-1);
869   DspinSignals<dspin_ram_cmd_width>** signal_dspin_ram_cmd_v_dec =
870      alloc_elems<DspinSignals<dspin_ram_cmd_width> >("signal_dspin_ram_cmd_v_dec", XMAX, YMAX-1);
871   DspinSignals<dspin_ram_rsp_width>** signal_dspin_ram_rsp_v_inc =
872      alloc_elems<DspinSignals<dspin_ram_rsp_width> >("signal_dspin_ram_rsp_v_inc", XMAX, YMAX-1);
873   DspinSignals<dspin_ram_rsp_width>** signal_dspin_ram_rsp_v_dec =
874      alloc_elems<DspinSignals<dspin_ram_rsp_width> >("signal_dspin_ram_rsp_v_dec", XMAX, YMAX-1);
875
876   // Mesh boundaries RAM network DSPIN
877   DspinSignals<dspin_ram_cmd_width>*** signal_dspin_false_ram_cmd_in =
878      alloc_elems<DspinSignals<dspin_ram_cmd_width> >("signal_dspin_false_ram_cmd_in", XMAX, YMAX, 4);
879   DspinSignals<dspin_ram_cmd_width>*** signal_dspin_false_ram_cmd_out =
880      alloc_elems<DspinSignals<dspin_ram_cmd_width> >("signal_dspin_false_ram_cmd_out", XMAX, YMAX, 4);
881   DspinSignals<dspin_ram_rsp_width>*** signal_dspin_false_ram_rsp_in =
882      alloc_elems<DspinSignals<dspin_ram_rsp_width> >("signal_dspin_false_ram_rsp_in", XMAX, YMAX, 4);
883   DspinSignals<dspin_ram_rsp_width>*** signal_dspin_false_ram_rsp_out =
884      alloc_elems<DspinSignals<dspin_ram_rsp_width> >("signal_dspin_false_ram_rsp_out", XMAX, YMAX, 4);
885
886   ////////////////////////////
887   //      Loader
888   ////////////////////////////
889
890#if USE_ALMOS
891   soclib::common::Loader loader(almos_bootloader_pathname,
892                                 almos_archinfo_pathname,
893                                 almos_kernel_pathname);
894#else
895   soclib::common::Loader loader(soft_name);
896#endif
897
898   typedef soclib::common::GdbServer<soclib::common::Mips32ElIss> proc_iss;
899   proc_iss::set_loader(loader);
900
901   ////////////////////////////////////////
902   //  Instanciated Hardware Components
903   ////////////////////////////////////////
904
905   std::cout << std::endl << "External Bus and Peripherals" << std::endl << std::endl;
906
907   const size_t nb_iox_initiators = (cluster_iob0 != cluster_iob1) ? 5 : 4;
908   const size_t nb_iox_targets = (cluster_iob0 != cluster_iob1) ? 9 : 8;
909
910   // IOX network
911   VciIoxNetwork<vci_param_ext>* iox_network;
912   iox_network = new VciIoxNetwork<vci_param_ext>( "iox_network",
913                                                   maptab_iox,
914                                                   nb_iox_targets,
915                                                   nb_iox_initiators );
916   // boot ROM
917   VciSimpleRom<vci_param_ext>*  brom;
918   brom = new VciSimpleRom<vci_param_ext>( "brom",
919                                           IntTab(0, IOX_BROM_TGT_ID),
920                                           maptab_iox,
921                                           loader );
922   // Network Controller
923   VciMultiNic<vci_param_ext>*  mnic;
924   mnic = new VciMultiNic<vci_param_ext>( "mnic",
925                                          IntTab(0, IOX_MNIC_TGT_ID),
926                                          maptab_iox,
927                                          NB_NIC_CHANNELS,
928                                          0,           // mac_4 address
929                                          0,           // mac_2 address
930                                          nic_rx_name,
931                                          nic_tx_name);
932
933   // Frame Buffer
934   VciFrameBuffer<vci_param_ext>*  fbuf;
935   fbuf = new VciFrameBuffer<vci_param_ext>( "fbuf",
936                                             IntTab(0, IOX_FBUF_TGT_ID),
937                                             maptab_iox,
938                                             FBUF_X_SIZE, FBUF_Y_SIZE );
939
940   // Block Device
941   // for AHCI
942   // std::vector<std::string> filenames;
943   // filenames.push_back(disk_name);            // one single disk
944   VciBlockDeviceTsar<vci_param_ext>*  bdev;
945   bdev = new VciBlockDeviceTsar<vci_param_ext>( "bdev",
946                                                  maptab_iox,
947                                                  IntTab(0, BDEV_LOCAL_SRCID),
948                                                  IntTab(0, IOX_BDEV_TGT_ID),
949                                                  disk_name,
950                                                  512,        // block size
951                                                  64,         // burst size (bytes)
952                                                  0 );        // disk latency
953
954   // Chained Buffer DMA controller
955   VciChbufDma<vci_param_ext>*  cdma;
956   cdma = new VciChbufDma<vci_param_ext>( "cdma",
957                                          maptab_iox,
958                                          IntTab(0, CDMA_LOCAL_SRCID),
959                                          IntTab(0, IOX_CDMA_TGT_ID),
960                                          64,          // burst size (bytes)
961                                          2*NB_NIC_CHANNELS );
962   // Multi-TTY controller
963   std::vector<std::string> vect_names;
964   for( size_t tid = 0 ; tid < NB_TTY_CHANNELS ; tid++ )
965   {
966      std::ostringstream term_name;
967         term_name <<  "term" << tid;
968         vect_names.push_back(term_name.str().c_str());
969      }
970      VciMultiTty<vci_param_ext>*  mtty;
971      mtty = new VciMultiTty<vci_param_ext>( "mtty",
972                                             IntTab(0, IOX_MTTY_TGT_ID),
973                                             maptab_iox,
974                                             vect_names);
975
976   // IOPIC
977   VciIopic<vci_param_ext>* iopi;
978   iopi = new VciIopic<vci_param_ext>( "iopi",
979                                       maptab_iox,
980                                       IntTab(0, IOPI_LOCAL_SRCID),
981                                       IntTab(0, IOX_IOPI_TGT_ID),
982                                       32 );        // number of input HWI
983   // Clusters
984   TsarIobCluster<vci_param_int,
985                  vci_param_ext,
986                  dspin_int_cmd_width,
987                  dspin_int_rsp_width,
988                  dspin_ram_cmd_width,
989                  dspin_ram_rsp_width>* clusters[XMAX][YMAX];
990
991#if USING_OPENMP
992#pragma omp parallel
993    {
994#pragma omp for
995#endif
996        for(size_t i = 0; i  < (XMAX * YMAX); i++)
997        {
998            size_t x = i / YMAX;
999            size_t y = i % YMAX;
1000
1001#if USING_OPENMP
1002#pragma omp critical
1003            {
1004#endif
1005            std::cout << std::endl;
1006            std::cout << "Cluster_" << std::dec << x << "_" << y << std::endl;
1007            std::cout << std::endl;
1008
1009            const bool is_iob0 = (cluster(x,y) == cluster_iob0);
1010            const bool is_iob1 = (cluster(x,y) == cluster_iob1);
1011            const bool is_io_cluster = is_iob0 || is_iob1;
1012
1013            const int iox_iob_ini_id = is_iob0 ?
1014                IOX_IOB0_INI_ID :
1015                IOX_IOB1_INI_ID ;
1016            const int iox_iob_tgt_id = is_iob0 ?
1017                IOX_IOB0_TGT_ID :
1018                IOX_IOB1_TGT_ID ;
1019
1020            std::ostringstream sc;
1021            sc << "cluster_" << x << "_" << y;
1022            clusters[x][y] = new TsarIobCluster<vci_param_int,
1023                                                vci_param_ext,
1024                                                dspin_int_cmd_width,
1025                                                dspin_int_rsp_width,
1026                                                dspin_ram_cmd_width,
1027                                                dspin_ram_rsp_width>
1028            (
1029                sc.str().c_str(),
1030                NB_PROCS_MAX,
1031                NB_DMA_CHANNELS,
1032                x,
1033                y,
1034                XMAX,
1035                YMAX,
1036
1037                maptab_int,
1038                maptab_ram,
1039                maptab_iox,
1040
1041                x_width,
1042                y_width,
1043                vci_srcid_width - x_width - y_width,            // l_id width,
1044                p_width,
1045
1046                INT_MEMC_TGT_ID,
1047                INT_XICU_TGT_ID,
1048                INT_MDMA_TGT_ID,
1049                INT_IOBX_TGT_ID,
1050
1051                INT_PROC_INI_ID,
1052                INT_MDMA_INI_ID,
1053                INT_IOBX_INI_ID,
1054
1055                RAM_XRAM_TGT_ID,
1056
1057                RAM_MEMC_INI_ID,
1058                RAM_IOBX_INI_ID,
1059
1060                is_io_cluster,
1061                iox_iob_tgt_id,
1062                iox_iob_ini_id,
1063
1064                MEMC_WAYS,
1065                MEMC_SETS,
1066                L1_IWAYS,
1067                L1_ISETS,
1068                L1_DWAYS,
1069                L1_DSETS,
1070                XRAM_LATENCY,
1071                XCU_NB_INPUTS,
1072
1073                loader,
1074
1075                frozen_cycles,
1076                debug_from,
1077                debug_ok and (cluster(x,y) == debug_memc_id),
1078                debug_ok and (cluster(x,y) == debug_proc_id),
1079                debug_ok and debug_iob
1080            );
1081
1082#if USING_OPENMP
1083            } // end critical
1084#endif
1085        } // end for
1086#if USING_OPENMP
1087    }
1088#endif
1089
1090    std::cout << std::endl;
1091
1092    ///////////////////////////////////////////////////////////////////////////////
1093    //     Net-list
1094    ///////////////////////////////////////////////////////////////////////////////
1095
1096    // IOX network connexion
1097    iox_network->p_clk                                   (signal_clk);
1098    iox_network->p_resetn                                (signal_resetn);
1099    iox_network->p_to_ini[IOX_IOB0_INI_ID]               (signal_vci_ini_iob0);
1100    iox_network->p_to_ini[IOX_BDEV_INI_ID]               (signal_vci_ini_bdev);
1101    iox_network->p_to_ini[IOX_CDMA_INI_ID]               (signal_vci_ini_cdma);
1102    iox_network->p_to_ini[IOX_IOPI_INI_ID]               (signal_vci_ini_iopi);
1103
1104    iox_network->p_to_tgt[IOX_IOB0_TGT_ID]               (signal_vci_tgt_iob0);
1105    iox_network->p_to_tgt[IOX_MTTY_TGT_ID]               (signal_vci_tgt_mtty);
1106    iox_network->p_to_tgt[IOX_FBUF_TGT_ID]               (signal_vci_tgt_fbuf);
1107    iox_network->p_to_tgt[IOX_MNIC_TGT_ID]               (signal_vci_tgt_mnic);
1108    iox_network->p_to_tgt[IOX_BROM_TGT_ID]               (signal_vci_tgt_brom);
1109    iox_network->p_to_tgt[IOX_BDEV_TGT_ID]               (signal_vci_tgt_bdev);
1110    iox_network->p_to_tgt[IOX_CDMA_TGT_ID]               (signal_vci_tgt_cdma);
1111    iox_network->p_to_tgt[IOX_IOPI_TGT_ID]               (signal_vci_tgt_iopi);
1112
1113    if (cluster_iob0 != cluster_iob1)
1114    {
1115        iox_network->p_to_ini[IOX_IOB1_INI_ID]           (signal_vci_ini_iob1);
1116        iox_network->p_to_tgt[IOX_IOB1_TGT_ID]           (signal_vci_tgt_iob1);
1117    }
1118
1119    // BDEV connexion
1120    bdev->p_clk                                          (signal_clk);
1121    bdev->p_resetn                                       (signal_resetn);
1122    bdev->p_irq                                          (signal_irq_bdev);
1123    bdev->p_vci_target                                   (signal_vci_tgt_bdev);
1124    bdev->p_vci_initiator                                (signal_vci_ini_bdev);
1125
1126    std::cout << "  - BDEV connected" << std::endl;
1127
1128    // FBUF connexion
1129    fbuf->p_clk                                          (signal_clk);
1130    fbuf->p_resetn                                       (signal_resetn);
1131    fbuf->p_vci                                          (signal_vci_tgt_fbuf);
1132
1133    std::cout << "  - FBUF connected" << std::endl;
1134
1135    // MNIC connexion
1136    mnic->p_clk                                          (signal_clk);
1137    mnic->p_resetn                                       (signal_resetn);
1138    mnic->p_vci                                          (signal_vci_tgt_mnic);
1139    for ( size_t i=0 ; i<NB_NIC_CHANNELS ; i++ )
1140    {
1141         mnic->p_rx_irq[i]                               (signal_irq_mnic_rx[i]);
1142         mnic->p_tx_irq[i]                               (signal_irq_mnic_tx[i]);
1143    }
1144
1145    std::cout << "  - MNIC connected" << std::endl;
1146
1147    // BROM connexion
1148    brom->p_clk                                          (signal_clk);
1149    brom->p_resetn                                       (signal_resetn);
1150    brom->p_vci                                          (signal_vci_tgt_brom);
1151
1152    std::cout << "  - BROM connected" << std::endl;
1153
1154    // MTTY connexion
1155    mtty->p_clk                                          (signal_clk);
1156    mtty->p_resetn                                       (signal_resetn);
1157    mtty->p_vci                                          (signal_vci_tgt_mtty);
1158    mtty->p_irq[0]                                       (signal_irq_mtty_rx);
1159
1160    std::cout << "  - MTTY connected" << std::endl;
1161
1162    // CDMA connexion
1163    cdma->p_clk                                          (signal_clk);
1164    cdma->p_resetn                                       (signal_resetn);
1165    cdma->p_vci_target                                   (signal_vci_tgt_cdma);
1166    cdma->p_vci_initiator                                (signal_vci_ini_cdma);
1167    for ( size_t i=0 ; i<(NB_NIC_CHANNELS*2) ; i++)
1168    {
1169        cdma->p_irq[i]                                   (signal_irq_cdma[i]);
1170    }
1171
1172    std::cout << "  - CDMA connected" << std::endl;
1173
1174    // IOPI connexion
1175    iopi->p_clk                                          (signal_clk);
1176    iopi->p_resetn                                       (signal_resetn);
1177    iopi->p_vci_target                                   (signal_vci_tgt_iopi);
1178    iopi->p_vci_initiator                                (signal_vci_ini_iopi);
1179    for ( size_t i=0 ; i<32 ; i++)
1180    {
1181       if     (i < NB_NIC_CHANNELS)    iopi->p_hwi[i] (signal_irq_mnic_rx[i]);
1182       else if(i < 2 )                 iopi->p_hwi[i] (signal_irq_false);
1183       else if(i < 2+NB_NIC_CHANNELS)  iopi->p_hwi[i] (signal_irq_mnic_tx[i-2]);
1184       else if(i < 4 )                 iopi->p_hwi[i] (signal_irq_false);
1185       else if(i < 4+NB_CMA_CHANNELS)  iopi->p_hwi[i] (signal_irq_cdma[i-4]);
1186       else if(i < 8)                  iopi->p_hwi[i] (signal_irq_false);
1187       else if(i == 8)                 iopi->p_hwi[i] (signal_irq_bdev);
1188       else if(i == 9)                 iopi->p_hwi[i] (signal_irq_mtty_rx);
1189       else                            iopi->p_hwi[i] (signal_irq_false);
1190    }
1191
1192    std::cout << "  - IOPIC connected" << std::endl;
1193
1194
1195    // IOB0 cluster connexion to IOX network
1196    (*clusters[0][0]->p_vci_iob_iox_ini) (signal_vci_ini_iob0);
1197    (*clusters[0][0]->p_vci_iob_iox_tgt) (signal_vci_tgt_iob0);
1198
1199    // IOB1 cluster connexion to IOX network
1200    // (only when there is more than 1 cluster)
1201    if ( cluster_iob0 != cluster_iob1 )
1202    {
1203        (*clusters[XMAX-1][YMAX-1]->p_vci_iob_iox_ini) (signal_vci_ini_iob1);
1204        (*clusters[XMAX-1][YMAX-1]->p_vci_iob_iox_tgt) (signal_vci_tgt_iob1);
1205    }
1206
1207    // All clusters Clock & RESET connexions
1208    for ( size_t x = 0; x < (XMAX); x++ )
1209    {
1210        for (size_t y = 0; y < YMAX; y++)
1211        {
1212            clusters[x][y]->p_clk     (signal_clk);
1213            clusters[x][y]->p_resetn  (signal_resetn);
1214        }
1215    }
1216
1217   // Inter Clusters horizontal connections
1218   if (XMAX > 1)
1219   {
1220      for (size_t x = 0; x < (XMAX-1); x++)
1221      {
1222         for (size_t y = 0; y < YMAX; y++)
1223         {
1224            for (size_t k = 0; k < 3; k++)
1225            {
1226               clusters[x][y]->p_dspin_int_cmd_out[EAST][k]      (signal_dspin_int_cmd_h_inc[x][y][k]);
1227               clusters[x+1][y]->p_dspin_int_cmd_in[WEST][k]     (signal_dspin_int_cmd_h_inc[x][y][k]);
1228               clusters[x][y]->p_dspin_int_cmd_in[EAST][k]       (signal_dspin_int_cmd_h_dec[x][y][k]);
1229               clusters[x+1][y]->p_dspin_int_cmd_out[WEST][k]    (signal_dspin_int_cmd_h_dec[x][y][k]);
1230            }
1231
1232            for (size_t k = 0; k < 2; k++)
1233            {
1234               clusters[x][y]->p_dspin_int_rsp_out[EAST][k]      (signal_dspin_int_rsp_h_inc[x][y][k]);
1235               clusters[x+1][y]->p_dspin_int_rsp_in[WEST][k]     (signal_dspin_int_rsp_h_inc[x][y][k]);
1236               clusters[x][y]->p_dspin_int_rsp_in[EAST][k]       (signal_dspin_int_rsp_h_dec[x][y][k]);
1237               clusters[x+1][y]->p_dspin_int_rsp_out[WEST][k]    (signal_dspin_int_rsp_h_dec[x][y][k]);
1238            }
1239
1240            clusters[x][y]->p_dspin_ram_cmd_out[EAST]      (signal_dspin_ram_cmd_h_inc[x][y]);
1241            clusters[x+1][y]->p_dspin_ram_cmd_in[WEST]     (signal_dspin_ram_cmd_h_inc[x][y]);
1242            clusters[x][y]->p_dspin_ram_cmd_in[EAST]       (signal_dspin_ram_cmd_h_dec[x][y]);
1243            clusters[x+1][y]->p_dspin_ram_cmd_out[WEST]    (signal_dspin_ram_cmd_h_dec[x][y]);
1244            clusters[x][y]->p_dspin_ram_rsp_out[EAST]      (signal_dspin_ram_rsp_h_inc[x][y]);
1245            clusters[x+1][y]->p_dspin_ram_rsp_in[WEST]     (signal_dspin_ram_rsp_h_inc[x][y]);
1246            clusters[x][y]->p_dspin_ram_rsp_in[EAST]       (signal_dspin_ram_rsp_h_dec[x][y]);
1247            clusters[x+1][y]->p_dspin_ram_rsp_out[WEST]    (signal_dspin_ram_rsp_h_dec[x][y]);
1248         }
1249      }
1250   }
1251
1252   std::cout << std::endl << "Horizontal connections established" << std::endl;
1253
1254   // Inter Clusters vertical connections
1255   if (YMAX > 1)
1256   {
1257      for (size_t y = 0; y < (YMAX-1); y++)
1258      {
1259         for (size_t x = 0; x < XMAX; x++)
1260         {
1261            for (size_t k = 0; k < 3; k++)
1262            {
1263               clusters[x][y]->p_dspin_int_cmd_out[NORTH][k]     (signal_dspin_int_cmd_v_inc[x][y][k]);
1264               clusters[x][y+1]->p_dspin_int_cmd_in[SOUTH][k]    (signal_dspin_int_cmd_v_inc[x][y][k]);
1265               clusters[x][y]->p_dspin_int_cmd_in[NORTH][k]      (signal_dspin_int_cmd_v_dec[x][y][k]);
1266               clusters[x][y+1]->p_dspin_int_cmd_out[SOUTH][k]   (signal_dspin_int_cmd_v_dec[x][y][k]);
1267            }
1268
1269            for (size_t k = 0; k < 2; k++)
1270            {
1271               clusters[x][y]->p_dspin_int_rsp_out[NORTH][k]     (signal_dspin_int_rsp_v_inc[x][y][k]);
1272               clusters[x][y+1]->p_dspin_int_rsp_in[SOUTH][k]    (signal_dspin_int_rsp_v_inc[x][y][k]);
1273               clusters[x][y]->p_dspin_int_rsp_in[NORTH][k]      (signal_dspin_int_rsp_v_dec[x][y][k]);
1274               clusters[x][y+1]->p_dspin_int_rsp_out[SOUTH][k]   (signal_dspin_int_rsp_v_dec[x][y][k]);
1275            }
1276
1277            clusters[x][y]->p_dspin_ram_cmd_out[NORTH]     (signal_dspin_ram_cmd_v_inc[x][y]);
1278            clusters[x][y+1]->p_dspin_ram_cmd_in[SOUTH]    (signal_dspin_ram_cmd_v_inc[x][y]);
1279            clusters[x][y]->p_dspin_ram_cmd_in[NORTH]      (signal_dspin_ram_cmd_v_dec[x][y]);
1280            clusters[x][y+1]->p_dspin_ram_cmd_out[SOUTH]   (signal_dspin_ram_cmd_v_dec[x][y]);
1281            clusters[x][y]->p_dspin_ram_rsp_out[NORTH]     (signal_dspin_ram_rsp_v_inc[x][y]);
1282            clusters[x][y+1]->p_dspin_ram_rsp_in[SOUTH]    (signal_dspin_ram_rsp_v_inc[x][y]);
1283            clusters[x][y]->p_dspin_ram_rsp_in[NORTH]      (signal_dspin_ram_rsp_v_dec[x][y]);
1284            clusters[x][y+1]->p_dspin_ram_rsp_out[SOUTH]   (signal_dspin_ram_rsp_v_dec[x][y]);
1285         }
1286      }
1287   }
1288
1289   std::cout << "Vertical connections established" << std::endl;
1290
1291   // East & West boundary cluster connections
1292   for (size_t y = 0; y < YMAX; y++)
1293   {
1294      for (size_t k = 0; k < 3; k++)
1295      {
1296         clusters[0][y]->p_dspin_int_cmd_in[WEST][k]          (signal_dspin_false_int_cmd_in[0][y][WEST][k]);
1297         clusters[0][y]->p_dspin_int_cmd_out[WEST][k]         (signal_dspin_false_int_cmd_out[0][y][WEST][k]);
1298         clusters[XMAX-1][y]->p_dspin_int_cmd_in[EAST][k]     (signal_dspin_false_int_cmd_in[XMAX-1][y][EAST][k]);
1299         clusters[XMAX-1][y]->p_dspin_int_cmd_out[EAST][k]    (signal_dspin_false_int_cmd_out[XMAX-1][y][EAST][k]);
1300      }
1301
1302      for (size_t k = 0; k < 2; k++)
1303      {
1304         clusters[0][y]->p_dspin_int_rsp_in[WEST][k]          (signal_dspin_false_int_rsp_in[0][y][WEST][k]);
1305         clusters[0][y]->p_dspin_int_rsp_out[WEST][k]         (signal_dspin_false_int_rsp_out[0][y][WEST][k]);
1306         clusters[XMAX-1][y]->p_dspin_int_rsp_in[EAST][k]     (signal_dspin_false_int_rsp_in[XMAX-1][y][EAST][k]);
1307         clusters[XMAX-1][y]->p_dspin_int_rsp_out[EAST][k]    (signal_dspin_false_int_rsp_out[XMAX-1][y][EAST][k]);
1308      }
1309
1310     clusters[0][y]->p_dspin_ram_cmd_in[WEST]       (signal_dspin_false_ram_cmd_in[0][y][WEST]);
1311     clusters[0][y]->p_dspin_ram_cmd_out[WEST]      (signal_dspin_false_ram_cmd_out[0][y][WEST]);
1312     clusters[0][y]->p_dspin_ram_rsp_in[WEST]       (signal_dspin_false_ram_rsp_in[0][y][WEST]);
1313     clusters[0][y]->p_dspin_ram_rsp_out[WEST]      (signal_dspin_false_ram_rsp_out[0][y][WEST]);
1314
1315     clusters[XMAX-1][y]->p_dspin_ram_cmd_in[EAST]  (signal_dspin_false_ram_cmd_in[XMAX-1][y][EAST]);
1316     clusters[XMAX-1][y]->p_dspin_ram_cmd_out[EAST] (signal_dspin_false_ram_cmd_out[XMAX-1][y][EAST]);
1317     clusters[XMAX-1][y]->p_dspin_ram_rsp_in[EAST]  (signal_dspin_false_ram_rsp_in[XMAX-1][y][EAST]);
1318     clusters[XMAX-1][y]->p_dspin_ram_rsp_out[EAST] (signal_dspin_false_ram_rsp_out[XMAX-1][y][EAST]);
1319   }
1320
1321   std::cout << "East & West boundaries established" << std::endl;
1322
1323   // North & South boundary clusters connections
1324   for (size_t x = 0; x < XMAX; x++)
1325   {
1326      for (size_t k = 0; k < 3; k++)
1327      {
1328         clusters[x][0]->p_dspin_int_cmd_in[SOUTH][k]         (signal_dspin_false_int_cmd_in[x][0][SOUTH][k]);
1329         clusters[x][0]->p_dspin_int_cmd_out[SOUTH][k]        (signal_dspin_false_int_cmd_out[x][0][SOUTH][k]);
1330         clusters[x][YMAX-1]->p_dspin_int_cmd_in[NORTH][k]    (signal_dspin_false_int_cmd_in[x][YMAX-1][NORTH][k]);
1331         clusters[x][YMAX-1]->p_dspin_int_cmd_out[NORTH][k]   (signal_dspin_false_int_cmd_out[x][YMAX-1][NORTH][k]);
1332      }
1333
1334      for (size_t k = 0; k < 2; k++)
1335      {
1336         clusters[x][0]->p_dspin_int_rsp_in[SOUTH][k]         (signal_dspin_false_int_rsp_in[x][0][SOUTH][k]);
1337         clusters[x][0]->p_dspin_int_rsp_out[SOUTH][k]        (signal_dspin_false_int_rsp_out[x][0][SOUTH][k]);
1338         clusters[x][YMAX-1]->p_dspin_int_rsp_in[NORTH][k]    (signal_dspin_false_int_rsp_in[x][YMAX-1][NORTH][k]);
1339         clusters[x][YMAX-1]->p_dspin_int_rsp_out[NORTH][k]   (signal_dspin_false_int_rsp_out[x][YMAX-1][NORTH][k]);
1340      }
1341
1342      clusters[x][0]->p_dspin_ram_cmd_in[SOUTH]       (signal_dspin_false_ram_cmd_in[x][0][SOUTH]);
1343      clusters[x][0]->p_dspin_ram_cmd_out[SOUTH]      (signal_dspin_false_ram_cmd_out[x][0][SOUTH]);
1344      clusters[x][0]->p_dspin_ram_rsp_in[SOUTH]       (signal_dspin_false_ram_rsp_in[x][0][SOUTH]);
1345      clusters[x][0]->p_dspin_ram_rsp_out[SOUTH]      (signal_dspin_false_ram_rsp_out[x][0][SOUTH]);
1346
1347      clusters[x][YMAX-1]->p_dspin_ram_cmd_in[NORTH]  (signal_dspin_false_ram_cmd_in[x][YMAX-1][NORTH]);
1348      clusters[x][YMAX-1]->p_dspin_ram_cmd_out[NORTH] (signal_dspin_false_ram_cmd_out[x][YMAX-1][NORTH]);
1349      clusters[x][YMAX-1]->p_dspin_ram_rsp_in[NORTH]  (signal_dspin_false_ram_rsp_in[x][YMAX-1][NORTH]);
1350      clusters[x][YMAX-1]->p_dspin_ram_rsp_out[NORTH] (signal_dspin_false_ram_rsp_out[x][YMAX-1][NORTH]);
1351   }
1352
1353   std::cout << "North & South boundaries established" << std::endl << std::endl;
1354
1355   ////////////////////////////////////////////////////////
1356   //   Simulation
1357   ///////////////////////////////////////////////////////
1358
1359   sc_start(sc_core::sc_time(0, SC_NS));
1360
1361   signal_resetn = false;
1362   signal_irq_false = false;
1363
1364   // network boundaries signals
1365   for (size_t x = 0; x < XMAX ; x++)
1366   {
1367      for (size_t y = 0; y < YMAX ; y++)
1368      {
1369         for (size_t a = 0; a < 4; a++)
1370         {
1371            for (size_t k = 0; k < 3; k++)
1372            {
1373               signal_dspin_false_int_cmd_in[x][y][a][k].write = false;
1374               signal_dspin_false_int_cmd_in[x][y][a][k].read = true;
1375               signal_dspin_false_int_cmd_out[x][y][a][k].write = false;
1376               signal_dspin_false_int_cmd_out[x][y][a][k].read = true;
1377            }
1378
1379            for (size_t k = 0; k < 2; k++)
1380            {
1381               signal_dspin_false_int_rsp_in[x][y][a][k].write = false;
1382               signal_dspin_false_int_rsp_in[x][y][a][k].read = true;
1383               signal_dspin_false_int_rsp_out[x][y][a][k].write = false;
1384               signal_dspin_false_int_rsp_out[x][y][a][k].read = true;
1385            }
1386
1387            signal_dspin_false_ram_cmd_in[x][y][a].write = false;
1388            signal_dspin_false_ram_cmd_in[x][y][a].read = true;
1389            signal_dspin_false_ram_cmd_out[x][y][a].write = false;
1390            signal_dspin_false_ram_cmd_out[x][y][a].read = true;
1391
1392            signal_dspin_false_ram_rsp_in[x][y][a].write = false;
1393            signal_dspin_false_ram_rsp_in[x][y][a].read = true;
1394            signal_dspin_false_ram_rsp_out[x][y][a].write = false;
1395            signal_dspin_false_ram_rsp_out[x][y][a].read = true;
1396         }
1397      }
1398   }
1399
1400    sc_start(sc_core::sc_time(1, SC_NS));
1401    signal_resetn = true;
1402
1403
1404    // simulation loop
1405    struct timeval t1,t2;
1406    gettimeofday(&t1, NULL);
1407
1408
1409    for ( size_t n = 0; n < ncycles ; n += simul_period )
1410    {
1411        // stats display
1412        if( (n % 1000000) == 0)
1413        {
1414            gettimeofday(&t2, NULL);
1415
1416            uint64_t ms1 = (uint64_t) t1.tv_sec  * 1000ULL +
1417                           (uint64_t) t1.tv_usec / 1000;
1418            uint64_t ms2 = (uint64_t) t2.tv_sec  * 1000ULL +
1419                           (uint64_t) t2.tv_usec / 1000;
1420            std::cerr << "### cycle = " << std::dec << n
1421                      << " / frequency = "
1422                      << (double) 1000000 / (double) (ms2 - ms1) << "Khz"
1423                      << std::endl;
1424
1425            gettimeofday(&t1, NULL);
1426        }
1427
1428        // Monitor a specific address for one L1 cache
1429        // clusters[0][0]->proc[0]->cache_monitor(0xC0180ULL);
1430
1431        // Monitor a specific address for one L2 cache
1432        // clusters[0][0]->memc->cache_monitor( 0xC0100ULL, true );   // single word
1433
1434        // Monitor a specific address for one XRAM
1435        // clusters[0][0]->xram->start_monitor( 0xC0100ULL , 4);
1436
1437        if ( debug_ok and (n > debug_from) )
1438        {
1439            std::cout << "****************** cycle " << std::dec << n ;
1440            std::cout << " ************************************************" << std::endl;
1441
1442            // trace proc[debug_proc_id]
1443            if ( debug_proc_id != 0xFFFFFFFF )
1444            {
1445                size_t l          = debug_proc_id & ((1<<P_WIDTH)-1) ;
1446                size_t cluster_xy = debug_proc_id >> P_WIDTH ;
1447                size_t x          = cluster_xy >> 4;
1448                size_t y          = cluster_xy & 0xF;
1449
1450                clusters[x][y]->proc[l]->print_trace(0x1);
1451                std::ostringstream proc_signame;
1452                proc_signame << "[SIG]PROC_" << x << "_" << y << "_" << l ;
1453                clusters[x][y]->signal_int_vci_ini_proc[l].print_trace(proc_signame.str());
1454
1455                clusters[x][y]->xicu->print_trace(l);
1456                std::ostringstream xicu_signame;
1457                xicu_signame << "[SIG]XICU_" << x << "_" << y;
1458                clusters[x][y]->signal_int_vci_tgt_xicu.print_trace(xicu_signame.str());
1459
1460                clusters[x][y]->mdma->print_trace();
1461                std::ostringstream mdma_signame;
1462                mdma_signame << "[SIG]MDMA_" << x << "_" << y;
1463                clusters[x][y]->signal_int_vci_tgt_mdma.print_trace(mdma_signame.str());
1464
1465                // local interrupts in cluster(x,y)
1466                if( clusters[x][y]->signal_irq_memc.read() )
1467                std::cout << "### IRQ_MMC_" << std::dec << x << "_" << y
1468                          << " ACTIVE" << std::endl;
1469
1470                for ( size_t c = 0 ; c < NB_DMA_CHANNELS ; c++ )
1471                {
1472                    if( clusters[x][y]->signal_irq_mdma[c].read() )
1473                    std::cout << "### IRQ_DMA_" << std::dec << x << "_" << y << "_" << c
1474                              << " ACTIVE" << std::endl;
1475                }
1476
1477                for ( size_t c = 0 ; c < NB_PROCS_MAX ; c++ )
1478                {
1479                    if( clusters[x][y]->signal_proc_it[c].read() )
1480                    std::cout << "### IRQ_PROC_" << std::dec << x << "_" << y << "_" << c
1481                              << " ACTIVE" << std::endl;
1482                }
1483            }
1484
1485            // trace memc[debug_memc_id]
1486            if ( debug_memc_id != 0xFFFFFFFF )
1487            {
1488                size_t x = debug_memc_id >> 4;
1489                size_t y = debug_memc_id & 0xF;
1490
1491                clusters[x][y]->memc->print_trace(0);
1492                std::ostringstream smemc_tgt;
1493                smemc_tgt << "[SIG]MEMC_TGT_" << x << "_" << y;
1494                clusters[x][y]->signal_int_vci_tgt_memc.print_trace(smemc_tgt.str());
1495                std::ostringstream smemc_ini;
1496                smemc_ini << "[SIG]MEMC_INI_" << x << "_" << y;
1497                clusters[x][y]->signal_ram_vci_ini_memc.print_trace(smemc_ini.str());
1498
1499                clusters[x][y]->xram->print_trace();
1500                std::ostringstream sxram_tgt;
1501                sxram_tgt << "[SIG]XRAM_TGT_" << x << "_" << y;
1502                clusters[x][y]->signal_ram_vci_tgt_xram.print_trace(sxram_tgt.str());
1503            }
1504
1505
1506            // trace XRAM and XRAM network routers in cluster[debug_xram_id]
1507            if ( debug_xram_id != 0xFFFFFFFF )
1508            {
1509                size_t x = debug_xram_id >> 4;
1510                size_t y = debug_xram_id & 0xF;
1511
1512                clusters[x][y]->xram->print_trace();
1513                std::ostringstream sxram_tgt;
1514                sxram_tgt << "[SIG]XRAM_TGT_" << x << "_" << y;
1515                clusters[x][y]->signal_ram_vci_tgt_xram.print_trace(sxram_tgt.str());
1516
1517                clusters[x][y]->ram_router_cmd->print_trace();
1518                clusters[x][y]->ram_router_rsp->print_trace();
1519            }
1520
1521            // trace iob, iox and external peripherals
1522            if ( debug_iob )
1523            {
1524                clusters[0][0]->iob->print_trace();
1525                clusters[XMAX-1][YMAX-1]->iob->print_trace();
1526//              clusters[0][0]->signal_int_vci_tgt_iobx.print_trace( "[SIG]IOB0_INT_TGT");
1527//              clusters[0][0]->signal_int_vci_ini_iobx.print_trace( "[SIG]IOB0_INT_INI");
1528//              clusters[0][0]->signal_ram_vci_ini_iobx.print_trace( "[SIG]IOB0_RAM_INI");
1529
1530//              signal_vci_ini_iob0.print_trace("[SIG]IOB0_IOX_INI");
1531//              signal_vci_tgt_iob0.print_trace("[SIG]IOB0_IOX_TGT");
1532
1533//              cdma->print_trace();
1534//              signal_vci_tgt_cdma.print_trace("[SIG]IOX_CDMA_TGT");
1535//              signal_vci_ini_cdma.print_trace("[SIG]IOX_CDMA_INI");
1536
1537//              brom->print_trace();
1538//              signal_vci_tgt_brom.print_trace("[SIG]IOX_BROM_TGT");
1539
1540//              mtty->print_trace();
1541//              signal_vci_tgt_mtty.print_trace("[SIG]IOX_MTTY_TGT");
1542
1543                bdev->print_trace();
1544                signal_vci_tgt_bdev.print_trace("[SIG]BDEV_TGT");
1545                signal_vci_ini_bdev.print_trace("[SIG]BDEV_INI");
1546
1547//              mnic->print_trace();
1548//              signal_vci_tgt_mnic.print_trace("[SIG]MNIC_TGT");
1549
1550//              fbuf->print_trace();
1551//              signal_vci_tgt_fbuf.print_trace("[SIG]FBUF");
1552
1553                iopi->print_trace();
1554                signal_vci_ini_iopi.print_trace("[SIG]IOPI_INI");
1555                signal_vci_tgt_iopi.print_trace("[SIG]IOPI_TGT");
1556                iox_network->print_trace();
1557
1558                // interrupts
1559                if (signal_irq_bdev)       std::cout << "### IRQ_BDEV ACTIVE"       << std::endl;
1560                if (signal_irq_mtty_rx)    std::cout << "### IRQ_MTTY ACTIVE"       << std::endl;
1561                if (signal_irq_mnic_rx[0]) std::cout << "### IRQ_MNIC_RX[0] ACTIVE" << std::endl;
1562                if (signal_irq_mnic_rx[1]) std::cout << "### IRQ_MNIC_RX[1] ACTIVE" << std::endl;
1563                if (signal_irq_mnic_tx[0]) std::cout << "### IRQ_MNIC_TX[0] ACTIVE" << std::endl;
1564                if (signal_irq_mnic_tx[1]) std::cout << "### IRQ_MNIC_TX[1] ACTIVE" << std::endl;
1565            }
1566        }
1567
1568        sc_start(sc_core::sc_time(simul_period, SC_NS));
1569    }
1570    return EXIT_SUCCESS;
1571}
1572
1573int sc_main (int argc, char *argv[])
1574{
1575   try {
1576      return _main(argc, argv);
1577   } catch (std::exception &e) {
1578      std::cout << e.what() << std::endl;
1579   } catch (...) {
1580      std::cout << "Unknown exception occured" << std::endl;
1581      throw;
1582   }
1583   return 1;
1584}
1585
1586
1587// Local Variables:
1588// tab-width: 3
1589// c-basic-offset: 3
1590// c-file-offsets:((innamespace . 0)(inline-open . 0))
1591// indent-tabs-mode: nil
1592// End:
1593
1594// vim: filetype=cpp:expandtab:shiftwidth=3:tabstop=3:softtabstop=3
1595
1596
1597
Note: See TracBrowser for help on using the repository browser.