Changeset 717 for branches/fault_tolerance/platform/tsar_generic_iob/tsar_iob_cluster/caba/source/src/tsar_iob_cluster.cpp
- Timestamp:
- Jun 23, 2014, 4:02:53 PM (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/fault_tolerance/platform/tsar_generic_iob/tsar_iob_cluster/caba/source/src/tsar_iob_cluster.cpp
r696 r717 9 9 // Modified on: mars 2014 10 10 ////////////////////////////////////////////////////////////////////////////// 11 // Cluster(0,0) & Cluster(xmax-1,ymax-1) contains the IOB0 & IOB1 components.12 // These twoclusters contain 6 extra components:13 // - 1 vci_io_bridge (connected to the 3 networks .11 // IO clusters contains the IOB component. 12 // These clusters contain 6 extra components: 13 // - 1 vci_io_bridge (connected to the 3 networks). 14 14 // - 3 vci_dspin_wrapper for the IOB. 15 15 // - 2 dspin_local_crossbar for commands and responses. … … 39 39 assert((params.x_id < X_MAX) && (params.y_id < Y_MAX)); 40 40 41 size_t cid = this->clusterId(params.x_id, params.y_id); 42 size_t cluster_iob0 = this->clusterId(0, 0); 43 size_t cluster_iob1 = this->clusterId(X_SIZE - 1, Y_SIZE - 1); 44 size_t is_iob0 = (cid == cluster_iob0); 45 size_t is_iob1 = (cid == cluster_iob1); 46 bool is_io_cluster = is_iob0 || is_iob1; 47 41 size_t cid = this->clusterId(params.x_id, params.y_id); 48 42 size_t l_width = vci_param_int::S - X_WIDTH - Y_WIDTH; 49 43 … … 67 61 alloc_elems<DspinOutput<dspin_ram_rsp_width> >("p_ext_rsp_out", 4); 68 62 69 // ports in cluster_iob0 and cluster_iob1only63 // ports in IO clusters only 70 64 p_vci_iob_iox_ini = NULL; 71 65 p_vci_iob_iox_tgt = NULL; 72 p_dspin_iob_cmd_out = NULL;73 p_dspin_iob_rsp_in = NULL;74 if ( is_io_cluster ) { 66 if ( params.is_io ) { 67 std::cout << " Creating signals for IOB" << std::endl; 68 75 69 // VCI ports from IOB to IOX network 76 70 p_vci_iob_iox_ini = new soclib::caba::VciInitiator<vci_param_ext>; 77 71 p_vci_iob_iox_tgt = new soclib::caba::VciTarget<vci_param_ext>; 78 79 // DSPIN ports from IOB to RAM network80 p_dspin_iob_cmd_out = new soclib::caba::DspinOutput<dspin_ram_cmd_width>;81 p_dspin_iob_rsp_in = new soclib::caba::DspinInput<dspin_ram_rsp_width>;82 }83 84 // IRQ ports in cluster_iob0 only85 for ( size_t n = 0 ; n < 32 ; n++ ) {86 p_irq[n] = ( is_iob0 ) ? new sc_in<bool> : NULL;87 72 } 88 73 … … 110 95 params.debug_start_cycle, params.proc_debug_ok); 111 96 112 proc[p]->set_dcache_paddr_ext_reset(cid); 113 proc[p]->set_icache_paddr_ext_reset(cid); 97 // Physical address extention register is initialized with local cluster 98 // ID when distributed boot is activated. 99 if (params.distboot) { 100 proc[p]->set_dcache_paddr_ext_reset(cid); 101 proc[p]->set_icache_paddr_ext_reset(cid); 102 } 114 103 } 115 104 … … 149 138 150 139 // Multi-TTY controller 151 mtty 140 mtty = NULL; 152 141 if (NB_DEBUG_TTY_CHANNELS) { 153 142 assert(NB_DEBUG_TTY_CHANNELS < 8); … … 175 164 params.mt_int, 176 165 IntTab(cid, INT_XICU_TGT_ID), 177 32, 32, 32,178 NB_PROCS );166 32, 1, 32, 167 NB_PROCS * IRQ_PER_PROCESSOR); 179 168 180 169 //////////// MDMA … … 195 184 nb_direct_targets++; 196 185 } 197 if ( is_io_cluster) {186 if ( params.is_io ) { 198 187 nb_direct_initiators++; 199 188 nb_direct_targets++; … … 306 295 std::ostringstream s_ram_router_cmd; 307 296 s_ram_router_cmd << "ram_router_cmd_" << params.x_id << "_" << params.y_id; 308 ram_router_cmd = new DspinRouter Tsar<dspin_ram_cmd_width>(297 ram_router_cmd = new DspinRouter<dspin_ram_cmd_width>( 309 298 s_ram_router_cmd.str().c_str(), 310 299 params.x_id, params.y_id, 311 300 X_WIDTH, Y_WIDTH, 312 4, 4, 313 is_iob0, is_iob1, 314 false, 315 l_width); 301 4, 4); 316 302 317 303 std::ostringstream s_ram_router_rsp; 318 304 s_ram_router_rsp << "ram_router_rsp_" << params.x_id << "_" << params.y_id; 319 ram_router_rsp = new DspinRouter Tsar<dspin_ram_rsp_width>(305 ram_router_rsp = new DspinRouter<dspin_ram_rsp_width>( 320 306 s_ram_router_rsp.str().c_str(), 321 307 params.x_id, params.y_id, 322 308 X_WIDTH, Y_WIDTH, 323 4, 4, 324 is_iob0, is_iob1, 325 true, 326 l_width); 309 4, 4); 327 310 328 311 ////////////////////// I/O CLUSTER ONLY /////////////////////// 329 312 iob = NULL; 330 313 iob_ram_wi = NULL; 331 if ( is_io_cluster) {314 if ( params.is_io ) { 332 315 /////////// IO_BRIDGE 333 size_t iox_local_id;334 bool has_irqs;335 if ( is_iob0 ) {336 iox_local_id = 0;337 has_irqs = true;338 }339 else {340 iox_local_id = 1;341 has_irqs = false;342 }343 344 316 std::ostringstream s_iob; 345 317 s_iob << "iob_" << params.x_id << "_" << params.y_id; … … 351 323 IntTab(cid, INT_IOBX_TGT_ID), 352 324 IntTab(cid, INT_IOBX_INI_ID), 353 IntTab(cid, iox_local_id ),354 has_irqs,325 params.iox_iob_tgtid, 326 params.iox_iob_srcid, 355 327 16, 356 328 8, … … 364 336 s_iob_ram_wi.str().c_str(), 365 337 vci_param_int::S); 338 339 std::ostringstream s_ram_xbar_cmd; 340 s_ram_xbar_cmd << "s_ram_xbar_cmd_" << params.x_id << "_" << params.y_id; 341 ram_xbar_cmd = new DspinLocalCrossbar<dspin_ram_cmd_width>( 342 s_ram_xbar_cmd.str().c_str(), // name 343 params.mt_ext, // mapping table 344 params.x_id, params.y_id, // x, y 345 X_WIDTH, Y_WIDTH, l_width, // x_width, y_width, l_width 346 2, 0, // local inputs, local outputs 347 2, 2, // in fifo, out fifo depths 348 true, // is cmd ? 349 false, // use routing table ? 350 false); // support broadcast ? 351 352 std::ostringstream s_ram_xbar_rsp; 353 s_ram_xbar_rsp << "s_ram_xbar_rsp_" << params.x_id << "_" << params.y_id; 354 ram_xbar_rsp = new DspinLocalCrossbar<dspin_ram_rsp_width>( 355 s_ram_xbar_rsp.str().c_str(), // name 356 params.mt_ext, // mapping table 357 params.x_id, params.y_id, // x, y 358 X_WIDTH, Y_WIDTH, l_width, // x_width, y_width, l_width 359 0, 2, // local inputs, local outputs 360 2, 2, // in fifo, out fifo depths 361 false, // is cmd ? 362 true, // use routing table ? 363 false); // support broadcast ? 366 364 } 367 365 … … 372 370 // on coherence network : local srcid[proc] in [0...NB_PROCS-1] 373 371 // : local srcid[memc] = NB_PROCS 374 // In cluster_iob0, 32 HWI interrupts from external peripherals375 // are connected to the XICU ports p_hwi[0:31]376 // In other clusters, no HWI interrupts are connected to XICU377 372 378 373 //////////////////////// internal CMD & RSP routers … … 425 420 } 426 421 427 if ( is_io_cluster) {422 if ( params.is_io ) { 428 423 int_xbar_d->p_to_target[INT_IOBX_TGT_ID] (signal_int_vci_tgt_iobx); 429 424 int_xbar_d->p_to_initiator[INT_IOBX_INI_ID] (signal_int_vci_ini_iobx); … … 480 475 proc[p]->p_dspin_p2m (signal_int_dspin_p2m_proc[p]); 481 476 proc[p]->p_dspin_clack (signal_int_dspin_clack_proc[p]); 482 proc[p]->p_irq[0] (signal_proc_it[p]); 483 for ( size_t j = 1 ; j < 6 ; j++) { 484 proc[p]->p_irq[j] (signal_false); 477 for ( size_t j = 0 ; j < 6 ; j++) { 478 if ( j < IRQ_PER_PROCESSOR ) { 479 proc[p]->p_irq[j] (signal_proc_it[IRQ_PER_PROCESSOR * p + j]); 480 } 481 else { 482 proc[p]->p_irq[j] (signal_false); 483 } 485 484 } 486 485 } … … 490 489 xicu->p_resetn (this->p_resetn); 491 490 xicu->p_vci (signal_int_vci_tgt_xicu); 492 for ( size_t p = 0 ; p < NB_PROCS ; p++) { 493 xicu->p_irq[p] (signal_proc_it[p]); 494 } 495 for ( size_t i=0 ; i<32 ; i++) { 496 if ( is_iob0 ) 497 xicu->p_hwi[i] (*(this->p_irq[i])); 498 else 499 xicu->p_hwi[i] (signal_false); 500 } 491 for ( size_t irq = 0 ; irq < (IRQ_PER_PROCESSOR * NB_PROCS) ; irq++) { 492 xicu->p_irq[irq] (signal_proc_it[irq]); 493 } 494 xicu->p_hwi[0] (signal_irq_memc); 501 495 502 496 ///////////////////////////////////// MEMC … … 564 558 ram_router_rsp->p_in[n] (this->p_dspin_ram_rsp_in[n]); 565 559 } 566 ram_router_cmd->p_out[4] (signal_ram_dspin_cmd_xram_t); 567 ram_router_cmd->p_in[4] (signal_ram_dspin_cmd_memc_i); 568 ram_router_rsp->p_out[4] (signal_ram_dspin_rsp_memc_i); 569 ram_router_rsp->p_in[4] (signal_ram_dspin_rsp_xram_t); 570 571 ///////////////////////// IOB exists only in cluster_iob0 & cluster_iob1. 572 if ( is_io_cluster ) { 560 561 ram_router_cmd->p_out[4] (signal_ram_dspin_cmd_xram_t); 562 if (params.is_io) ram_router_cmd->p_in[4] (signal_ram_dspin_cmd_xbar); 563 else ram_router_cmd->p_in[4] (signal_ram_dspin_cmd_memc_i); 564 565 ram_router_rsp->p_in[4] (signal_ram_dspin_rsp_xram_t); 566 if (params.is_io) ram_router_rsp->p_out[4] (signal_ram_dspin_rsp_xbar); 567 else ram_router_rsp->p_out[4] (signal_ram_dspin_rsp_memc_i); 568 569 ///////////////////////// IOB exists only in IO clusters. 570 if ( params.is_io ) { 573 571 // IO bridge 574 572 iob->p_clk (this->p_clk); … … 580 578 iob->p_vci_ini_ram (signal_ram_vci_ini_iobx); 581 579 582 if ( is_iob0 ) {583 for ( size_t n = 0 ; n < 32 ; n++ ) {584 (*iob->p_irq[n]) (*(this->p_irq[n]));585 }586 }587 588 580 // initiator wrapper to RAM network 589 iob_ram_wi->p_clk (this->p_clk); 590 iob_ram_wi->p_resetn (this->p_resetn); 591 iob_ram_wi->p_dspin_cmd (*(this->p_dspin_iob_cmd_out)); 592 iob_ram_wi->p_dspin_rsp (*(this->p_dspin_iob_rsp_in)); 593 iob_ram_wi->p_vci (signal_ram_vci_ini_iobx); 594 } 581 iob_ram_wi->p_clk (this->p_clk); 582 iob_ram_wi->p_resetn (this->p_resetn); 583 iob_ram_wi->p_dspin_cmd (signal_ram_dspin_cmd_iob_i); 584 iob_ram_wi->p_dspin_rsp (signal_ram_dspin_rsp_iob_i); 585 iob_ram_wi->p_vci (signal_ram_vci_ini_iobx); 586 587 ram_xbar_cmd->p_clk (this->p_clk); 588 ram_xbar_cmd->p_resetn (this->p_resetn); 589 ram_xbar_cmd->p_global_out (signal_ram_dspin_cmd_xbar); 590 ram_xbar_cmd->p_global_in (signal_ram_dspin_cmd_false); 591 ram_xbar_cmd->p_local_in[0] (signal_ram_dspin_cmd_memc_i); 592 ram_xbar_cmd->p_local_in[1] (signal_ram_dspin_cmd_iob_i); 593 594 ram_xbar_rsp->p_clk (this->p_clk); 595 ram_xbar_rsp->p_resetn (this->p_resetn); 596 ram_xbar_rsp->p_global_out (signal_ram_dspin_rsp_false); 597 ram_xbar_rsp->p_global_in (signal_ram_dspin_rsp_xbar); 598 ram_xbar_rsp->p_local_out[0] (signal_ram_dspin_rsp_memc_i); 599 ram_xbar_rsp->p_local_out[1] (signal_ram_dspin_rsp_iob_i); 600 } 601 602 SC_METHOD(init); 595 603 } // end constructor 604 605 tmpl(void)::init() { 606 signal_ram_dspin_cmd_false.write = false; 607 signal_ram_dspin_cmd_false.read = true; 608 signal_ram_dspin_rsp_false.write = false; 609 signal_ram_dspin_rsp_false.read = true; 610 } 596 611 597 612 tmpl(/**/)::~TsarIobCluster() { 598 613 if (p_vci_iob_iox_ini) delete p_vci_iob_iox_ini; 599 614 if (p_vci_iob_iox_tgt) delete p_vci_iob_iox_tgt; 600 if (p_dspin_iob_cmd_out) delete p_dspin_iob_cmd_out;601 if (p_dspin_iob_rsp_in) delete p_dspin_iob_rsp_in;602 615 if (iob) delete iob; 603 616 if (iob_ram_wi) delete iob_ram_wi; 604 605 for (size_t n = 0 ; n < 32 ; n++) {606 if (p_irq[n]) delete p_irq[n];607 }608 617 609 618 for (size_t p = 0; p < NB_PROCS; p++) { … … 627 636 delete ram_router_cmd; 628 637 delete ram_router_rsp; 638 delete ram_xbar_cmd; 639 delete ram_xbar_rsp; 629 640 } 630 641
Note: See TracChangeset
for help on using the changeset viewer.