Ignore:
Timestamp:
Jul 18, 2013, 6:46:58 PM (11 years ago)
Author:
alain
Message:

Introducing the vci_iox_network modeling the external IO network.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/modules/vci_io_bridge/caba/source/src/vci_io_bridge.cpp

    r434 r451  
    12141214    // This FSM is mainly intended to handle single flit config transactions,
    12151215    // but it can also handle software driven, multi-flits data transactions.
    1216     // - The configuration requests can be local (IO_BRIDGE config registers)
    1217     //   or remote (config registers of peripherals on IOX network).
    1218     // - The data requests are always remote.
    1219     // In case of local config, this FSM put a VCI response in CONFIG_RSP fifo.
    1220     // In case of remote transaction, it put the VCI command in CONFIG_CMD fifo.
     1216    // The configuration requests can be local (IO_BRIDGE config registers)
     1217    // or remote (config registers of peripherals on IOX network).
     1218    // - The local configuration segment is identified by the "special" atribute.
     1219    // - All configuration requests are checkeg against segmentation violation.
     1220    // - In case of local config request, or in case of segmentation violation,
     1221    //   the FSM put a VCI response request in CONFIG_RSP fifo.
     1222    // - In case of remote transaction, it put the VCI command in CONFIG_CMD fifo.
    12211223    ///////////////////////////////////////////////////////////////////////////////
    12221224
     
    12441246            uint32_t   cell  = (uint32_t)((paddr & 0x1FF)>>2);
    12451247 
    1246             // The "local" segment must be the first in the seglist
    1247             soclib::common::Segment seg = m_int_seglist.front();
     1248            // chek segments
     1249            std::list<soclib::common::Segment>::iterator seg;
     1250            bool found = false;
     1251            for ( seg = m_int_seglist.begin() ;
     1252                  seg != m_int_seglist.end() and not found ; seg++ )
     1253            {
     1254                if ( seg->contains(paddr) )  found = true;
     1255            }
    12481256           
    1249             if ( seg.contains(paddr) )  // IO_BRIDGE itself
     1257            if ( found and seg->special() )  // IO_BRIDGE itself
    12501258            {
    12511259                uint32_t      rdata  = 0;
     
    13251333                    rerror = true;
    13261334                }
    1327                 r_config_cmd_rdata  = rdata;
     1335                r_config_cmd_rdata = rdata;
    13281336                r_config_cmd_error = rerror;
    1329                 r_config_cmd_fsm    = CONFIG_CMD_FIFO_PUT_RSP;
    1330             }
    1331             else                                        // remote peripheral
     1337                r_config_cmd_fsm   = CONFIG_CMD_FIFO_PUT_RSP;
     1338            }
     1339            else if ( found )                            // remote peripheral
    13321340            {
    13331341                r_config_cmd_fsm  = CONFIG_CMD_FIFO_PUT_CMD;
     1342            }
     1343            else                                         // out of segment
     1344            {
     1345                r_config_cmd_rdata = 0;
     1346                r_config_cmd_error = true;
     1347                r_config_cmd_fsm   = CONFIG_CMD_FIFO_PUT_RSP;
    13341348            }
    13351349        } // end if cmdval
Note: See TracChangeset for help on using the changeset viewer.