Changeset 707


Ignore:
Timestamp:
Jun 5, 2014, 11:27:33 AM (11 years ago)
Author:
alain
Message:

Bug Fix: in the special case of one single cluster
there is only one IOB component toa access IOX network (IOB1 does not exist).

Location:
trunk/platforms/tsar_generic_iob
Files:
1 added
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/platforms/tsar_generic_iob/top.cpp

    r693 r707  
    11///////////////////////////////////////////////////////////////////////////////
    2 // File: top.cpp
     2// File: top.cpp  (for tsar_generic_iob platform)
    33// Author: Alain Greiner
    44// Copyright: UPMC/LIP6
     
    77///////////////////////////////////////////////////////////////////////////////
    88// This file define a generic TSAR architecture with an IO network emulating
    9 // an external bus (i.e. Hypertransport) to access external peripherals:
     9// an external bus (i.e. Hypertransport) to access 7 external peripherals:
    1010//
    1111// - BROM : boot ROM
     
    1515// - CDMA : Chained Buffer DMA controller (up to 4 channels)
    1616// - BDEV : Dlock Device controler (1 channel)
    17 //
    18 // The internal physical address space is 40 bits.
     17// - IOPI : HWI to SWI translator.
    1918//
    20 // It contains a 2D mesh of XMAX*YMAX clusters, and the cluster index
    21 // is encoded on 8 bits (X_WIDTH = 4 / Y_WIDTH = 4) whatever the mesh size.
     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.
    2223//
    2324// It contains 3 networks:
    2425//
    25 // 1) the INT network supports Read/Write transactions
     26// 1) the "INT" network supports Read/Write transactions
    2627//    between processors and L2 caches or peripherals.
    2728//    (VCI ADDDRESS = 40 bits / VCI DATA width = 32 bits)
    2829//    It supports also coherence transactions between L1 & L2 caches.
    29 // 3) the RAM network is emulating the 3D network between L2 caches
     30// 3) the "RAM" network is emulating the 3D network between L2 caches
    3031//    and L3 caches, and is implemented as a 2D mesh between the L2 caches,
    3132//    the two IO bridges and the physical RAMs disributed in all clusters.
    3233//    (VCI ADDRESS = 40 bits / VCI DATA = 64 bits)
    3334// 4) the IOX network connects the two IO bridge components to the
    34 //    6 external peripheral controllers.
     35//    7 external peripheral controllers.
    3536//    (VCI ADDDRESS = 40 bits / VCI DATA width = 64 bits)
    3637//
    37 // The external peripherals IRQs are connected to the XICU component
    38 // in cluster(0,0): therefore, the number of channels for the external
    39 // peripherals (MTTY, MNIC, CDMA) is limited by the number of IRQ ports...
     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// The total number of channels for the external peripherals (MTTY, MNIC, CDMA
     42// IOC or HBA) is limited by the IOPIC 32 HWI inputs:..
     43// - IOPIC HWI[1:0]     connected to IRQ_NIC_RX[1:0]
     44// - IOPIC HWI[3:2]     connected to IRQ_NIC_TX[1:0]     
     45// - IOPIC HWI[7:4]     connected to IRQ_CMA_TX[3:0]]
     46// - IOPIC HWI[8]       connected to IRQ_BDEV
     47// - IOPIC HWI[15:9]    unused       (grounded)
     48// - IOPIC HWI[23:16]   connected to IRQ_TTY_RX[7:0]]
     49// - IOPIC HWI[31:24]   connected to IRQ_TTY_TX[7:0]]   TBD
    4050//
    41 // In cluster(0,0), the XICU HWI input ports are connected as follow:
    42 // - IRQ_IN[0]  to IRQ_IN[7]  grounded (reserved for PTI or SWI)
    43 // - IRQ_IN[8]  to IRQ_IN[9]  are connected to 2 NIC_RX channels.
    44 // - IRQ_IN[10] to IRQ_IN[11] are connected to 2 NIC_TX channels.
    45 // - IRQ_IN[12] to IRQ_IN[15] are connected to 4 CDMA channels
    46 // - IRQ_IN[16] to IRQ_IN[30] are connected to 15 TTY channels
    47 // - IRQ_IN[31]               is connected to BDEV
    48 // In other clusters, the XICU HWI input ports are grounded.
     51// Besides the external peripherals, each cluster contains on XICU component,
     52// and one multi channels DMA component.
     53// The XICU component is mainly used to handle WTI IRQs, as only 2 HWI IRQs
     54// are connected to XICU in each cluster:
     55// - IRQ_IN[0] : MMC
     56// - IRQ_IN[1] : DMA channel 0
     57// - IRQ_IN[2] : DMA channel 1
     58// - IRQ_IN[3] : DMA channel 2
     59// - IRQ_IN[4] : DMA channel 3
    4960//
    5061// All clusters are identical, but cluster(0,0) and cluster(XMAX-1,YMAX-1)
    5162// contain an extra IO bridge component. These IOB0 & IOB1 components are
    5263// connected to the three networks (INT, RAM, IOX).
    53 // The number of clusters cannot be larger than 256.
    54 // The number of processors per cluster cannot be larger than 4.
    5564//
    5665// - It uses two dspin_local_crossbar per cluster to implement the
     
    7079//
    7180// The main hardware parameters must be defined in the hard_config.h file :
    72 // - XMAX        : number of clusters in a row (power of 2)
    73 // - YMAX        : number of clusters in a column (power of 2)
    74 // - CLUSTER_SIZE     : size of the segment allocated to a cluster
     81// - X_SIZE           : number of clusters in a row
     82// - Y_SIZE           : number of clusters in a column
    7583// - NB_PROCS_MAX     : number of processors per cluster (power of 2)
    76 // - NB_DMA_CHANNELS  : number of DMA channels per cluster (< 9)
    77 // - NB_TTY_CHANNELS  : number of TTY channels in I/O network (< 16)
    78 // - NB_NIC_CHANNELS  : number of NIC channels in I/O network (< 9)
     84// - NB_TTY_CHANNELS  : number of TTY channels in I/O network (up to 16)
     85// - NB_NIC_CHANNELS  : number of NIC channels in I/O network (up to 2)
     86// - NB_CMA_CHANNELS  : number of CMA channels in I/O network (up to 4)
    7987//
    8088// Some secondary hardware parameters must be defined in this top.cpp file:
     
    99107// The (x_width + y_width) MSB bits (left aligned) define
    100108// the cluster index, and the LADR bits define the local index:
    101 //      | X_ID  | Y_ID  |---| LADR |     OFFSET          |
    102 //      |x_width|y_width|---|  8   |       24            |
     109//      |X_ID|Y_ID|  LADR |     OFFSET          |
     110//      |  4 |  4 |   8    |       24            |
    103111//
    104112// General policy for 14 bits SRCID decoding:
    105113// Each component is identified by (x_id, y_id, l_id) tuple.
    106 //      | X_ID  | Y_ID  |---| L_ID |
    107 //      |x_width|y_width|---|  6   |
     114//      |X_ID|Y_ID| L_ID |
     115//      |  4 |  4 |  6   |
    108116/////////////////////////////////////////////////////////////////////////
    109117
     
    127135#include "vci_framebuffer.h"
    128136#include "vci_iox_network.h"
     137#include "vci_iox_network.h"
     138#include "vci_iopic.h"
    129139
    130140#include "alloc_elems.h"
     
    179189//////////////////////i/////////////////////////////////////
    180190
    181 #include "giet_vm/hard_config.h"
     191#include "hard_config.h"
    182192
    183193////////////////////////////////////////////////////////////
     
    238248
    239249#define IOBX_BASE             0x00BE000000
    240 #define IOBX_SIZE             0x0000001000   // 4 K Kbytes
     250#define IOBX_SIZE             0x0000001000   // 4 Kbytes
    241251
    242252#define BDEV_BASE             0x00B3000000     
    243 #define BDEV_SIZE             0x0000008000   // 4 Kbytes
     253#define BDEV_SIZE             0x0000001000   // 4 Kbytes
    244254
    245255#define MTTY_BASE             0x00B4000000     
    246 #define MTTY_SIZE             0x0000001000 * NB_TTY_CHANNELS  // 4 Kbytes
     256#define MTTY_SIZE             0x0000001000   // 4 Kbytes
    247257
    248258#define MNIC_BASE             0x00B5000000     
     
    250260
    251261#define CDMA_BASE             0x00B6000000     
    252 #define CDMA_SIZE             0x0000001000 * (NB_NIC_CHANNELS * 2)  // 4 Kbytes per channel
     262#define CDMA_SIZE             0x0000001000 * (NB_CMA_CHANNELS)  // 4 Kbytes per channel
    253263
    254264#define FBUF_BASE             0x00B7000000     
    255265#define FBUF_SIZE             FBUF_X_SIZE * FBUF_Y_SIZE
    256266
     267#define IOPI_BASE             0x00B8000000     
     268#define IOPI_SIZE             0x0000001000   // 4 Kbytes
     269
    257270// Replicated peripherals : address is incremented by a cluster offset
    258271//     offset  = cluster(x,y) << (address_width-x_width-y_width);
    259272
    260273#define XRAM_BASE             0x0000000000     
    261 #define XRAM_SIZE             0x0010000000   // 256 Mbytes
     274#define XRAM_SIZE             0x0004000000   // 64 Mbytes
    262275
    263276#define XICU_BASE             0x00B0000000     
     
    287300//   accessed in 2 clusters : cluster_iob0 and cluster_iob1.
    288301//   They have the same local index, but two different cluster indexes.
     302//
    289303// As cluster_iob0 and cluster_iob1 contain both internal initiators
    290304// and external initiators, they must have different local indexes.
    291305// Consequence: For a local interconnect, the INI_ID port index
    292306// is NOT equal to the SRCID local index, and the local interconnect
    293 // must make a translation: SRCID => INI_ID (port index)
     307// must make a translation: SRCID => INI_ID
    294308////////////////////////////////////////////////////////////////////////
    295309
     
    298312#define IOBX_LOCAL_SRCID             0x9
    299313#define MEMC_LOCAL_SRCID             0xA
     314#define IOPI_LOCAL_SRCID             0xD
    300315#define CDMA_LOCAL_SRCID             0xE    // hard-coded in dspin_tsar
    301316#define BDEV_LOCAL_SRCID             0xF    // hard-coded in dspin_tsar
     
    311326
    312327#define INT_PROC_INI_ID              0   // from 0 to (NB_PROCS_MAX-1)
    313 #define INT_MDMA_INI_ID              NB_PROCS_MAX
     328#define INT_MDMA_INI_ID              (NB_PROCS_MAX)
    314329#define INT_IOBX_INI_ID              (NB_PROCS_MAX+1)
    315330
     
    335350#define IOX_BROM_TGT_ID              6
    336351#define IOX_MTTY_TGT_ID              7
     352#define IOX_IOPI_TGT_ID              8
    337353
    338354#define IOX_IOB0_INI_ID              0    // Don't change this value
     
    340356#define IOX_BDEV_INI_ID              2     
    341357#define IOX_CDMA_INI_ID              3 
     358#define IOX_IOPI_INI_ID              4
    342359
    343360////////////////////////////////////////////////////////////////////////
     
    360377   size_t   debug_memc_id    = 0xFFFFFFFF;                 // index of traced memc   
    361378   size_t   debug_proc_id    = 0xFFFFFFFF;                 // index of traced proc
     379   size_t   debug_xram_id    = 0xFFFFFFFF;                 // index of traced xram
    362380   bool     debug_iob        = false;                      // trace iob0 & iob1 when true
    363381   uint32_t debug_from       = 0;                          // trace start cycle
     
    401419            if( (x>=XMAX) || (y>=YMAX) )
    402420            {
    403                 std::cout << "PROCID parameter does'nt fit XMAX/YMAX" << std::endl;
     421                std::cout << "MEMCID parameter does'nt fit XMAX/YMAX" << std::endl;
     422                exit(0);
     423            }
     424         }
     425         else if ((strcmp(argv[n],"-XRAMID") == 0) && (n+1<argc) )
     426         {
     427            debug_xram_id = atoi(argv[n+1]);
     428            size_t x = debug_xram_id >> 4;
     429            size_t y = debug_xram_id & 0xF;
     430            if( (x>=XMAX) || (y>=YMAX) )
     431            {
     432                std::cout << "XRAMID parameter does'nt fit XMAX/YMAX" << std::endl;
    404433                exit(0);
    405434            }
     
    447476            std::cout << "     -PERIOD number_of_cycles between trace" << std::endl;
    448477            std::cout << "     -MEMCID index_memc_to_be_traced" << std::endl;
     478            std::cout << "     -XRAMID index_xram_to_be_traced" << std::endl;
    449479            std::cout << "     -PROCID index_proc_to_be_traced" << std::endl;
    450480            std::cout << "     -IOB    non_zero_value" << std::endl;
     
    473503           "The NB_NIC_CHANNELS parameter must be 2" );
    474504
    475    std::cout << std::endl;
    476    std::cout << " - XMAX            = " << XMAX << std::endl;
    477    std::cout << " - YMAX            = " << YMAX << std::endl;
    478    std::cout << " - NB_PROCS_MAX    = " << NB_PROCS_MAX <<  std::endl;
    479    std::cout << " - NB_DMA_CHANNELS = " << NB_DMA_CHANNELS <<  std::endl;
    480    std::cout << " - NB_TTY_CHANNELS = " << NB_TTY_CHANNELS <<  std::endl;
    481    std::cout << " - NB_NIC_CHANNELS = " << NB_NIC_CHANNELS <<  std::endl;
    482    std::cout << " - MEMC_WAYS       = " << MEMC_WAYS << std::endl;
    483    std::cout << " - MEMC_SETS       = " << MEMC_SETS << std::endl;
    484    std::cout << " - RAM_LATENCY     = " << XRAM_LATENCY << std::endl;
    485    std::cout << " - MAX_FROZEN      = " << frozen_cycles << std::endl;
     505   std::cout << std::endl << std::dec
     506             << " - XMAX            = " << XMAX << std::endl
     507             << " - YMAX            = " << YMAX << std::endl
     508             << " - NB_PROCS_MAX    = " << NB_PROCS_MAX <<  std::endl
     509             << " - NB_DMA_CHANNELS = " << NB_DMA_CHANNELS <<  std::endl
     510             << " - NB_TTY_CHANNELS = " << NB_TTY_CHANNELS <<  std::endl
     511             << " - NB_NIC_CHANNELS = " << NB_NIC_CHANNELS <<  std::endl
     512             << " - MEMC_WAYS       = " << MEMC_WAYS << std::endl
     513             << " - MEMC_SETS       = " << MEMC_SETS << std::endl
     514             << " - RAM_LATENCY     = " << XRAM_LATENCY << std::endl
     515             << " - MAX_FROZEN      = " << frozen_cycles << std::endl
     516             << " - DEBUG_PROCID    = " << debug_proc_id << std::endl
     517             << " - DEBUG_MEMCID    = " << debug_memc_id << std::endl
     518             << " - DEBUG_XRAMID    = " << debug_xram_id << std::endl;
    486519
    487520   std::cout << std::endl;
     
    597630            maptab_int.add(Segment(sdma.str(), CDMA_BASE+offset, CDMA_SIZE,
    598631                        IntTab(cluster(x,y), INT_IOBX_TGT_ID), not cacheable));
     632
     633            std::ostringstream    spic;
     634            spic << "int_seg_iopi_" << x << "_" << y;
     635            maptab_int.add(Segment(spic.str(), IOPI_BASE+offset, IOPI_SIZE,
     636                        IntTab(cluster(x,y), INT_IOBX_TGT_ID), not cacheable));
    599637         }
    600638
     
    606644
    607645         maptab_int.srcid_map( IntTab( cluster(x,y), IOBX_LOCAL_SRCID ),
     646                               IntTab( cluster(x,y), INT_IOBX_INI_ID ) );
     647
     648         maptab_int.srcid_map( IntTab( cluster(x,y), IOPI_LOCAL_SRCID ),
    608649                               IntTab( cluster(x,y), INT_IOBX_INI_ID ) );
    609650
     
    667708    // - two levels address decoding for commands
    668709    // - two levels srcid decoding for responses
    669     // - 4 initiators (IOB0, IOB1, BDEV, CDMA)
    670     // - 8 targets (IOB0, IOB1, BDEV, CDMA, MTTY, FBUF, BROM, MNIC)
     710    // - 5 initiators (IOB0, IOB1, BDEV, CDMA, IOPI)
     711    // - 9 targets (IOB0, IOB1, BDEV, CDMA, MTTY, FBUF, BROM, MNIC, IOPI)
    671712    ///////////////////////////////////////////////////////////////////////
    672713    MappingTable maptab_iox( vci_address_width,
     
    679720    uint64_t iob1_base = ((uint64_t)cluster_iob1) << (vci_address_width - x_width - y_width);
    680721
    681     // Each peripheral can be accessed through two segments,
    682     // depending on the used IOB (IOB0 or IOB1).
     722    // External peripherals segments
     723    // WHen there is more than one cluster, external peripherals can be accessed
     724    // through two segments, depending on the used IOB (IOB0 or IOB1).
    683725    maptab_iox.add(Segment("iox_seg_mtty_0", MTTY_BASE + iob0_base, MTTY_SIZE,
    684726                   IntTab(cluster_iob0,IOX_MTTY_TGT_ID), false));
    685     maptab_iox.add(Segment("iox_seg_mtty_1", MTTY_BASE + iob1_base, MTTY_SIZE,
    686                    IntTab(cluster_iob1,IOX_MTTY_TGT_ID), false));
    687 
    688727    maptab_iox.add(Segment("iox_seg_fbuf_0", FBUF_BASE + iob0_base, FBUF_SIZE,
    689728                   IntTab(cluster_iob0,IOX_FBUF_TGT_ID), false));
    690     maptab_iox.add(Segment("iox_seg_fbuf_1", FBUF_BASE + iob1_base, FBUF_SIZE,
    691                    IntTab(cluster_iob1,IOX_FBUF_TGT_ID), false));
    692 
    693729    maptab_iox.add(Segment("iox_seg_bdev_0", BDEV_BASE + iob0_base, BDEV_SIZE,
    694730                   IntTab(cluster_iob0,IOX_BDEV_TGT_ID), false));
    695     maptab_iox.add(Segment("iox_seg_bdev_1", BDEV_BASE + iob1_base, BDEV_SIZE,
    696                    IntTab(cluster_iob1,IOX_BDEV_TGT_ID), false));
    697 
    698731    maptab_iox.add(Segment("iox_seg_mnic_0", MNIC_BASE + iob0_base, MNIC_SIZE,
    699732                   IntTab(cluster_iob0,IOX_MNIC_TGT_ID), false));
    700     maptab_iox.add(Segment("iox_seg_mnic_1", MNIC_BASE + iob1_base, MNIC_SIZE,
    701                    IntTab(cluster_iob1,IOX_MNIC_TGT_ID), false));
    702 
    703733    maptab_iox.add(Segment("iox_seg_cdma_0", CDMA_BASE + iob0_base, CDMA_SIZE,
    704734                   IntTab(cluster_iob0,IOX_CDMA_TGT_ID), false));
    705     maptab_iox.add(Segment("iox_seg_cdma_1", CDMA_BASE + iob1_base, CDMA_SIZE,
    706                    IntTab(cluster_iob1,IOX_CDMA_TGT_ID), false));
    707 
    708735    maptab_iox.add(Segment("iox_seg_brom_0", BROM_BASE + iob0_base, BROM_SIZE,
    709736                   IntTab(cluster_iob0,IOX_BROM_TGT_ID), false));
    710     maptab_iox.add(Segment("iox_seg_brom_1", BROM_BASE + iob1_base, BROM_SIZE,
     737    maptab_iox.add(Segment("iox_seg_iopi_0", IOPI_BASE + iob0_base, IOPI_SIZE,
     738                   IntTab(cluster_iob0,IOX_IOPI_TGT_ID), false));
     739   
     740    if ( cluster_iob0 != cluster_iob1 )
     741    {
     742        maptab_iox.add(Segment("iox_seg_mtty_1", MTTY_BASE + iob1_base, MTTY_SIZE,
     743                   IntTab(cluster_iob1,IOX_MTTY_TGT_ID), false));
     744        maptab_iox.add(Segment("iox_seg_fbuf_1", FBUF_BASE + iob1_base, FBUF_SIZE,
     745                   IntTab(cluster_iob1,IOX_FBUF_TGT_ID), false));
     746        maptab_iox.add(Segment("iox_seg_bdev_1", BDEV_BASE + iob1_base, BDEV_SIZE,
     747                   IntTab(cluster_iob1,IOX_BDEV_TGT_ID), false));
     748        maptab_iox.add(Segment("iox_seg_mnic_1", MNIC_BASE + iob1_base, MNIC_SIZE,
     749                   IntTab(cluster_iob1,IOX_MNIC_TGT_ID), false));
     750        maptab_iox.add(Segment("iox_seg_cdma_1", CDMA_BASE + iob1_base, CDMA_SIZE,
     751                   IntTab(cluster_iob1,IOX_CDMA_TGT_ID), false));
     752        maptab_iox.add(Segment("iox_seg_brom_1", BROM_BASE + iob1_base, BROM_SIZE,
    711753                   IntTab(cluster_iob1,IOX_BROM_TGT_ID), false));
    712 
    713     // Each physical RAM can be accessed through IOB0, or through IOB1.
    714     // if IOMMU is not activated, addresses are 40 bits (physical addresses),
    715     // and the choice depends on on address bit A[39].
    716     // if IOMMU is activated the addresses use only 32 bits (virtual addresses),
    717     // and the choice depends on address bit A[31].
     754        maptab_iox.add(Segment("iox_seg_iopi_1", IOPI_BASE + iob1_base, IOPI_SIZE,
     755                   IntTab(cluster_iob1,IOX_IOPI_TGT_ID), false));
     756    }
     757
     758    // If there is more than one cluster, external peripherals
     759    // can access RAM through two segments (IOB0 / IOB1).
     760    // As IOMMU is not activated, addresses are 40 bits (physical addresses),
     761    // and the choice depends on address bit A[39].
    718762    for (size_t x = 0; x < XMAX; x++)
    719763    {
     
    723767                             << (vci_address_width-x_width-y_width);
    724768
    725             if ( x < (XMAX/2) ) // send command to XRAM through IOB0
     769            if ( (cluster_iob0 != cluster_iob1) and (x >= (XMAX/2)) ) // use IOB1
     770            {
     771                std::ostringstream siob1;
     772                siob1 << "iox_seg_xram_" << x << "_" << y;
     773                maptab_iox.add(Segment(siob1.str(), offset, XRAM_SIZE,
     774                            IntTab(cluster_iob1,IOX_IOB1_TGT_ID), false));
     775            }
     776            else                                                     // USE IOB0
    726777            {
    727778                std::ostringstream siob0;
    728779                siob0 << "iox_seg_xram_" << x << "_" << y;
    729                 maptab_iox.add(Segment(siob0.str(), offset, 0x80000000,
     780                maptab_iox.add(Segment(siob0.str(), offset, XRAM_SIZE,
    730781                            IntTab(cluster_iob0,IOX_IOB0_TGT_ID), false));
    731             }
    732             else                // send command to XRAM through IOB1
    733             {
    734                 std::ostringstream siob1;
    735                 siob1 << "iox_seg_xram_" << x << "_" << y;
    736                 maptab_iox.add(Segment(siob1.str(), offset, 0x80000000,
    737                             IntTab(cluster_iob1,IOX_IOB1_TGT_ID), false));
    738782            }
    739783        }
    740784    }
    741     // useful when IOMMU activated
    742     maptab_iox.add(Segment("iox_seg_xram    ", 0xc0000000, 0x40000000,
    743                           IntTab(cluster_iob1,IOX_IOB1_TGT_ID), false));
    744 
    745     // This define the mapping between the initiators (identified by the SRCID)
     785
     786    // This define the mapping between the external initiators (SRCID)
    746787    // and the port index on the IOX local interconnect.
    747     // External initiator have two alias SRCID (iob0 / iob1 access) 
    748 
     788    // If there is more than one cluster, external initiators
     789    // have two alias SRCID (iob0 / iob1 access) 
    749790    maptab_iox.srcid_map( IntTab( cluster_iob0, CDMA_LOCAL_SRCID ),
    750791                          IntTab( cluster_iob0, IOX_CDMA_INI_ID ) );
    751 
    752     maptab_iox.srcid_map( IntTab( cluster_iob1, CDMA_LOCAL_SRCID ),
    753                           IntTab( cluster_iob1, IOX_CDMA_INI_ID ) );
    754 
    755792    maptab_iox.srcid_map( IntTab( cluster_iob0, BDEV_LOCAL_SRCID ),
    756793                          IntTab( cluster_iob0, IOX_BDEV_INI_ID ) );
    757 
    758     maptab_iox.srcid_map( IntTab( cluster_iob1, BDEV_LOCAL_SRCID ),
    759                           IntTab( cluster_iob0, IOX_BDEV_INI_ID ) );
     794    maptab_iox.srcid_map( IntTab( cluster_iob0, IOPI_LOCAL_SRCID ),
     795                          IntTab( cluster_iob0, IOX_IOPI_INI_ID ) );
     796
     797    if ( cluster_iob0 != cluster_iob1 )
     798    {
     799        maptab_iox.srcid_map( IntTab( cluster_iob1, CDMA_LOCAL_SRCID ),
     800                              IntTab( cluster_iob1, IOX_CDMA_INI_ID ) );
     801        maptab_iox.srcid_map( IntTab( cluster_iob1, BDEV_LOCAL_SRCID ),
     802                              IntTab( cluster_iob1, IOX_BDEV_INI_ID ) );
     803        maptab_iox.srcid_map( IntTab( cluster_iob1, BDEV_LOCAL_SRCID ),
     804                              IntTab( cluster_iob1, IOX_IOPI_INI_ID ) );
     805    }
     806
     807    // This define the mapping between the internal initiators (SRCID)
     808    // and the port index on the IOX local interconnect.
     809    // If there is more than one cluster, external initiators
    760810
    761811    for (size_t x = 0; x < XMAX; x++)
     
    763813        for (size_t y = 0; y < YMAX ; y++)
    764814        {
    765             size_t iob = ( x < (XMAX/2) ) ? IOX_IOB0_INI_ID : IOX_IOB1_INI_ID;
    766 
    767             for (size_t p = 0 ; p < NB_PROCS_MAX ; p++)
    768             maptab_iox.srcid_map( IntTab( cluster(x,y), PROC_LOCAL_SRCID + p ),
    769                                   IntTab( cluster(x,y), iob ) );
    770 
    771             maptab_iox.srcid_map( IntTab( cluster(x,y), MDMA_LOCAL_SRCID ),
    772                                   IntTab( cluster(x,y), IOX_IOB0_INI_ID ) );
     815            if ( (cluster_iob0 != cluster_iob1) and (x >= (XMAX/2)) ) // use IOB1
     816            {
     817                for (size_t p = 0 ; p < NB_PROCS_MAX ; p++)
     818                maptab_iox.srcid_map( IntTab( cluster(x,y), PROC_LOCAL_SRCID + p ),
     819                                      IntTab( cluster_iob1, IOX_IOB1_INI_ID ) );
     820
     821                maptab_iox.srcid_map( IntTab( cluster(x,y), MDMA_LOCAL_SRCID ),
     822                                      IntTab( cluster_iob1, IOX_IOB1_INI_ID ) );
     823            }
     824            else                                                      // USE IOB0
     825            {
     826                for (size_t p = 0 ; p < NB_PROCS_MAX ; p++)
     827                maptab_iox.srcid_map( IntTab( cluster(x,y), PROC_LOCAL_SRCID + p ),
     828                                      IntTab( cluster_iob0, IOX_IOB0_INI_ID ) );
     829
     830                maptab_iox.srcid_map( IntTab( cluster(x,y), MDMA_LOCAL_SRCID ),
     831                                      IntTab( cluster_iob0, IOX_IOB0_INI_ID ) );
     832            }
    773833        }
    774834    }
     
    787847    sc_signal<bool>                   signal_irq_mnic_rx[NB_NIC_CHANNELS];
    788848    sc_signal<bool>                   signal_irq_mnic_tx[NB_NIC_CHANNELS];
    789     sc_signal<bool>                   signal_irq_mtty[NB_TTY_CHANNELS];
    790     sc_signal<bool>                   signal_irq_cdma[NB_NIC_CHANNELS*2];
     849    sc_signal<bool>                   signal_irq_mtty_rx[NB_TTY_CHANNELS];
     850//  sc_signal<bool>                   signal_irq_mtty_tx[NB_TTY_CHANNELS];
     851    sc_signal<bool>                   signal_irq_cdma[NB_CMA_CHANNELS];
    791852
    792853    // DSPIN signals for loopback in cluster_iob0 & cluster_iob1
     
    801862    VciSignals<vci_param_ext>         signal_vci_ini_bdev("signal_vci_ini_bdev");
    802863    VciSignals<vci_param_ext>         signal_vci_ini_cdma("signal_vci_ini_cdma");
     864    VciSignals<vci_param_ext>         signal_vci_ini_iopi("signal_vci_ini_iopi");
    803865
    804866    VciSignals<vci_param_ext>         signal_vci_tgt_iob0("signal_vci_tgt_iob0");
     
    810872    VciSignals<vci_param_ext>         signal_vci_tgt_bdev("signal_vci_tgt_bdev");
    811873    VciSignals<vci_param_ext>         signal_vci_tgt_cdma("signal_vci_tgt_cdma");
     874    VciSignals<vci_param_ext>         signal_vci_tgt_iopi("signal_vci_ini_iopi");
    812875
    813876   // Horizontal inter-clusters INT network DSPIN
     
    897960   iox_network = new VciIoxNetwork<vci_param_ext>( "iox_network", 
    898961                                                   maptab_iox,
    899                                                    8,        // number of targets
    900                                                    4 );      // number of initiators
     962                                                   9,        // number of targets
     963                                                   5 );      // number of initiators
    901964   // boot ROM
    902965   VciSimpleRom<vci_param_ext>*  brom;
     
    9501013   {
    9511014      std::ostringstream term_name;
    952       term_name <<  "term" << tid;
    953       vect_names.push_back(term_name.str().c_str());
    954    }
    955    VciMultiTty<vci_param_ext>*  mtty;
    956    mtty = new VciMultiTty<vci_param_ext>( "mtty",
    957                                           IntTab(0, IOX_MTTY_TGT_ID),
    958                                           maptab_iox,
    959                                           vect_names);
     1015         term_name <<  "term" << tid;
     1016         vect_names.push_back(term_name.str().c_str());
     1017      }
     1018      VciMultiTty<vci_param_ext>*  mtty;
     1019      mtty = new VciMultiTty<vci_param_ext>( "mtty",
     1020                                             IntTab(0, IOX_MTTY_TGT_ID),
     1021                                             maptab_iox,
     1022                                             vect_names);
     1023
     1024   // IOPIC
     1025   VciIopic<vci_param_ext>* iopi;
     1026   iopi = new VciIopic<vci_param_ext>( "iopi",
     1027                                       maptab_iox,
     1028                                       IntTab(0, IOPI_LOCAL_SRCID),
     1029                                       IntTab(0, IOX_IOPI_TGT_ID),
     1030                                       32,          // number of input HWI             
     1031                                       5000 );      // period between WTI
    9601032   // Clusters
    9611033   TsarIobCluster<vci_param_int,
     
    10611133    iox_network->p_to_ini[IOX_BDEV_INI_ID]               (signal_vci_ini_bdev);
    10621134    iox_network->p_to_ini[IOX_CDMA_INI_ID]               (signal_vci_ini_cdma);
     1135    iox_network->p_to_ini[IOX_IOPI_INI_ID]               (signal_vci_ini_iopi);
     1136
    10631137    iox_network->p_to_tgt[IOX_IOB0_TGT_ID]               (signal_vci_tgt_iob0);
    10641138    iox_network->p_to_tgt[IOX_IOB1_TGT_ID]               (signal_vci_tgt_iob1);
     
    10691143    iox_network->p_to_tgt[IOX_BDEV_TGT_ID]               (signal_vci_tgt_bdev);
    10701144    iox_network->p_to_tgt[IOX_CDMA_TGT_ID]               (signal_vci_tgt_cdma);
     1145    iox_network->p_to_tgt[IOX_IOPI_TGT_ID]               (signal_vci_tgt_iopi);
    10711146
    10721147    // BDEV connexion
     
    11151190    for ( size_t i=0 ; i<NB_TTY_CHANNELS ; i++ )
    11161191    {
    1117         mtty->p_irq[i]                                     (signal_irq_mtty[i]);
     1192        mtty->p_irq[i]                                     (signal_irq_mtty_rx[i]);
    11181193    }
    11191194
     
    11271202    for ( size_t i=0 ; i<(NB_NIC_CHANNELS*2) ; i++)
    11281203    {
    1129         cdma->p_irq[i]                                   (signal_irq_cdma[i]);
     1204        cdma->p_irq[i]                                 (signal_irq_cdma[i]);
    11301205    }
    11311206
    11321207    std::cout << "  - CDMA connected" << std::endl;
    11331208
    1134     // IRQ connexions from external peripherals (cluster_iob0 only)
    1135     // IRQ_MNIC_RX  -> IRQ[08] to IRQ[09]
    1136     // IRQ_MNIC_TX  -> IRQ[10] to IRQ[11]
    1137     // IRQ_CDMA     -> IRQ[12] to IRQ[15]
    1138     // IRQ_MTTY     -> IRQ[16] to IRQ[30]
    1139     // IRQ_BDEV     -> IRQ[31]
    1140 
    1141     size_t mx = 16 + NB_TTY_CHANNELS;
    1142     for ( size_t n=0 ; n<32 ; n++ )
     1209    // IOPI connexion
     1210    iopi->p_clk                                         (signal_clk);
     1211    iopi->p_resetn                                      (signal_resetn);
     1212    iopi->p_vci_target                                  (signal_vci_tgt_iopi);
     1213    iopi->p_vci_initiator                               (signal_vci_ini_iopi);
     1214    for ( size_t i=0 ; i<32 ; i++)
    11431215    {
    1144         if      ( n < 8  ) (*clusters[0][0]->p_irq[n])       (signal_irq_false);
    1145 
    1146         else if ( n < 10 ) (*clusters[0][0]->p_irq[n])       (signal_irq_false);
    1147 //      else if ( n < 10 ) (*clusters[0][0]->p_irq[n])       (signal_irq_mnic_rx[n-8]);
    1148 
    1149         else if ( n < 12 ) (*clusters[0][0]->p_irq[n])       (signal_irq_false);
    1150 //      else if ( n < 12 ) (*clusters[0][0]->p_irq[n])       (signal_irq_mnic_tx[n-10]);
    1151 
    1152         else if ( n < 16 ) (*clusters[0][0]->p_irq[n])       (signal_irq_false);
    1153 //      else if ( n < 16 ) (*clusters[0][0]->p_irq[n])       (signal_irq_cdma[n-12]);
    1154 
    1155         else if ( n < mx ) (*clusters[0][0]->p_irq[n])       (signal_irq_mtty[n-16]);
    1156         else if ( n < 31 ) (*clusters[0][0]->p_irq[n])       (signal_irq_false);
    1157 
    1158         else               (*clusters[0][0]->p_irq[n])       (signal_irq_bdev);
     1216       if     (i < NB_NIC_CHANNELS)    iopi->p_hwi[i] (signal_irq_mnic_rx[i]);
     1217       else if(i < 2 )                 iopi->p_hwi[i] (signal_irq_false);
     1218       else if(i < 2+NB_NIC_CHANNELS)  iopi->p_hwi[i] (signal_irq_mnic_tx[i-2]);
     1219       else if(i < 4 )                 iopi->p_hwi[i] (signal_irq_false);
     1220       else if(i < 4+NB_CMA_CHANNELS)  iopi->p_hwi[i] (signal_irq_cdma[i-4]);
     1221       else if(i < 8)                  iopi->p_hwi[i] (signal_irq_false);
     1222       else if(i == 8)                 iopi->p_hwi[i] (signal_irq_bdev);
     1223       else if(i < 16)                 iopi->p_hwi[i] (signal_irq_false);
     1224       else if(i < 16+NB_TTY_CHANNELS) iopi->p_hwi[i] (signal_irq_mtty_rx[i-16]);
     1225       else if(i < 24)                 iopi->p_hwi[i] (signal_irq_false);
     1226       else if(i < 24+NB_TTY_CHANNELS) iopi->p_hwi[i] (signal_irq_false);
     1227//     else if(i < 24+NB_TTY_CHANNELS) iopi->p_hwi[i] (signal_irq_mtty_tx[i-24]);
     1228       else                            iopi->p_hwi[i] (signal_irq_false);
    11591229    }
    11601230
     1231    std::cout << "  - IOPIC connected" << std::endl;
     1232
     1233   
    11611234    // IOB0 cluster connexion to IOX network
    1162     (*clusters[0][0]->p_vci_iob_iox_ini)                     (signal_vci_ini_iob0);
    1163     (*clusters[0][0]->p_vci_iob_iox_tgt)                     (signal_vci_tgt_iob0);
    1164 
    1165     // IOB1 cluster connexion to IOX network
    1166     (*clusters[XMAX-1][YMAX-1]->p_vci_iob_iox_ini)           (signal_vci_ini_iob1);
    1167     (*clusters[XMAX-1][YMAX-1]->p_vci_iob_iox_tgt)           (signal_vci_tgt_iob1);
     1235    (*clusters[0][0]->p_vci_iob_iox_ini)               (signal_vci_ini_iob0);
     1236    (*clusters[0][0]->p_vci_iob_iox_tgt)               (signal_vci_tgt_iob0);
     1237
     1238    // IOB1 cluster connexion to IOX network
     1239    // (only when there is more than 1 cluster)
     1240    if ( cluster_iob0 != cluster_iob1 )
     1241    {
     1242        (*clusters[XMAX-1][YMAX-1]->p_vci_iob_iox_ini) (signal_vci_ini_iob1);
     1243        (*clusters[XMAX-1][YMAX-1]->p_vci_iob_iox_tgt) (signal_vci_tgt_iob1);
     1244    }
    11681245
    11691246    // All clusters Clock & RESET connexions
     
    12901367      }
    12911368
    1292       if( y == YMAX-1 )   // handling IOB to RAM network connection in cluster_iob1
     1369      if( (y == YMAX-1) and (cluster_iob0 != cluster_iob1) )  // handling IOB to RAM network connection in cluster_iob1
    12931370      {
    12941371         (*clusters[XMAX-1][YMAX-1]->p_dspin_iob_cmd_out)     (signal_dspin_cmd_iob1_loopback);
     
    13541431   signal_irq_false = false;
    13551432
     1433   // only one cluster case:
     1434   if ( cluster_iob0 == cluster_iob1 )
     1435   {
     1436      signal_vci_ini_iob1.cmdval = false;
     1437      signal_vci_ini_iob1.rspack = true;
     1438      signal_vci_tgt_iob1.cmdack = true;
     1439      signal_vci_tgt_iob1.rspval = false;
     1440   }
     1441     
    13561442   // network boundaries signals
    13571443   for (size_t x = 0; x < XMAX ; x++)
     
    13931479    signal_resetn = true;
    13941480
     1481
     1482    // simulation loop
    13951483    struct timeval t1,t2;
    13961484    gettimeofday(&t1, NULL);
     1485
    13971486    for (size_t n = 1; n < ncycles; n++)
    13981487    {
     
    14851574                smemc_ini << "[SIG]MEMC_INI_" << x << "_" << y;
    14861575                clusters[x][y]->signal_ram_vci_ini_memc.print_trace(smemc_ini.str());
     1576
    14871577                clusters[x][y]->xram->print_trace();
    14881578                std::ostringstream sxram_tgt;
     
    14911581            }
    14921582
    1493             // trace RAM network routers
    1494 //          for( size_t cluster = 0 ; cluster < XMAX*YMAX ; cluster++ )
    1495 //          {
    1496 //              size_t x = cluster / YMAX;
    1497 //              size_t y = cluster % YMAX;
    1498 //              clusters[x][y]->ram_router_cmd->print_trace();
    1499 //              clusters[x][y]->ram_router_rsp->print_trace();
    1500 //          }
     1583
     1584            // trace XRAM and XRAM network routers in cluster[debug_xram_id]
     1585            if ( debug_xram_id != 0xFFFFFFFF )
     1586            {
     1587                size_t x = debug_xram_id >> 4;
     1588                size_t y = debug_xram_id & 0xF;
     1589           
     1590                clusters[x][y]->xram->print_trace();
     1591                std::ostringstream sxram_tgt;
     1592                sxram_tgt << "[SIG]XRAM_TGT_" << x << "_" << y;
     1593                clusters[x][y]->signal_ram_vci_tgt_xram.print_trace(sxram_tgt.str());
     1594
     1595                clusters[x][y]->ram_router_cmd->print_trace();
     1596                clusters[x][y]->ram_router_rsp->print_trace();
     1597            }
    15011598       
    15021599            // trace iob, iox and external peripherals 
     
    15141611//              signal_dspin_rsp_iob0_loopback.print_trace("[SIG]IOB0_RSP_LOOPBACK");
    15151612
    1516                 cdma->print_trace();
    1517                 signal_vci_tgt_cdma.print_trace("[SIG]IOX_CDMA_TGT");
    1518                 signal_vci_ini_cdma.print_trace("[SIG]IOX_CDMA_INI");
    1519 
    1520 //              brom->print_trace();
    1521 //              signal_vci_tgt_brom.print_trace("[SIG]IOX_BROM_TGT");
     1613//              cdma->print_trace();
     1614//              signal_vci_tgt_cdma.print_trace("[SIG]IOX_CDMA_TGT");
     1615//              signal_vci_ini_cdma.print_trace("[SIG]IOX_CDMA_INI");
     1616
     1617                brom->print_trace();
     1618                signal_vci_tgt_brom.print_trace("[SIG]IOX_BROM_TGT");
    15221619
    15231620//              mtty->print_trace();
    15241621//              signal_vci_tgt_mtty.print_trace("[SIG]IOX_MTTY_TGT");
    15251622
    1526 //              bdev->print_trace();
    1527 //              signal_vci_tgt_bdev.print_trace("[SIG]IOX_BDEV_TGT");
    1528 //              signal_vci_ini_bdev.print_trace("[SIG]IOX_BDEV_INI");
     1623                bdev->print_trace();
     1624                signal_vci_tgt_bdev.print_trace("[SIG]BDEV_TGT");
     1625                signal_vci_ini_bdev.print_trace("[SIG]BDEV_INI");
    15291626
    15301627//              fbuf->print_trace();
    15311628//              signal_vci_tgt_fbuf.print_trace("[SIG]FBUF");
    15321629
     1630                iopi->print_trace();
     1631                signal_vci_ini_iopi.print_trace("[SIG]IOPI_INI");
     1632                signal_vci_tgt_iopi.print_trace("[SIG]IOPI_TGT");
    15331633                iox_network->print_trace();
    15341634
    15351635                // interrupts
    1536                 if (signal_irq_bdev) std::cout << "### IRQ_BDEV ACTIVATED" << std::endl;
     1636                if (signal_irq_bdev)       std::cout << "### IRQ_BDEV ACTIVE" << std::endl;
     1637                if (signal_irq_mtty_rx[0]) std::cout << "### IRQ_MTTY ACTIVE" << std::endl;
    15371638            }
    15381639        }
  • trunk/platforms/tsar_generic_iob/top.desc

    r450 r707  
    6464                  cell_size = vci_cell_size_ext),
    6565
     66            # IOPIC
     67            Uses('caba:vci_iopic',
     68                  cell_size = vci_cell_size_ext),
     69
    6670                Uses('common:elf_file_loader'),
    6771            Uses('common:plain_file_loader'),
  • trunk/platforms/tsar_generic_iob/tsar_iob_cluster/caba/source/include/tsar_iob_cluster.h

    r693 r707  
    6161    soclib::caba::DspinInput<dspin_ram_rsp_width>*     p_dspin_iob_rsp_in; 
    6262
    63     // These ports are used to connect hard IRQ from external peripherals to IOB0
    64     sc_in<bool>*                                       p_irq[32];
    65 
    6663    // These arrays of ports are used to connect the INT & RAM networks in top cell
    6764    soclib::caba::DspinOutput<dspin_int_cmd_width>**   p_dspin_int_cmd_out;
  • trunk/platforms/tsar_generic_iob/tsar_iob_cluster/caba/source/src/tsar_iob_cluster.cpp

    r693 r707  
    110110        p_dspin_iob_cmd_out = new soclib::caba::DspinOutput<dspin_ram_cmd_width>;
    111111        p_dspin_iob_rsp_in  = new soclib::caba::DspinInput<dspin_ram_rsp_width>;
    112     }
    113 
    114     // IRQ ports in cluster_iob0 only
    115     if ( cluster_id == cluster_iob0 )
    116     {
    117         for ( size_t n=0 ; n<32 ; n++ ) p_irq[n] = new sc_in<bool>;
    118112    }
    119113
     
    192186                     32,                                // number of hard IRQs
    193187                     32,                                // number of soft IRQs
    194                      nb_procs);                         // number of output IRQs
     188                     32);                               // number of output IRQs
    195189
    196190    ////////////  MDMA
     
    241235                     s_int_dspin_tgt_wrapper_gate_d.str().c_str(),
    242236                     x_width + y_width + l_width);
    243 
    244237
    245238    ////////////  Coherence LOCAL_XBAR(S)
     
    283276                     1, 1,                         // fifo depths
    284277                     true,                         // CMD
    285                      false,                        // don't use local routing table
     278                     false,                        // no routing table
    286279                     false);                       // broadcast
    287280
     
    359352        size_t iox_local_id;
    360353        size_t global_id;
    361         bool   has_irqs;
    362354        if ( cluster_id == cluster_iob0 )
    363355        {
    364356            iox_local_id = 0;
    365357            global_id    = cluster_iob0;
    366             has_irqs     = true;
    367358        }
    368359        else
     
    370361            iox_local_id = 1;
    371362            global_id    = cluster_iob1;
    372             has_irqs     = false;
    373363        }
    374364
     
    384374                     IntTab( global_id, iobx_int_srcid ),  // INT SRCID
    385375                     IntTab( global_id, iox_local_id   ),  // IOX TGTID
    386                      has_irqs,
    387376                     16,                                   // cache line words
    388377                     8,                                    // IOTLB ways
     
    511500        proc[p]->p_dspin_p2m                     (signal_int_dspin_p2m_proc[p]);
    512501        proc[p]->p_dspin_clack                   (signal_int_dspin_clack_proc[p]);
    513         proc[p]->p_irq[0]                        (signal_proc_it[p]);
    514         for ( size_t j = 1 ; j < 6 ; j++)
     502
     503        for ( size_t j = 0 ; j < 6 ; j++)
    515504        {
    516             proc[p]->p_irq[j]                    (signal_false);
     505            if ( j < 4 ) proc[p]->p_irq[j]       (signal_proc_it[4*p + j]);
     506            else         proc[p]->p_irq[j]       (signal_false);
    517507        }
    518508    }
     
    522512    xicu->p_resetn                               (this->p_resetn);
    523513    xicu->p_vci                                  (signal_int_vci_tgt_xicu);
    524     for ( size_t p=0 ; p<nb_procs ; p++)
     514    for ( size_t p=0 ; p < 32 ; p++)
    525515    {
    526516        xicu->p_irq[p]                           (signal_proc_it[p]);
     
    528518    for ( size_t i=0 ; i<32 ; i++)
    529519    {
    530         if (cluster_id == cluster_iob0)
    531             xicu->p_hwi[i]                       (*(this->p_irq[i]));
    532         else 
    533             xicu->p_hwi[i]                       (signal_false);
     520        if      ( i == 0 )       xicu->p_hwi[i]  (signal_irq_memc);
     521        else if ( i <= nb_dmas ) xicu->p_hwi[i]  (signal_irq_mdma[i-1]);
     522        else                     xicu->p_hwi[i]  (signal_false);
    534523    }                     
    535524
     
    572561
    573562    //////////////////////////// RAM network CMD & RSP routers
    574     ram_router_cmd->p_clk                    (this->p_clk);
    575     ram_router_cmd->p_resetn                 (this->p_resetn);
    576     ram_router_rsp->p_clk                    (this->p_clk);
    577     ram_router_rsp->p_resetn                 (this->p_resetn);
     563    ram_router_cmd->p_clk                        (this->p_clk);
     564    ram_router_cmd->p_resetn                     (this->p_resetn);
     565    ram_router_rsp->p_clk                        (this->p_clk);
     566    ram_router_rsp->p_resetn                     (this->p_resetn);
    578567    for( size_t n=0 ; n<4 ; n++)
    579568    {
    580         ram_router_cmd->p_out[n]             (this->p_dspin_ram_cmd_out[n]);
    581         ram_router_cmd->p_in[n]              (this->p_dspin_ram_cmd_in[n]);
    582         ram_router_rsp->p_out[n]             (this->p_dspin_ram_rsp_out[n]);
    583         ram_router_rsp->p_in[n]              (this->p_dspin_ram_rsp_in[n]);
    584     }
    585     ram_router_cmd->p_out[4]                 (signal_ram_dspin_cmd_xram_t);
    586     ram_router_cmd->p_in[4]                  (signal_ram_dspin_cmd_memc_i);
    587     ram_router_rsp->p_out[4]                 (signal_ram_dspin_rsp_memc_i);
    588     ram_router_rsp->p_in[4]                  (signal_ram_dspin_rsp_xram_t);
     569        ram_router_cmd->p_out[n]                 (this->p_dspin_ram_cmd_out[n]);
     570        ram_router_cmd->p_in[n]                  (this->p_dspin_ram_cmd_in[n]);
     571        ram_router_rsp->p_out[n]                 (this->p_dspin_ram_rsp_out[n]);
     572        ram_router_rsp->p_in[n]                  (this->p_dspin_ram_rsp_in[n]);
     573    }
     574    ram_router_cmd->p_out[4]                     (signal_ram_dspin_cmd_xram_t);
     575    ram_router_cmd->p_in[4]                      (signal_ram_dspin_cmd_memc_i);
     576    ram_router_rsp->p_out[4]                     (signal_ram_dspin_rsp_memc_i);
     577    ram_router_rsp->p_in[4]                      (signal_ram_dspin_rsp_xram_t);
    589578   
    590579    ///////////////////////// IOB exists only in cluster_iob0 & cluster_iob1.
     
    600589        iob->p_vci_ini_ram                       (signal_ram_vci_ini_iobx);
    601590
    602         if ( cluster_id == cluster_iob0 )
    603                for ( size_t n=0 ; n<32 ; n++ )
    604                    (*iob->p_irq[n])                 (*(this->p_irq[n]));
    605 
    606591        // initiator wrapper to RAM network
    607592        iob_ram_wi->p_clk                        (this->p_clk);
Note: See TracChangeset for help on using the changeset viewer.