Changeset 1048 for trunk/platforms/tsar_generic_xbar/top.cpp
- Timestamp:
- Feb 16, 2017, 3:51:52 PM (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/platforms/tsar_generic_xbar/top.cpp
r1023 r1048 95 95 96 96 #define USE_ALMOS 1 97 //#define USE_GIET 98 99 #ifdef USE_ALMOS 100 #ifdef USE_GIET 101 #error "Can't use Two different OS" 102 #endif 103 #endif 104 105 #ifndef USE_ALMOS 106 #ifndef USE_GIET 107 #error "You need to specify one OS" 108 #endif 109 #endif 97 110 98 111 99 #ifdef USE_ALMOS … … 113 101 #include "almos/hard_config.h" 114 102 #endif 115 #ifdef USE_GIET116 #define PREFIX_OS "giet_vm/"117 #endif118 103 119 104 /////////////////////////////////////////////////// … … 122 107 123 108 124 #if USE_OPENMP125 #include <omp.h>109 #ifdef USE_OPENMP 110 #include <omp.h> 126 111 #endif 127 112 … … 152 137 #ifdef USE_ALMOS 153 138 #define vci_address_width 32 154 #endif155 #ifdef USE_GIET156 #define vci_address_width 40157 139 #endif 158 140 #define vci_plen_width 8 … … 185 167 #define FBUF_Y_SIZE 1024 186 168 #endif 187 #ifdef USE_GIET 188 #define FBUF_X_SIZE 128 189 #define FBUF_Y_SIZE 128 190 #endif 191 192 #ifdef USE_GIET 193 #define BDEV_SECTOR_SIZE 512 194 #define BDEV_IMAGE_NAME PREFIX_OS"display/images.raw" 195 #endif 169 196 170 #ifdef USE_ALMOS 197 171 #define BDEV_SECTOR_SIZE 4096 … … 214 188 #ifdef USE_ALMOS 215 189 #define soft_name PREFIX_OS"preloader.elf" 216 #endif217 #ifdef USE_GIET218 #define soft_pathname PREFIX_OS"soft.elf"219 190 #endif 220 191 … … 244 215 #endif 245 216 246 #ifdef USE_ALMOS247 // 2^19 is the offset for the local id (8 bits for global ID :248 // 1 bit for Memcache or Peripheral, 4 for local peripheral id)249 // (Almos supports 32 bits physical addresses)250 #endif251 252 217 bool stop_called = false; 218 219 using namespace sc_core; 220 using namespace soclib::caba; 221 using namespace soclib::common; 253 222 254 223 ///////////////////////////////// 255 224 int _main(int argc, char *argv[]) 256 225 { 257 using namespace sc_core; 258 using namespace soclib::caba; 259 using namespace soclib::common; 260 261 const int64_t max_cycles = 5000000; // Maximum number of cycles simulated in one sc_start call 262 int64_t ncycles = 0x7FFFFFFFFFFFFFFF; // simulated cycles 263 char disk_name[256] = BDEV_IMAGE_NAME; // pathname to the disk image 264 char nic_rx_name[256] = NIC_RX_NAME; // pathname to the rx packets file 265 char nic_tx_name[256] = NIC_TX_NAME; // pathname to the tx packets file 266 ssize_t threads_nr = 1; // simulator's threads number 267 bool debug_ok = false; // trace activated 268 size_t debug_period = 1; // trace period 269 size_t debug_memc_id = 0; // index of memc to be traced 270 size_t debug_proc_id = 0; // index of proc to be traced 271 int64_t debug_from = 0; // trace start cycle 272 int64_t frozen_cycles = MAX_FROZEN_CYCLES; // monitoring frozen processor 273 int64_t reset_counters = -1; 274 int64_t dump_counters = -1; 275 bool do_reset_counters = false; 276 bool do_dump_counters = false; 277 struct timeval t1, t2; 278 uint64_t ms1, ms2; 279 280 ////////////// command line arguments ////////////////////// 281 if (argc > 1) { 282 for (int n = 1; n < argc; n = n + 2) { 283 if ((strcmp(argv[n], "-NCYCLES") == 0) && (n + 1 < argc)) { 284 ncycles = (int64_t) strtol(argv[n + 1], NULL, 0); 285 } 286 else if ((strcmp(argv[n], "-SOFT") == 0) && (n + 1 < argc)) { 226 227 const int64_t max_cycles = 5000000; // Maximum number of cycles simulated in one sc_start call 228 int64_t ncycles = 0x7FFFFFFFFFFFFFFF; // simulated cycles 229 char disk_name[256] = BDEV_IMAGE_NAME; // pathname to the disk image 230 char nic_rx_name[256] = NIC_RX_NAME; // pathname to the rx packets file 231 char nic_tx_name[256] = NIC_TX_NAME; // pathname to the tx packets file 232 ssize_t threads_nr = 1; // simulator's threads number 233 bool debug_ok = false; // trace activated 234 size_t debug_period = 1; // trace period 235 size_t debug_memc_id = 0; // index of memc to be traced 236 size_t debug_proc_id = 0; // index of proc to be traced 237 int64_t debug_from = 0; // trace start cycle 238 int64_t frozen_cycles = MAX_FROZEN_CYCLES; // monitoring frozen processor 239 int64_t reset_counters = -1; 240 int64_t dump_counters = -1; 241 bool do_reset_counters = false; 242 bool do_dump_counters = false; 243 struct timeval t1, t2; 244 uint64_t ms1, ms2; 245 246 ////////////// command line arguments ////////////////////// 247 if (argc > 1) { 248 for (int n = 1; n < argc; n = n + 2) { 249 if ((strcmp(argv[n], "-NCYCLES") == 0) && (n + 1 < argc)) { 250 ncycles = (int64_t) strtol(argv[n + 1], NULL, 0); 251 } 252 else if ((strcmp(argv[n], "-SOFT") == 0) && (n + 1 < argc)) { 287 253 #ifdef USE_ALMOS 288 assert( 0 && "Can't define almos soft name" ); 289 #endif 290 #ifdef USE_GIET 291 strcpy(soft_name, argv[n + 1]); 292 #endif 293 } 294 else if ((strcmp(argv[n],"-DISK") == 0) && (n + 1 < argc)) { 295 strcpy(disk_name, argv[n + 1]); 296 } 297 else if ((strcmp(argv[n],"-DEBUG") == 0) && (n + 1 < argc)) { 298 debug_ok = true; 299 debug_from = (int64_t) strtol(argv[n + 1], NULL, 0); 300 } 301 else if ((strcmp(argv[n], "-MEMCID") == 0) && (n + 1 < argc)) { 302 debug_memc_id = (size_t) strtol(argv[n + 1], NULL, 0); 254 assert( 0 && "Can't define almos soft name" ); 255 #endif 256 } 257 else if ((strcmp(argv[n],"-DISK") == 0) && (n + 1 < argc)) { 258 strcpy(disk_name, argv[n + 1]); 259 } 260 else if ((strcmp(argv[n],"-DEBUG") == 0) && (n + 1 < argc)) { 261 debug_ok = true; 262 debug_from = (int64_t) strtol(argv[n + 1], NULL, 0); 263 } 264 else if ((strcmp(argv[n], "-MEMCID") == 0) && (n + 1 < argc)) { 265 debug_memc_id = (size_t) strtol(argv[n + 1], NULL, 0); 303 266 #ifdef USE_ALMOS 304 assert((debug_memc_id < (X_SIZE * Y_SIZE)) &&305 "debug_memc_id larger than X_SIZE * Y_SIZE" );267 assert((debug_memc_id < (X_SIZE * Y_SIZE)) && 268 "debug_memc_id larger than X_SIZE * Y_SIZE" ); 306 269 #else 307 size_t x = debug_memc_id >> Y_WIDTH;308 size_t y = debug_memc_id & ((1 << Y_WIDTH) - 1);309 310 assert( (x <= X_SIZE) and (y <= Y_SIZE) &&311 "MEMCID parameter refers a not valid memory cache");312 #endif 313 }314 else if ((strcmp(argv[n], "-PROCID") == 0) && (n + 1 < argc)) {315 debug_proc_id = (size_t) strtol(argv[n + 1], NULL, 0);270 size_t x = debug_memc_id >> Y_WIDTH; 271 size_t y = debug_memc_id & ((1 << Y_WIDTH) - 1); 272 273 assert( (x <= X_SIZE) and (y <= Y_SIZE) && 274 "MEMCID parameter refers a not valid memory cache"); 275 #endif 276 } 277 else if ((strcmp(argv[n], "-PROCID") == 0) && (n + 1 < argc)) { 278 debug_proc_id = (size_t) strtol(argv[n + 1], NULL, 0); 316 279 #ifdef USE_ALMOS 317 assert((debug_proc_id < (X_SIZE * Y_SIZE * NB_PROCS_MAX)) &&318 "debug_proc_id larger than X_SIZE * Y_SIZE * NB_PROCS");280 assert((debug_proc_id < (X_SIZE * Y_SIZE * NB_PROCS_MAX)) && 281 "debug_proc_id larger than X_SIZE * Y_SIZE * NB_PROCS"); 319 282 #else 320 size_t cluster_xy = debug_proc_id / NB_PROCS_MAX ;321 size_t x = cluster_xy >> Y_WIDTH;322 size_t y = cluster_xy & ((1 << Y_WIDTH) - 1);323 324 assert( (x <= X_SIZE) and (y <= Y_SIZE) &&325 "PROCID parameter refers a not valid processor");326 #endif 327 }328 else if ((strcmp(argv[n], "-THREADS") == 0) && ((n + 1) < argc)) {329 threads_nr = (ssize_t) strtol(argv[n + 1], NULL, 0);330 threads_nr = (threads_nr < 1) ? 1 : threads_nr;331 }332 else if ((strcmp(argv[n], "-FROZEN") == 0) && (n + 1 < argc)) {333 frozen_cycles = (int64_t) strtol(argv[n + 1], NULL, 0);334 }335 else if ((strcmp(argv[n], "-PERIOD") == 0) && (n + 1 < argc)) {336 debug_period = (size_t) strtol(argv[n + 1], NULL, 0);337 }338 else if ((strcmp(argv[n], "--reset-counters") == 0) && (n + 1 < argc)) {339 reset_counters = (int64_t) strtol(argv[n + 1], NULL, 0);340 do_reset_counters = true;341 }342 else if ((strcmp(argv[n], "--dump-counters") == 0) && (n + 1 < argc)) {343 dump_counters = (int64_t) strtol(argv[n + 1], NULL, 0);344 do_dump_counters = true;345 }346 else {347 std::cout << " Arguments are (key,value) couples." << std::endl;348 std::cout << " The order is not important." << std::endl;349 std::cout << " Accepted arguments are :" << std::endl << std::endl;350 std::cout << " -SOFT pathname_for_embedded_soft" << std::endl;351 std::cout << " -DISK pathname_for_disk_image" << std::endl;352 std::cout << " -NCYCLES number_of_simulated_cycles" << std::endl;353 std::cout << " -DEBUG debug_start_cycle" << std::endl;354 std::cout << " -THREADS simulator's threads number" << std::endl;355 std::cout << " -FROZEN max_number_of_lines" << std::endl;356 std::cout << " -PERIOD number_of_cycles between trace" << std::endl;357 std::cout << " -MEMCID index_memc_to_be_traced" << std::endl;358 std::cout << " -PROCID index_proc_to_be_traced" << std::endl;359 exit(0);360 }361 }362 }283 size_t cluster_xy = debug_proc_id / NB_PROCS_MAX ; 284 size_t x = cluster_xy >> Y_WIDTH; 285 size_t y = cluster_xy & ((1 << Y_WIDTH) - 1); 286 287 assert( (x <= X_SIZE) and (y <= Y_SIZE) && 288 "PROCID parameter refers a not valid processor"); 289 #endif 290 } 291 else if ((strcmp(argv[n], "-THREADS") == 0) && ((n + 1) < argc)) { 292 threads_nr = (ssize_t) strtol(argv[n + 1], NULL, 0); 293 threads_nr = (threads_nr < 1) ? 1 : threads_nr; 294 } 295 else if ((strcmp(argv[n], "-FROZEN") == 0) && (n + 1 < argc)) { 296 frozen_cycles = (int64_t) strtol(argv[n + 1], NULL, 0); 297 } 298 else if ((strcmp(argv[n], "-PERIOD") == 0) && (n + 1 < argc)) { 299 debug_period = (size_t) strtol(argv[n + 1], NULL, 0); 300 } 301 else if ((strcmp(argv[n], "--reset-counters") == 0) && (n + 1 < argc)) { 302 reset_counters = (int64_t) strtol(argv[n + 1], NULL, 0); 303 do_reset_counters = true; 304 } 305 else if ((strcmp(argv[n], "--dump-counters") == 0) && (n + 1 < argc)) { 306 dump_counters = (int64_t) strtol(argv[n + 1], NULL, 0); 307 do_dump_counters = true; 308 } 309 else { 310 std::cout << " Arguments are (key,value) couples." << std::endl; 311 std::cout << " The order is not important." << std::endl; 312 std::cout << " Accepted arguments are :" << std::endl << std::endl; 313 std::cout << " -SOFT pathname_for_embedded_soft" << std::endl; 314 std::cout << " -DISK pathname_for_disk_image" << std::endl; 315 std::cout << " -NCYCLES number_of_simulated_cycles" << std::endl; 316 std::cout << " -DEBUG debug_start_cycle" << std::endl; 317 std::cout << " -THREADS simulator's threads number" << std::endl; 318 std::cout << " -FROZEN max_number_of_lines" << std::endl; 319 std::cout << " -PERIOD number_of_cycles between trace" << std::endl; 320 std::cout << " -MEMCID index_memc_to_be_traced" << std::endl; 321 std::cout << " -PROCID index_proc_to_be_traced" << std::endl; 322 exit(0); 323 } 324 } 325 } 363 326 364 327 // checking hardware parameters … … 383 346 assert( (NB_NIC_CHANNELS < 9) and 384 347 "The NB_NIC_CHANNELS parameter must be smaller than 9" ); 385 386 #ifdef USE_GIET387 assert( (vci_address_width == 40) and388 "VCI address width with the GIET must be 40 bits" );389 #endif390 348 391 349 #ifdef USE_ALMOS … … 431 389 vci_wrplen_width> vci_param_ext; 432 390 433 #if USE_OPENMP 434 omp_set_dynamic(false); 435 omp_set_num_threads(threads_nr); 436 std::cerr << "Built with openmp version " << _OPENMP << std::endl; 437 #endif 438 439 // Define parameters depending on mesh size 440 size_t x_width; 441 size_t y_width; 391 #ifdef USE_OPENMP 392 omp_set_dynamic(false); 393 omp_set_num_threads(threads_nr); 394 std::cerr << "Built with openmp version " << _OPENMP << std::endl; 395 std::cerr << "Run with " << threads_nr << " threads" << std::endl; 396 #endif 397 398 // Define parameters depending on mesh size 399 size_t x_width; 400 size_t y_width; 442 401 443 402 #ifdef USE_ALMOS 444 if (X_SIZE == 1) x_width = 0;445 else if (X_SIZE == 2) x_width = 1;446 else if (X_SIZE <= 4) x_width = 2;447 else if (X_SIZE <= 8) x_width = 3;448 else x_width = 4;449 450 if (Y_SIZE == 1) y_width = 0;451 else if (Y_SIZE == 2) y_width = 1;452 else if (Y_SIZE <= 4) y_width = 2;453 else if (Y_SIZE <= 8) y_width = 3;454 else y_width = 4;403 if (X_SIZE == 1) x_width = 0; 404 else if (X_SIZE == 2) x_width = 1; 405 else if (X_SIZE <= 4) x_width = 2; 406 else if (X_SIZE <= 8) x_width = 3; 407 else x_width = 4; 408 409 if (Y_SIZE == 1) y_width = 0; 410 else if (Y_SIZE == 2) y_width = 1; 411 else if (Y_SIZE <= 4) y_width = 2; 412 else if (Y_SIZE <= 8) y_width = 3; 413 else y_width = 4; 455 414 456 415 #else 457 size_t x_width = X_WIDTH;458 size_t y_width = Y_WIDTH;459 460 assert((X_WIDTH <= 4) and (Y_WIDTH <= 4) and461 "Up to 256 clusters");462 463 assert((X_SIZE <= (1 << X_WIDTH)) and (Y_SIZE <= (1 << Y_WIDTH)) and464 "The X_WIDTH and Y_WIDTH parameter are insufficient");465 466 #endif 467 468 /////////////////////469 // Mapping Tables470 /////////////////////471 472 // internal network473 MappingTable maptabd(vci_address_width,474 IntTab(x_width + y_width, 16 - x_width - y_width),475 IntTab(x_width + y_width, vci_srcid_width - x_width - y_width),476 0x00FF800000);477 478 for (size_t x = 0; x < X_SIZE; x++) {479 for (size_t y = 0; y < Y_SIZE; y++) {480 sc_uint<vci_address_width> offset;481 offset = (sc_uint<vci_address_width>) cluster(x,y)482 << (vci_address_width - x_width - y_width);483 484 std::ostringstream si;485 si << "seg_xicu_" << x << "_" << y;486 maptabd.add(Segment(si.str(), SEG_XCU_BASE + offset, SEG_XCU_SIZE,487 IntTab(cluster(x,y), XCU_TGTID), false));488 489 std::ostringstream sd;490 sd << "seg_mdma_" << x << "_" << y;491 maptabd.add(Segment(sd.str(), SEG_DMA_BASE + offset, SEG_DMA_SIZE,492 IntTab(cluster(x,y), DMA_TGTID), false));493 494 std::ostringstream sh;495 sh << "seg_memc_" << x << "_" << y;496 maptabd.add(Segment(sh.str(), SEG_RAM_BASE + offset, SEG_RAM_SIZE,497 IntTab(cluster(x,y), RAM_TGTID), true));498 499 if (x == X_IO && y == Y_IO) {500 maptabd.add(Segment("seg_mtty", SEG_TTY_BASE, SEG_TTY_SIZE,501 IntTab(cluster(x,y),TTY_TGTID), false));502 maptabd.add(Segment("seg_fbuf", SEG_FBF_BASE, SEG_FBF_SIZE,503 IntTab(cluster(x,y),FBF_TGTID), false));504 maptabd.add(Segment("seg_bdev", SEG_IOC_BASE, SEG_IOC_SIZE,505 IntTab(cluster(x,y),IOC_TGTID), false));506 maptabd.add(Segment("seg_brom", SEG_ROM_BASE, SEG_ROM_SIZE,507 IntTab(cluster(x,y),ROM_TGTID), true));508 maptabd.add(Segment("seg_mnic", SEG_NIC_BASE, SEG_NIC_SIZE,509 IntTab(cluster(x,y),NIC_TGTID), false));510 maptabd.add(Segment("seg_cdma", SEG_CMA_BASE, SEG_CMA_SIZE,511 IntTab(cluster(x,y),CMA_TGTID), false));512 maptabd.add(Segment("seg_simh", SEG_SIM_BASE, SEG_SIM_SIZE,513 IntTab(cluster(x,y),SIM_TGTID), false));514 }515 }516 }517 std::cout << maptabd << std::endl;518 519 // external network520 MappingTable maptabx(vci_address_width,521 IntTab(x_width + y_width),522 IntTab(x_width + y_width),523 0xFFFF000000ULL);524 525 for (size_t x = 0; x < X_SIZE; x++) {526 for (size_t y = 0; y < Y_SIZE ; y++) {527 528 sc_uint<vci_address_width> offset;529 offset = (sc_uint<vci_address_width>) cluster(x,y)530 << (vci_address_width - x_width - y_width);531 532 std::ostringstream sh;533 sh << "x_seg_memc_" << x << "_" << y;534 535 maptabx.add(Segment(sh.str(), SEG_RAM_BASE + offset,536 SEG_RAM_SIZE, IntTab(cluster(x,y)), false));537 }538 }539 std::cout << maptabx << std::endl;540 541 ////////////////////542 // Signals543 ///////////////////544 545 sc_clock signal_clk("clk");546 sc_signal<bool> signal_resetn("resetn");547 548 // Horizontal inter-clusters DSPIN signals549 DspinSignals<dspin_cmd_width>** signal_dspin_h_cmd_inc =550 alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_h_cmd_inc", X_SIZE - 1, Y_SIZE);551 DspinSignals<dspin_cmd_width>** signal_dspin_h_cmd_dec =552 alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_h_cmd_dec", X_SIZE - 1, Y_SIZE);553 554 DspinSignals<dspin_rsp_width>** signal_dspin_h_rsp_inc =555 alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_h_rsp_inc", X_SIZE - 1, Y_SIZE);556 DspinSignals<dspin_rsp_width>** signal_dspin_h_rsp_dec =557 alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_h_rsp_dec", X_SIZE - 1, Y_SIZE);558 559 DspinSignals<dspin_cmd_width>** signal_dspin_h_m2p_inc =560 alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_h_m2p_inc", X_SIZE- 1 , Y_SIZE);561 DspinSignals<dspin_cmd_width>** signal_dspin_h_m2p_dec =562 alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_h_m2p_dec", X_SIZE - 1, Y_SIZE);563 564 DspinSignals<dspin_rsp_width>** signal_dspin_h_p2m_inc =565 alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_h_p2m_inc", X_SIZE - 1, Y_SIZE);566 DspinSignals<dspin_rsp_width>** signal_dspin_h_p2m_dec =567 alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_h_p2m_dec", X_SIZE - 1, Y_SIZE);568 569 DspinSignals<dspin_cmd_width>** signal_dspin_h_cla_inc =570 alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_h_cla_inc", X_SIZE - 1, Y_SIZE);571 DspinSignals<dspin_cmd_width>** signal_dspin_h_cla_dec =572 alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_h_cla_dec", X_SIZE - 1, Y_SIZE);573 574 // Vertical inter-clusters DSPIN signals575 DspinSignals<dspin_cmd_width>** signal_dspin_v_cmd_inc =576 alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_v_cmd_inc", X_SIZE, Y_SIZE - 1);577 DspinSignals<dspin_cmd_width>** signal_dspin_v_cmd_dec =578 alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_v_cmd_dec", X_SIZE, Y_SIZE - 1);579 580 DspinSignals<dspin_rsp_width>** signal_dspin_v_rsp_inc =581 alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_v_rsp_inc", X_SIZE, Y_SIZE - 1);582 DspinSignals<dspin_rsp_width>** signal_dspin_v_rsp_dec =583 alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_v_rsp_dec", X_SIZE, Y_SIZE - 1);584 585 DspinSignals<dspin_cmd_width>** signal_dspin_v_m2p_inc =586 alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_v_m2p_inc", X_SIZE, Y_SIZE - 1);587 DspinSignals<dspin_cmd_width>** signal_dspin_v_m2p_dec =588 alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_v_m2p_dec", X_SIZE, Y_SIZE - 1);589 590 DspinSignals<dspin_rsp_width>** signal_dspin_v_p2m_inc =591 alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_v_p2m_inc", X_SIZE, Y_SIZE - 1);592 DspinSignals<dspin_rsp_width>** signal_dspin_v_p2m_dec =593 alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_v_p2m_dec", X_SIZE, Y_SIZE - 1);594 595 DspinSignals<dspin_cmd_width>** signal_dspin_v_cla_inc =596 alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_v_cla_inc", X_SIZE, Y_SIZE - 1);597 DspinSignals<dspin_cmd_width>** signal_dspin_v_cla_dec =598 alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_v_cla_dec", X_SIZE, Y_SIZE - 1);599 600 // Mesh boundaries DSPIN signals (Most of those signals are not used...)601 DspinSignals<dspin_cmd_width>*** signal_dspin_bound_cmd_in =602 alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_bound_cmd_in" , X_SIZE, Y_SIZE, 4);603 DspinSignals<dspin_cmd_width>*** signal_dspin_bound_cmd_out =604 alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_bound_cmd_out", X_SIZE, Y_SIZE, 4);605 606 DspinSignals<dspin_rsp_width>*** signal_dspin_bound_rsp_in =607 alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_bound_rsp_in" , X_SIZE, Y_SIZE, 4);608 DspinSignals<dspin_rsp_width>*** signal_dspin_bound_rsp_out =609 alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_bound_rsp_out", X_SIZE, Y_SIZE, 4);610 611 DspinSignals<dspin_cmd_width>*** signal_dspin_bound_m2p_in =612 alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_bound_m2p_in" , X_SIZE, Y_SIZE, 4);613 DspinSignals<dspin_cmd_width>*** signal_dspin_bound_m2p_out =614 alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_bound_m2p_out", X_SIZE, Y_SIZE, 4);615 616 DspinSignals<dspin_rsp_width>*** signal_dspin_bound_p2m_in =617 alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_bound_p2m_in" , X_SIZE, Y_SIZE, 4);618 DspinSignals<dspin_rsp_width>*** signal_dspin_bound_p2m_out =619 alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_bound_p2m_out", X_SIZE, Y_SIZE, 4);620 621 DspinSignals<dspin_cmd_width>*** signal_dspin_bound_cla_in =622 alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_bound_cla_in" , X_SIZE, Y_SIZE, 4);623 DspinSignals<dspin_cmd_width>*** signal_dspin_bound_cla_out =624 alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_bound_cla_out", X_SIZE, Y_SIZE, 4);625 626 627 ////////////////////////////628 // Loader629 ////////////////////////////630 631 soclib::common::Loader loader(soft_name);632 633 typedef soclib::common::GdbServer<soclib::common::Mips32ElIss> proc_iss;634 proc_iss::set_loader(loader);635 636 ////////////////////////////637 // Clusters construction638 ////////////////////////////639 640 TsarXbarCluster<dspin_cmd_width,641 dspin_rsp_width,642 vci_param_int,643 vci_param_ext> * clusters[X_SIZE][Y_SIZE];644 645 #if USE_OPENMP416 size_t x_width = X_WIDTH; 417 size_t y_width = Y_WIDTH; 418 419 assert((X_WIDTH <= 4) and (Y_WIDTH <= 4) and 420 "Up to 256 clusters"); 421 422 assert((X_SIZE <= (1 << X_WIDTH)) and (Y_SIZE <= (1 << Y_WIDTH)) and 423 "The X_WIDTH and Y_WIDTH parameter are insufficient"); 424 425 #endif 426 427 ///////////////////// 428 // Mapping Tables 429 ///////////////////// 430 431 // internal network 432 MappingTable maptabd(vci_address_width, 433 IntTab(x_width + y_width, 16 - x_width - y_width), 434 IntTab(x_width + y_width, vci_srcid_width - x_width - y_width), 435 0x00FF800000); 436 437 for (size_t x = 0; x < X_SIZE; x++) { 438 for (size_t y = 0; y < Y_SIZE; y++) { 439 sc_uint<vci_address_width> offset; 440 offset = (sc_uint<vci_address_width>) cluster(x,y) 441 << (vci_address_width - x_width - y_width); 442 443 std::ostringstream si; 444 si << "seg_xicu_" << x << "_" << y; 445 maptabd.add(Segment(si.str(), SEG_XCU_BASE + offset, SEG_XCU_SIZE, 446 IntTab(cluster(x,y), XCU_TGTID), false)); 447 448 std::ostringstream sd; 449 sd << "seg_mdma_" << x << "_" << y; 450 maptabd.add(Segment(sd.str(), SEG_DMA_BASE + offset, SEG_DMA_SIZE, 451 IntTab(cluster(x,y), DMA_TGTID), false)); 452 453 std::ostringstream sh; 454 sh << "seg_memc_" << x << "_" << y; 455 maptabd.add(Segment(sh.str(), SEG_RAM_BASE + offset, SEG_RAM_SIZE, 456 IntTab(cluster(x,y), RAM_TGTID), true)); 457 458 if (x == X_IO && y == Y_IO) { 459 maptabd.add(Segment("seg_mtty", SEG_TTY_BASE, SEG_TTY_SIZE, 460 IntTab(cluster(x,y),TTY_TGTID), false)); 461 maptabd.add(Segment("seg_fbuf", SEG_FBF_BASE, SEG_FBF_SIZE, 462 IntTab(cluster(x,y),FBF_TGTID), false)); 463 maptabd.add(Segment("seg_bdev", SEG_IOC_BASE, SEG_IOC_SIZE, 464 IntTab(cluster(x,y),IOC_TGTID), false)); 465 maptabd.add(Segment("seg_brom", SEG_ROM_BASE, SEG_ROM_SIZE, 466 IntTab(cluster(x,y),ROM_TGTID), true)); 467 maptabd.add(Segment("seg_mnic", SEG_NIC_BASE, SEG_NIC_SIZE, 468 IntTab(cluster(x,y),NIC_TGTID), false)); 469 maptabd.add(Segment("seg_cdma", SEG_CMA_BASE, SEG_CMA_SIZE, 470 IntTab(cluster(x,y),CMA_TGTID), false)); 471 maptabd.add(Segment("seg_simh", SEG_SIM_BASE, SEG_SIM_SIZE, 472 IntTab(cluster(x,y),SIM_TGTID), false)); 473 } 474 } 475 } 476 std::cout << maptabd << std::endl; 477 478 // external network 479 MappingTable maptabx(vci_address_width, 480 IntTab(x_width + y_width), 481 IntTab(x_width + y_width), 482 0xFFFF000000ULL); 483 484 for (size_t x = 0; x < X_SIZE; x++) { 485 for (size_t y = 0; y < Y_SIZE ; y++) { 486 487 sc_uint<vci_address_width> offset; 488 offset = (sc_uint<vci_address_width>) cluster(x,y) 489 << (vci_address_width - x_width - y_width); 490 491 std::ostringstream sh; 492 sh << "x_seg_memc_" << x << "_" << y; 493 494 maptabx.add(Segment(sh.str(), SEG_RAM_BASE + offset, 495 SEG_RAM_SIZE, IntTab(cluster(x,y)), false)); 496 } 497 } 498 std::cout << maptabx << std::endl; 499 500 //////////////////// 501 // Signals 502 /////////////////// 503 504 sc_clock signal_clk("clk"); 505 sc_signal<bool> signal_resetn("resetn"); 506 507 // Horizontal inter-clusters DSPIN signals 508 DspinSignals<dspin_cmd_width>** signal_dspin_h_cmd_inc = 509 alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_h_cmd_inc", X_SIZE - 1, Y_SIZE); 510 DspinSignals<dspin_cmd_width>** signal_dspin_h_cmd_dec = 511 alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_h_cmd_dec", X_SIZE - 1, Y_SIZE); 512 513 DspinSignals<dspin_rsp_width>** signal_dspin_h_rsp_inc = 514 alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_h_rsp_inc", X_SIZE - 1, Y_SIZE); 515 DspinSignals<dspin_rsp_width>** signal_dspin_h_rsp_dec = 516 alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_h_rsp_dec", X_SIZE - 1, Y_SIZE); 517 518 DspinSignals<dspin_cmd_width>** signal_dspin_h_m2p_inc = 519 alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_h_m2p_inc", X_SIZE- 1 , Y_SIZE); 520 DspinSignals<dspin_cmd_width>** signal_dspin_h_m2p_dec = 521 alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_h_m2p_dec", X_SIZE - 1, Y_SIZE); 522 523 DspinSignals<dspin_rsp_width>** signal_dspin_h_p2m_inc = 524 alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_h_p2m_inc", X_SIZE - 1, Y_SIZE); 525 DspinSignals<dspin_rsp_width>** signal_dspin_h_p2m_dec = 526 alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_h_p2m_dec", X_SIZE - 1, Y_SIZE); 527 528 DspinSignals<dspin_cmd_width>** signal_dspin_h_cla_inc = 529 alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_h_cla_inc", X_SIZE - 1, Y_SIZE); 530 DspinSignals<dspin_cmd_width>** signal_dspin_h_cla_dec = 531 alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_h_cla_dec", X_SIZE - 1, Y_SIZE); 532 533 // Vertical inter-clusters DSPIN signals 534 DspinSignals<dspin_cmd_width>** signal_dspin_v_cmd_inc = 535 alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_v_cmd_inc", X_SIZE, Y_SIZE - 1); 536 DspinSignals<dspin_cmd_width>** signal_dspin_v_cmd_dec = 537 alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_v_cmd_dec", X_SIZE, Y_SIZE - 1); 538 539 DspinSignals<dspin_rsp_width>** signal_dspin_v_rsp_inc = 540 alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_v_rsp_inc", X_SIZE, Y_SIZE - 1); 541 DspinSignals<dspin_rsp_width>** signal_dspin_v_rsp_dec = 542 alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_v_rsp_dec", X_SIZE, Y_SIZE - 1); 543 544 DspinSignals<dspin_cmd_width>** signal_dspin_v_m2p_inc = 545 alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_v_m2p_inc", X_SIZE, Y_SIZE - 1); 546 DspinSignals<dspin_cmd_width>** signal_dspin_v_m2p_dec = 547 alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_v_m2p_dec", X_SIZE, Y_SIZE - 1); 548 549 DspinSignals<dspin_rsp_width>** signal_dspin_v_p2m_inc = 550 alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_v_p2m_inc", X_SIZE, Y_SIZE - 1); 551 DspinSignals<dspin_rsp_width>** signal_dspin_v_p2m_dec = 552 alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_v_p2m_dec", X_SIZE, Y_SIZE - 1); 553 554 DspinSignals<dspin_cmd_width>** signal_dspin_v_cla_inc = 555 alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_v_cla_inc", X_SIZE, Y_SIZE - 1); 556 DspinSignals<dspin_cmd_width>** signal_dspin_v_cla_dec = 557 alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_v_cla_dec", X_SIZE, Y_SIZE - 1); 558 559 // Mesh boundaries DSPIN signals (Most of those signals are not used...) 560 DspinSignals<dspin_cmd_width>*** signal_dspin_bound_cmd_in = 561 alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_bound_cmd_in" , X_SIZE, Y_SIZE, 4); 562 DspinSignals<dspin_cmd_width>*** signal_dspin_bound_cmd_out = 563 alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_bound_cmd_out", X_SIZE, Y_SIZE, 4); 564 565 DspinSignals<dspin_rsp_width>*** signal_dspin_bound_rsp_in = 566 alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_bound_rsp_in" , X_SIZE, Y_SIZE, 4); 567 DspinSignals<dspin_rsp_width>*** signal_dspin_bound_rsp_out = 568 alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_bound_rsp_out", X_SIZE, Y_SIZE, 4); 569 570 DspinSignals<dspin_cmd_width>*** signal_dspin_bound_m2p_in = 571 alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_bound_m2p_in" , X_SIZE, Y_SIZE, 4); 572 DspinSignals<dspin_cmd_width>*** signal_dspin_bound_m2p_out = 573 alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_bound_m2p_out", X_SIZE, Y_SIZE, 4); 574 575 DspinSignals<dspin_rsp_width>*** signal_dspin_bound_p2m_in = 576 alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_bound_p2m_in" , X_SIZE, Y_SIZE, 4); 577 DspinSignals<dspin_rsp_width>*** signal_dspin_bound_p2m_out = 578 alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_bound_p2m_out", X_SIZE, Y_SIZE, 4); 579 580 DspinSignals<dspin_cmd_width>*** signal_dspin_bound_cla_in = 581 alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_bound_cla_in" , X_SIZE, Y_SIZE, 4); 582 DspinSignals<dspin_cmd_width>*** signal_dspin_bound_cla_out = 583 alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_bound_cla_out", X_SIZE, Y_SIZE, 4); 584 585 586 //////////////////////////// 587 // Loader 588 //////////////////////////// 589 590 soclib::common::Loader loader(soft_name); 591 592 typedef soclib::common::GdbServer<soclib::common::Mips32ElIss> proc_iss; 593 proc_iss::set_loader(loader); 594 595 //////////////////////////// 596 // Clusters construction 597 //////////////////////////// 598 599 TsarXbarCluster<dspin_cmd_width, 600 dspin_rsp_width, 601 vci_param_int, 602 vci_param_ext> * clusters[X_SIZE][Y_SIZE]; 603 604 #ifdef USE_OPENMP 646 605 #pragma omp parallel 606 #endif 647 607 { 608 #ifdef USE_OPENMP 648 609 #pragma omp for 649 610 #endif 650 651 652 653 654 #if USE_OPENMP611 for (size_t i = 0; i < (X_SIZE * Y_SIZE); i++) { 612 size_t x = i / Y_SIZE; 613 size_t y = i % Y_SIZE; 614 615 #ifdef USE_OPENMP 655 616 #pragma omp critical 656 { 657 #endif 617 #endif 618 { 658 619 std::cout << std::endl; 659 620 std::cout << "Cluster_" << x << "_" << y << std::endl; … … 663 624 sc << "cluster_" << x << "_" << y; 664 625 clusters[x][y] = new TsarXbarCluster<dspin_cmd_width, 665 dspin_rsp_width, 666 vci_param_int, 667 vci_param_ext> 668 ( 669 sc.str().c_str(), 670 NB_PROCS_MAX, 671 NB_TTY_CHANNELS, 672 NB_DMA_CHANNELS, 673 x, 674 y, 675 cluster(x,y), 676 maptabd, 677 maptabx, 678 x_width, 679 y_width, 680 vci_srcid_width - x_width - y_width, // l_id width, 681 P_WIDTH, 682 RAM_TGTID, 683 XCU_TGTID, 684 DMA_TGTID, 685 FBF_TGTID, 686 TTY_TGTID, 687 ROM_TGTID, 688 NIC_TGTID, 689 CMA_TGTID, 690 IOC_TGTID, 691 SIM_TGTID, 692 MEMC_WAYS, 693 MEMC_SETS, 694 L1_IWAYS, 695 L1_ISETS, 696 L1_DWAYS, 697 L1_DSETS, 698 IRQ_PER_PROCESSOR, 699 XRAM_LATENCY, 700 x == X_IO && y == Y_IO, 701 FBF_X_SIZE, 702 FBF_Y_SIZE, 703 disk_name, 704 BDEV_SECTOR_SIZE, 705 NB_NIC_CHANNELS, 706 nic_rx_name, 707 nic_tx_name, 708 NIC_TIMEOUT, 709 NB_CMA_CHANNELS, 710 loader, 711 frozen_cycles, 712 debug_from, 713 debug_ok, 714 debug_ok 715 ); 716 717 #if USE_OPENMP 718 } // end critical 719 #endif 720 } // end for 721 #if USE_OPENMP 722 } 723 #endif 724 725 /////////////////////////////////////////////////////////////// 726 // Net-list 727 /////////////////////////////////////////////////////////////// 728 729 // Clock & RESET 730 for (int x = 0; x < X_SIZE; x++) { 731 for (int y = 0; y < Y_SIZE; y++) { 732 clusters[x][y]->p_clk (signal_clk); 733 clusters[x][y]->p_resetn (signal_resetn); 734 } 735 } 736 737 // Inter Clusters horizontal connections 738 for (int x = 0; x < X_SIZE - 1; x++) { 739 for (int y = 0; y < Y_SIZE; y++) { 740 clusters[x][y]->p_cmd_out[EAST] (signal_dspin_h_cmd_inc[x][y]); 741 clusters[x + 1][y]->p_cmd_in[WEST] (signal_dspin_h_cmd_inc[x][y]); 742 clusters[x][y]->p_cmd_in[EAST] (signal_dspin_h_cmd_dec[x][y]); 743 clusters[x + 1][y]->p_cmd_out[WEST] (signal_dspin_h_cmd_dec[x][y]); 744 745 clusters[x][y]->p_rsp_out[EAST] (signal_dspin_h_rsp_inc[x][y]); 746 clusters[x + 1][y]->p_rsp_in[WEST] (signal_dspin_h_rsp_inc[x][y]); 747 clusters[x][y]->p_rsp_in[EAST] (signal_dspin_h_rsp_dec[x][y]); 748 clusters[x + 1][y]->p_rsp_out[WEST] (signal_dspin_h_rsp_dec[x][y]); 749 750 clusters[x][y]->p_m2p_out[EAST] (signal_dspin_h_m2p_inc[x][y]); 751 clusters[x + 1][y]->p_m2p_in[WEST] (signal_dspin_h_m2p_inc[x][y]); 752 clusters[x][y]->p_m2p_in[EAST] (signal_dspin_h_m2p_dec[x][y]); 753 clusters[x + 1][y]->p_m2p_out[WEST] (signal_dspin_h_m2p_dec[x][y]); 754 755 clusters[x][y]->p_p2m_out[EAST] (signal_dspin_h_p2m_inc[x][y]); 756 clusters[x + 1][y]->p_p2m_in[WEST] (signal_dspin_h_p2m_inc[x][y]); 757 clusters[x][y]->p_p2m_in[EAST] (signal_dspin_h_p2m_dec[x][y]); 758 clusters[x + 1][y]->p_p2m_out[WEST] (signal_dspin_h_p2m_dec[x][y]); 759 760 clusters[x][y]->p_cla_out[EAST] (signal_dspin_h_cla_inc[x][y]); 761 clusters[x + 1][y]->p_cla_in[WEST] (signal_dspin_h_cla_inc[x][y]); 762 clusters[x][y]->p_cla_in[EAST] (signal_dspin_h_cla_dec[x][y]); 763 clusters[x + 1][y]->p_cla_out[WEST] (signal_dspin_h_cla_dec[x][y]); 764 } 765 } 766 std::cout << std::endl << "Horizontal connections done" << std::endl; 767 768 // Inter Clusters vertical connections 769 for (int y = 0; y < Y_SIZE - 1; y++) { 770 for (int x = 0; x < X_SIZE; x++) { 771 clusters[x][y]->p_cmd_out[NORTH] (signal_dspin_v_cmd_inc[x][y]); 772 clusters[x][y + 1]->p_cmd_in[SOUTH] (signal_dspin_v_cmd_inc[x][y]); 773 clusters[x][y]->p_cmd_in[NORTH] (signal_dspin_v_cmd_dec[x][y]); 774 clusters[x][y + 1]->p_cmd_out[SOUTH] (signal_dspin_v_cmd_dec[x][y]); 775 776 clusters[x][y]->p_rsp_out[NORTH] (signal_dspin_v_rsp_inc[x][y]); 777 clusters[x][y + 1]->p_rsp_in[SOUTH] (signal_dspin_v_rsp_inc[x][y]); 778 clusters[x][y]->p_rsp_in[NORTH] (signal_dspin_v_rsp_dec[x][y]); 779 clusters[x][y + 1]->p_rsp_out[SOUTH] (signal_dspin_v_rsp_dec[x][y]); 780 781 clusters[x][y]->p_m2p_out[NORTH] (signal_dspin_v_m2p_inc[x][y]); 782 clusters[x][y + 1]->p_m2p_in[SOUTH] (signal_dspin_v_m2p_inc[x][y]); 783 clusters[x][y]->p_m2p_in[NORTH] (signal_dspin_v_m2p_dec[x][y]); 784 clusters[x][y + 1]->p_m2p_out[SOUTH] (signal_dspin_v_m2p_dec[x][y]); 785 786 clusters[x][y]->p_p2m_out[NORTH] (signal_dspin_v_p2m_inc[x][y]); 787 clusters[x][y + 1]->p_p2m_in[SOUTH] (signal_dspin_v_p2m_inc[x][y]); 788 clusters[x][y]->p_p2m_in[NORTH] (signal_dspin_v_p2m_dec[x][y]); 789 clusters[x][y + 1]->p_p2m_out[SOUTH] (signal_dspin_v_p2m_dec[x][y]); 790 791 clusters[x][y]->p_cla_out[NORTH] (signal_dspin_v_cla_inc[x][y]); 792 clusters[x][y + 1]->p_cla_in[SOUTH] (signal_dspin_v_cla_inc[x][y]); 793 clusters[x][y]->p_cla_in[NORTH] (signal_dspin_v_cla_dec[x][y]); 794 clusters[x][y + 1]->p_cla_out[SOUTH] (signal_dspin_v_cla_dec[x][y]); 795 } 796 } 797 std::cout << std::endl << "Vertical connections done" << std::endl; 798 799 // East & West boundary cluster connections 800 for (size_t y = 0; y < Y_SIZE; y++) { 801 clusters[0][y]->p_cmd_in[WEST] (signal_dspin_bound_cmd_in[0][y][WEST]); 802 clusters[0][y]->p_cmd_out[WEST] (signal_dspin_bound_cmd_out[0][y][WEST]); 803 clusters[X_SIZE - 1][y]->p_cmd_in[EAST] (signal_dspin_bound_cmd_in[X_SIZE - 1][y][EAST]); 804 clusters[X_SIZE - 1][y]->p_cmd_out[EAST] (signal_dspin_bound_cmd_out[X_SIZE - 1][y][EAST]); 805 806 clusters[0][y]->p_rsp_in[WEST] (signal_dspin_bound_rsp_in[0][y][WEST]); 807 clusters[0][y]->p_rsp_out[WEST] (signal_dspin_bound_rsp_out[0][y][WEST]); 808 clusters[X_SIZE - 1][y]->p_rsp_in[EAST] (signal_dspin_bound_rsp_in[X_SIZE - 1][y][EAST]); 809 clusters[X_SIZE - 1][y]->p_rsp_out[EAST] (signal_dspin_bound_rsp_out[X_SIZE - 1][y][EAST]); 810 811 clusters[0][y]->p_m2p_in[WEST] (signal_dspin_bound_m2p_in[0][y][WEST]); 812 clusters[0][y]->p_m2p_out[WEST] (signal_dspin_bound_m2p_out[0][y][WEST]); 813 clusters[X_SIZE - 1][y]->p_m2p_in[EAST] (signal_dspin_bound_m2p_in[X_SIZE - 1][y][EAST]); 814 clusters[X_SIZE - 1][y]->p_m2p_out[EAST] (signal_dspin_bound_m2p_out[X_SIZE - 1][y][EAST]); 815 816 clusters[0][y]->p_p2m_in[WEST] (signal_dspin_bound_p2m_in[0][y][WEST]); 817 clusters[0][y]->p_p2m_out[WEST] (signal_dspin_bound_p2m_out[0][y][WEST]); 818 clusters[X_SIZE - 1][y]->p_p2m_in[EAST] (signal_dspin_bound_p2m_in[X_SIZE - 1][y][EAST]); 819 clusters[X_SIZE - 1][y]->p_p2m_out[EAST] (signal_dspin_bound_p2m_out[X_SIZE - 1][y][EAST]); 820 821 clusters[0][y]->p_cla_in[WEST] (signal_dspin_bound_cla_in[0][y][WEST]); 822 clusters[0][y]->p_cla_out[WEST] (signal_dspin_bound_cla_out[0][y][WEST]); 823 clusters[X_SIZE - 1][y]->p_cla_in[EAST] (signal_dspin_bound_cla_in[X_SIZE - 1][y][EAST]); 824 clusters[X_SIZE - 1][y]->p_cla_out[EAST] (signal_dspin_bound_cla_out[X_SIZE - 1][y][EAST]); 825 } 826 827 std::cout << std::endl << "West & East boundaries connections done" << std::endl; 828 829 // North & South boundary clusters connections 830 for (size_t x = 0; x < X_SIZE; x++) { 831 clusters[x][0]->p_cmd_in[SOUTH] (signal_dspin_bound_cmd_in[x][0][SOUTH]); 832 clusters[x][0]->p_cmd_out[SOUTH] (signal_dspin_bound_cmd_out[x][0][SOUTH]); 833 clusters[x][Y_SIZE - 1]->p_cmd_in[NORTH] (signal_dspin_bound_cmd_in[x][Y_SIZE - 1][NORTH]); 834 clusters[x][Y_SIZE - 1]->p_cmd_out[NORTH](signal_dspin_bound_cmd_out[x][Y_SIZE - 1][NORTH]); 835 836 clusters[x][0]->p_rsp_in[SOUTH] (signal_dspin_bound_rsp_in[x][0][SOUTH]); 837 clusters[x][0]->p_rsp_out[SOUTH] (signal_dspin_bound_rsp_out[x][0][SOUTH]); 838 clusters[x][Y_SIZE - 1]->p_rsp_in[NORTH] (signal_dspin_bound_rsp_in[x][Y_SIZE - 1][NORTH]); 839 clusters[x][Y_SIZE - 1]->p_rsp_out[NORTH](signal_dspin_bound_rsp_out[x][Y_SIZE - 1][NORTH]); 840 841 clusters[x][0]->p_m2p_in[SOUTH] (signal_dspin_bound_m2p_in[x][0][SOUTH]); 842 clusters[x][0]->p_m2p_out[SOUTH] (signal_dspin_bound_m2p_out[x][0][SOUTH]); 843 clusters[x][Y_SIZE - 1]->p_m2p_in[NORTH] (signal_dspin_bound_m2p_in[x][Y_SIZE - 1][NORTH]); 844 clusters[x][Y_SIZE - 1]->p_m2p_out[NORTH](signal_dspin_bound_m2p_out[x][Y_SIZE - 1][NORTH]); 845 846 clusters[x][0]->p_p2m_in[SOUTH] (signal_dspin_bound_p2m_in[x][0][SOUTH]); 847 clusters[x][0]->p_p2m_out[SOUTH] (signal_dspin_bound_p2m_out[x][0][SOUTH]); 848 clusters[x][Y_SIZE - 1]->p_p2m_in[NORTH] (signal_dspin_bound_p2m_in[x][Y_SIZE - 1][NORTH]); 849 clusters[x][Y_SIZE - 1]->p_p2m_out[NORTH](signal_dspin_bound_p2m_out[x][Y_SIZE - 1][NORTH]); 850 851 clusters[x][0]->p_cla_in[SOUTH] (signal_dspin_bound_cla_in[x][0][SOUTH]); 852 clusters[x][0]->p_cla_out[SOUTH] (signal_dspin_bound_cla_out[x][0][SOUTH]); 853 clusters[x][Y_SIZE - 1]->p_cla_in[NORTH] (signal_dspin_bound_cla_in[x][Y_SIZE - 1][NORTH]); 854 clusters[x][Y_SIZE - 1]->p_cla_out[NORTH](signal_dspin_bound_cla_out[x][Y_SIZE - 1][NORTH]); 855 } 856 857 std::cout << std::endl << "North & South boundaries connections done" << std::endl; 858 std::cout << std::endl; 626 dspin_rsp_width, 627 vci_param_int, 628 vci_param_ext> 629 ( 630 sc.str().c_str(), 631 NB_PROCS_MAX, 632 NB_TTY_CHANNELS, 633 NB_DMA_CHANNELS, 634 x, 635 y, 636 cluster(x,y), 637 maptabd, 638 maptabx, 639 x_width, 640 y_width, 641 vci_srcid_width - x_width - y_width, // l_id width, 642 P_WIDTH, 643 RAM_TGTID, 644 XCU_TGTID, 645 DMA_TGTID, 646 FBF_TGTID, 647 TTY_TGTID, 648 ROM_TGTID, 649 NIC_TGTID, 650 CMA_TGTID, 651 IOC_TGTID, 652 SIM_TGTID, 653 MEMC_WAYS, 654 MEMC_SETS, 655 L1_IWAYS, 656 L1_ISETS, 657 L1_DWAYS, 658 L1_DSETS, 659 IRQ_PER_PROCESSOR, 660 XRAM_LATENCY, 661 x == X_IO && y == Y_IO, 662 FBF_X_SIZE, 663 FBF_Y_SIZE, 664 disk_name, 665 BDEV_SECTOR_SIZE, 666 NB_NIC_CHANNELS, 667 nic_rx_name, 668 nic_tx_name, 669 NIC_TIMEOUT, 670 NB_CMA_CHANNELS, 671 loader, 672 frozen_cycles, 673 debug_from, 674 debug_ok, 675 debug_ok 676 ); 677 678 } 679 } 680 } 681 682 /////////////////////////////////////////////////////////////// 683 // Net-list 684 /////////////////////////////////////////////////////////////// 685 686 // Clock & RESET 687 for (int x = 0; x < X_SIZE; x++) { 688 for (int y = 0; y < Y_SIZE; y++) { 689 clusters[x][y]->p_clk (signal_clk); 690 clusters[x][y]->p_resetn (signal_resetn); 691 } 692 } 693 694 // Inter Clusters horizontal connections 695 for (int x = 0; x < X_SIZE - 1; x++) { 696 for (int y = 0; y < Y_SIZE; y++) { 697 clusters[x][y]->p_cmd_out[EAST] (signal_dspin_h_cmd_inc[x][y]); 698 clusters[x + 1][y]->p_cmd_in[WEST] (signal_dspin_h_cmd_inc[x][y]); 699 clusters[x][y]->p_cmd_in[EAST] (signal_dspin_h_cmd_dec[x][y]); 700 clusters[x + 1][y]->p_cmd_out[WEST] (signal_dspin_h_cmd_dec[x][y]); 701 702 clusters[x][y]->p_rsp_out[EAST] (signal_dspin_h_rsp_inc[x][y]); 703 clusters[x + 1][y]->p_rsp_in[WEST] (signal_dspin_h_rsp_inc[x][y]); 704 clusters[x][y]->p_rsp_in[EAST] (signal_dspin_h_rsp_dec[x][y]); 705 clusters[x + 1][y]->p_rsp_out[WEST] (signal_dspin_h_rsp_dec[x][y]); 706 707 clusters[x][y]->p_m2p_out[EAST] (signal_dspin_h_m2p_inc[x][y]); 708 clusters[x + 1][y]->p_m2p_in[WEST] (signal_dspin_h_m2p_inc[x][y]); 709 clusters[x][y]->p_m2p_in[EAST] (signal_dspin_h_m2p_dec[x][y]); 710 clusters[x + 1][y]->p_m2p_out[WEST] (signal_dspin_h_m2p_dec[x][y]); 711 712 clusters[x][y]->p_p2m_out[EAST] (signal_dspin_h_p2m_inc[x][y]); 713 clusters[x + 1][y]->p_p2m_in[WEST] (signal_dspin_h_p2m_inc[x][y]); 714 clusters[x][y]->p_p2m_in[EAST] (signal_dspin_h_p2m_dec[x][y]); 715 clusters[x + 1][y]->p_p2m_out[WEST] (signal_dspin_h_p2m_dec[x][y]); 716 717 clusters[x][y]->p_cla_out[EAST] (signal_dspin_h_cla_inc[x][y]); 718 clusters[x + 1][y]->p_cla_in[WEST] (signal_dspin_h_cla_inc[x][y]); 719 clusters[x][y]->p_cla_in[EAST] (signal_dspin_h_cla_dec[x][y]); 720 clusters[x + 1][y]->p_cla_out[WEST] (signal_dspin_h_cla_dec[x][y]); 721 } 722 } 723 std::cout << std::endl << "Horizontal connections done" << std::endl; 724 725 // Inter Clusters vertical connections 726 for (int y = 0; y < Y_SIZE - 1; y++) { 727 for (int x = 0; x < X_SIZE; x++) { 728 clusters[x][y]->p_cmd_out[NORTH] (signal_dspin_v_cmd_inc[x][y]); 729 clusters[x][y + 1]->p_cmd_in[SOUTH] (signal_dspin_v_cmd_inc[x][y]); 730 clusters[x][y]->p_cmd_in[NORTH] (signal_dspin_v_cmd_dec[x][y]); 731 clusters[x][y + 1]->p_cmd_out[SOUTH] (signal_dspin_v_cmd_dec[x][y]); 732 733 clusters[x][y]->p_rsp_out[NORTH] (signal_dspin_v_rsp_inc[x][y]); 734 clusters[x][y + 1]->p_rsp_in[SOUTH] (signal_dspin_v_rsp_inc[x][y]); 735 clusters[x][y]->p_rsp_in[NORTH] (signal_dspin_v_rsp_dec[x][y]); 736 clusters[x][y + 1]->p_rsp_out[SOUTH] (signal_dspin_v_rsp_dec[x][y]); 737 738 clusters[x][y]->p_m2p_out[NORTH] (signal_dspin_v_m2p_inc[x][y]); 739 clusters[x][y + 1]->p_m2p_in[SOUTH] (signal_dspin_v_m2p_inc[x][y]); 740 clusters[x][y]->p_m2p_in[NORTH] (signal_dspin_v_m2p_dec[x][y]); 741 clusters[x][y + 1]->p_m2p_out[SOUTH] (signal_dspin_v_m2p_dec[x][y]); 742 743 clusters[x][y]->p_p2m_out[NORTH] (signal_dspin_v_p2m_inc[x][y]); 744 clusters[x][y + 1]->p_p2m_in[SOUTH] (signal_dspin_v_p2m_inc[x][y]); 745 clusters[x][y]->p_p2m_in[NORTH] (signal_dspin_v_p2m_dec[x][y]); 746 clusters[x][y + 1]->p_p2m_out[SOUTH] (signal_dspin_v_p2m_dec[x][y]); 747 748 clusters[x][y]->p_cla_out[NORTH] (signal_dspin_v_cla_inc[x][y]); 749 clusters[x][y + 1]->p_cla_in[SOUTH] (signal_dspin_v_cla_inc[x][y]); 750 clusters[x][y]->p_cla_in[NORTH] (signal_dspin_v_cla_dec[x][y]); 751 clusters[x][y + 1]->p_cla_out[SOUTH] (signal_dspin_v_cla_dec[x][y]); 752 } 753 } 754 std::cout << std::endl << "Vertical connections done" << std::endl; 755 756 // East & West boundary cluster connections 757 for (size_t y = 0; y < Y_SIZE; y++) { 758 clusters[0][y]->p_cmd_in[WEST] (signal_dspin_bound_cmd_in[0][y][WEST]); 759 clusters[0][y]->p_cmd_out[WEST] (signal_dspin_bound_cmd_out[0][y][WEST]); 760 clusters[X_SIZE - 1][y]->p_cmd_in[EAST] (signal_dspin_bound_cmd_in[X_SIZE - 1][y][EAST]); 761 clusters[X_SIZE - 1][y]->p_cmd_out[EAST] (signal_dspin_bound_cmd_out[X_SIZE - 1][y][EAST]); 762 763 clusters[0][y]->p_rsp_in[WEST] (signal_dspin_bound_rsp_in[0][y][WEST]); 764 clusters[0][y]->p_rsp_out[WEST] (signal_dspin_bound_rsp_out[0][y][WEST]); 765 clusters[X_SIZE - 1][y]->p_rsp_in[EAST] (signal_dspin_bound_rsp_in[X_SIZE - 1][y][EAST]); 766 clusters[X_SIZE - 1][y]->p_rsp_out[EAST] (signal_dspin_bound_rsp_out[X_SIZE - 1][y][EAST]); 767 768 clusters[0][y]->p_m2p_in[WEST] (signal_dspin_bound_m2p_in[0][y][WEST]); 769 clusters[0][y]->p_m2p_out[WEST] (signal_dspin_bound_m2p_out[0][y][WEST]); 770 clusters[X_SIZE - 1][y]->p_m2p_in[EAST] (signal_dspin_bound_m2p_in[X_SIZE - 1][y][EAST]); 771 clusters[X_SIZE - 1][y]->p_m2p_out[EAST] (signal_dspin_bound_m2p_out[X_SIZE - 1][y][EAST]); 772 773 clusters[0][y]->p_p2m_in[WEST] (signal_dspin_bound_p2m_in[0][y][WEST]); 774 clusters[0][y]->p_p2m_out[WEST] (signal_dspin_bound_p2m_out[0][y][WEST]); 775 clusters[X_SIZE - 1][y]->p_p2m_in[EAST] (signal_dspin_bound_p2m_in[X_SIZE - 1][y][EAST]); 776 clusters[X_SIZE - 1][y]->p_p2m_out[EAST] (signal_dspin_bound_p2m_out[X_SIZE - 1][y][EAST]); 777 778 clusters[0][y]->p_cla_in[WEST] (signal_dspin_bound_cla_in[0][y][WEST]); 779 clusters[0][y]->p_cla_out[WEST] (signal_dspin_bound_cla_out[0][y][WEST]); 780 clusters[X_SIZE - 1][y]->p_cla_in[EAST] (signal_dspin_bound_cla_in[X_SIZE - 1][y][EAST]); 781 clusters[X_SIZE - 1][y]->p_cla_out[EAST] (signal_dspin_bound_cla_out[X_SIZE - 1][y][EAST]); 782 } 783 784 std::cout << std::endl << "West & East boundaries connections done" << std::endl; 785 786 // North & South boundary clusters connections 787 for (size_t x = 0; x < X_SIZE; x++) { 788 clusters[x][0]->p_cmd_in[SOUTH] (signal_dspin_bound_cmd_in[x][0][SOUTH]); 789 clusters[x][0]->p_cmd_out[SOUTH] (signal_dspin_bound_cmd_out[x][0][SOUTH]); 790 clusters[x][Y_SIZE - 1]->p_cmd_in[NORTH] (signal_dspin_bound_cmd_in[x][Y_SIZE - 1][NORTH]); 791 clusters[x][Y_SIZE - 1]->p_cmd_out[NORTH](signal_dspin_bound_cmd_out[x][Y_SIZE - 1][NORTH]); 792 793 clusters[x][0]->p_rsp_in[SOUTH] (signal_dspin_bound_rsp_in[x][0][SOUTH]); 794 clusters[x][0]->p_rsp_out[SOUTH] (signal_dspin_bound_rsp_out[x][0][SOUTH]); 795 clusters[x][Y_SIZE - 1]->p_rsp_in[NORTH] (signal_dspin_bound_rsp_in[x][Y_SIZE - 1][NORTH]); 796 clusters[x][Y_SIZE - 1]->p_rsp_out[NORTH](signal_dspin_bound_rsp_out[x][Y_SIZE - 1][NORTH]); 797 798 clusters[x][0]->p_m2p_in[SOUTH] (signal_dspin_bound_m2p_in[x][0][SOUTH]); 799 clusters[x][0]->p_m2p_out[SOUTH] (signal_dspin_bound_m2p_out[x][0][SOUTH]); 800 clusters[x][Y_SIZE - 1]->p_m2p_in[NORTH] (signal_dspin_bound_m2p_in[x][Y_SIZE - 1][NORTH]); 801 clusters[x][Y_SIZE - 1]->p_m2p_out[NORTH](signal_dspin_bound_m2p_out[x][Y_SIZE - 1][NORTH]); 802 803 clusters[x][0]->p_p2m_in[SOUTH] (signal_dspin_bound_p2m_in[x][0][SOUTH]); 804 clusters[x][0]->p_p2m_out[SOUTH] (signal_dspin_bound_p2m_out[x][0][SOUTH]); 805 clusters[x][Y_SIZE - 1]->p_p2m_in[NORTH] (signal_dspin_bound_p2m_in[x][Y_SIZE - 1][NORTH]); 806 clusters[x][Y_SIZE - 1]->p_p2m_out[NORTH](signal_dspin_bound_p2m_out[x][Y_SIZE - 1][NORTH]); 807 808 clusters[x][0]->p_cla_in[SOUTH] (signal_dspin_bound_cla_in[x][0][SOUTH]); 809 clusters[x][0]->p_cla_out[SOUTH] (signal_dspin_bound_cla_out[x][0][SOUTH]); 810 clusters[x][Y_SIZE - 1]->p_cla_in[NORTH] (signal_dspin_bound_cla_in[x][Y_SIZE - 1][NORTH]); 811 clusters[x][Y_SIZE - 1]->p_cla_out[NORTH](signal_dspin_bound_cla_out[x][Y_SIZE - 1][NORTH]); 812 } 813 814 std::cout << std::endl << "North & South boundaries connections done" << std::endl; 815 std::cout << std::endl; 859 816 860 817 … … 865 822 GdbServer<Mips32ElIss> > * > l1_caches; 866 823 867 for (int x = 0; x < X_SIZE; x++) {868 for (int y = 0; y < Y_SIZE; y++) {869 for (int proc = 0; proc < NB_PROCS_MAX; proc++) {870 l1_caches.push_back(clusters[x][y]->proc[proc]);871 }872 }873 }874 875 for (int x = 0; x < X_SIZE; x++) {876 for (int y = 0; y < Y_SIZE; y++) {877 clusters[x][y]->memc->set_vcache_list(l1_caches);878 }879 }824 for (int x = 0; x < X_SIZE; x++) { 825 for (int y = 0; y < Y_SIZE; y++) { 826 for (int proc = 0; proc < NB_PROCS_MAX; proc++) { 827 l1_caches.push_back(clusters[x][y]->proc[proc]); 828 } 829 } 830 } 831 832 for (int x = 0; x < X_SIZE; x++) { 833 for (int y = 0; y < Y_SIZE; y++) { 834 clusters[x][y]->memc->set_vcache_list(l1_caches); 835 } 836 } 880 837 #endif 881 838 … … 883 840 //#define SC_TRACE 884 841 #ifdef SC_TRACE 885 sc_trace_file * tf = sc_create_vcd_trace_file("my_trace_file"); 886 887 for (int x = 0; x < X_SIZE - 1; x++) { 888 for (int y = 0; y < Y_SIZE; y++) { 889 for (int k = 0; k < 3; k++) { 890 signal_dspin_h_cmd_inc[x][y][k].trace(tf, "dspin_h_cmd_inc"); 891 signal_dspin_h_cmd_dec[x][y][k].trace(tf, "dspin_h_cmd_dec"); 892 } 893 894 for (int k = 0; k < 2; k++) { 895 signal_dspin_h_rsp_inc[x][y][k].trace(tf, "dspin_h_rsp_inc"); 896 signal_dspin_h_rsp_dec[x][y][k].trace(tf, "dspin_h_rsp_dec"); 897 } 898 } 899 } 900 901 for (int y = 0; y < Y_SIZE - 1; y++) { 902 for (int x = 0; x < X_SIZE; x++) { 903 for (int k = 0; k < 3; k++) { 904 signal_dspin_v_cmd_inc[x][y][k].trace(tf, "dspin_v_cmd_inc"); 905 signal_dspin_v_cmd_dec[x][y][k].trace(tf, "dspin_v_cmd_dec"); 906 } 907 908 for (int k = 0; k < 2; k++) { 909 signal_dspin_v_rsp_inc[x][y][k].trace(tf, "dspin_v_rsp_inc"); 910 signal_dspin_v_rsp_dec[x][y][k].trace(tf, "dspin_v_rsp_dec"); 911 } 912 } 913 } 914 915 for (int x = 0; x < (X_SIZE); x++) { 916 for (int y = 0; y < Y_SIZE; y++) { 917 std::ostringstream signame; 918 signame << "cluster" << x << "_" << y; 919 clusters[x][y]->trace(tf, signame.str()); 920 } 921 } 922 #endif 923 924 925 //////////////////////////////////////////////////////// 926 // Simulation 927 /////////////////////////////////////////////////////// 928 929 sc_start(sc_core::sc_time(0, SC_NS)); 930 signal_resetn = false; 931 932 // set network boundaries signals default values 933 // for all boundary clusters 934 for (size_t x = 0; x < X_SIZE ; x++) { 935 for (size_t y = 0; y < Y_SIZE ; y++) { 936 for (size_t face = 0; face < 4; face++) { 937 signal_dspin_bound_cmd_in [x][y][face].write = false; 938 signal_dspin_bound_cmd_in [x][y][face].read = true; 939 signal_dspin_bound_cmd_out[x][y][face].write = false; 940 signal_dspin_bound_cmd_out[x][y][face].read = true; 941 942 signal_dspin_bound_rsp_in [x][y][face].write = false; 943 signal_dspin_bound_rsp_in [x][y][face].read = true; 944 signal_dspin_bound_rsp_out[x][y][face].write = false; 945 signal_dspin_bound_rsp_out[x][y][face].read = true; 946 947 signal_dspin_bound_m2p_in [x][y][face].write = false; 948 signal_dspin_bound_m2p_in [x][y][face].read = true; 949 signal_dspin_bound_m2p_out[x][y][face].write = false; 950 signal_dspin_bound_m2p_out[x][y][face].read = true; 951 952 signal_dspin_bound_p2m_in [x][y][face].write = false; 953 signal_dspin_bound_p2m_in [x][y][face].read = true; 954 signal_dspin_bound_p2m_out[x][y][face].write = false; 955 signal_dspin_bound_p2m_out[x][y][face].read = true; 956 957 signal_dspin_bound_cla_in [x][y][face].write = false; 958 signal_dspin_bound_cla_in [x][y][face].read = true; 959 signal_dspin_bound_cla_out[x][y][face].write = false; 960 signal_dspin_bound_cla_out[x][y][face].read = true; 961 } 962 } 963 } 964 // @M debug fu** 965 clusters[0][0]->signal_dspin_m2p_proc[2].read = true; 966 967 sc_start(sc_core::sc_time(1, SC_NS)); 968 signal_resetn = true; 969 970 if (debug_ok) { 971 #if USE_OPENMP 972 assert(false && "OPEN MP should not be used with debug because of its traces"); 973 #endif 974 975 if (gettimeofday(&t1, NULL) != 0) { 976 perror("gettimeofday"); 977 return EXIT_FAILURE; 978 } 979 980 for (int64_t n = 1; n < ncycles && !stop_called; n++) { 981 if ((n % max_cycles) == 0) { 842 sc_trace_file * tf = sc_create_vcd_trace_file("my_trace_file"); 843 844 for (int x = 0; x < X_SIZE - 1; x++) { 845 for (int y = 0; y < Y_SIZE; y++) { 846 for (int k = 0; k < 3; k++) { 847 signal_dspin_h_cmd_inc[x][y][k].trace(tf, "dspin_h_cmd_inc"); 848 signal_dspin_h_cmd_dec[x][y][k].trace(tf, "dspin_h_cmd_dec"); 849 } 850 851 for (int k = 0; k < 2; k++) { 852 signal_dspin_h_rsp_inc[x][y][k].trace(tf, "dspin_h_rsp_inc"); 853 signal_dspin_h_rsp_dec[x][y][k].trace(tf, "dspin_h_rsp_dec"); 854 } 855 } 856 } 857 858 for (int y = 0; y < Y_SIZE - 1; y++) { 859 for (int x = 0; x < X_SIZE; x++) { 860 for (int k = 0; k < 3; k++) { 861 signal_dspin_v_cmd_inc[x][y][k].trace(tf, "dspin_v_cmd_inc"); 862 signal_dspin_v_cmd_dec[x][y][k].trace(tf, "dspin_v_cmd_dec"); 863 } 864 865 for (int k = 0; k < 2; k++) { 866 signal_dspin_v_rsp_inc[x][y][k].trace(tf, "dspin_v_rsp_inc"); 867 signal_dspin_v_rsp_dec[x][y][k].trace(tf, "dspin_v_rsp_dec"); 868 } 869 } 870 } 871 872 for (int x = 0; x < (X_SIZE); x++) { 873 for (int y = 0; y < Y_SIZE; y++) { 874 std::ostringstream signame; 875 signame << "cluster" << x << "_" << y; 876 clusters[x][y]->trace(tf, signame.str()); 877 } 878 } 879 #endif 880 881 882 //////////////////////////////////////////////////////// 883 // Simulation 884 /////////////////////////////////////////////////////// 885 886 sc_start(sc_core::sc_time(0, SC_NS)); 887 signal_resetn = false; 888 889 // set network boundaries signals default values 890 // for all boundary clusters 891 for (size_t x = 0; x < X_SIZE ; x++) { 892 for (size_t y = 0; y < Y_SIZE ; y++) { 893 for (size_t face = 0; face < 4; face++) { 894 signal_dspin_bound_cmd_in [x][y][face].write = false; 895 signal_dspin_bound_cmd_in [x][y][face].read = true; 896 signal_dspin_bound_cmd_out[x][y][face].write = false; 897 signal_dspin_bound_cmd_out[x][y][face].read = true; 898 899 signal_dspin_bound_rsp_in [x][y][face].write = false; 900 signal_dspin_bound_rsp_in [x][y][face].read = true; 901 signal_dspin_bound_rsp_out[x][y][face].write = false; 902 signal_dspin_bound_rsp_out[x][y][face].read = true; 903 904 signal_dspin_bound_m2p_in [x][y][face].write = false; 905 signal_dspin_bound_m2p_in [x][y][face].read = true; 906 signal_dspin_bound_m2p_out[x][y][face].write = false; 907 signal_dspin_bound_m2p_out[x][y][face].read = true; 908 909 signal_dspin_bound_p2m_in [x][y][face].write = false; 910 signal_dspin_bound_p2m_in [x][y][face].read = true; 911 signal_dspin_bound_p2m_out[x][y][face].write = false; 912 signal_dspin_bound_p2m_out[x][y][face].read = true; 913 914 signal_dspin_bound_cla_in [x][y][face].write = false; 915 signal_dspin_bound_cla_in [x][y][face].read = true; 916 signal_dspin_bound_cla_out[x][y][face].write = false; 917 signal_dspin_bound_cla_out[x][y][face].read = true; 918 } 919 } 920 } 921 // @QM : what is the following line? 922 //clusters[0][0]->signal_dspin_m2p_proc[2].read = true; 923 924 sc_start(sc_core::sc_time(1, SC_NS)); 925 signal_resetn = true; 926 927 if (debug_ok) { 928 #ifdef USE_OPENMP 929 assert(false && "OPEN MP should not be used with debug because of its traces"); 930 #endif 931 932 if (gettimeofday(&t1, NULL) != 0) { 933 perror("gettimeofday"); 934 return EXIT_FAILURE; 935 } 936 937 for (int64_t n = 1; n < ncycles && !stop_called; n++) { 938 if ((n % max_cycles) == 0) { 939 940 if (gettimeofday(&t2, NULL) != 0) { 941 perror("gettimeofday"); 942 return EXIT_FAILURE; 943 } 944 945 ms1 = (uint64_t) t1.tv_sec * 1000ULL + (uint64_t) t1.tv_usec / 1000; 946 ms2 = (uint64_t) t2.tv_sec * 1000ULL + (uint64_t) t2.tv_usec / 1000; 947 std::cerr << "platform clock frequency " << (double) 5000000 / (double) (ms2 - ms1) << "Khz" << std::endl; 948 949 if (gettimeofday(&t1, NULL) != 0) { 950 perror("gettimeofday"); 951 return EXIT_FAILURE; 952 } 953 } 954 955 956 if (n == reset_counters) { 957 for (size_t x = 0; x < (X_SIZE); x++) { 958 for (size_t y = 0; y < Y_SIZE; y++) { 959 clusters[x][y]->memc->reset_counters(); 960 } 961 } 962 } 963 964 if (n == dump_counters) { 965 for (size_t x = 0; x < (X_SIZE); x++) { 966 for (size_t y = 0; y < Y_SIZE; y++) { 967 clusters[x][y]->memc->print_stats(true, false); 968 } 969 } 970 } 971 972 if ((n > debug_from) and (n % debug_period == 0)) { 973 std::cout << "****************** cycle " << std::dec << n ; 974 std::cout << "************************************************" << std::endl; 975 976 for (size_t x = 0; x < X_SIZE ; x++) { 977 for (size_t y = 0; y < Y_SIZE ; y++) { 978 for (int proc = 0; proc < NB_PROCS_MAX; proc++) { 979 clusters[x][y]->proc[proc]->print_trace(); 980 std::ostringstream proc_signame; 981 proc_signame << "[SIG]PROC_" << x << "_" << y << "_" << proc ; 982 std::ostringstream p2m_signame; 983 p2m_signame << "[SIG]PROC_" << x << "_" << y << "_" << proc << " P2M"; 984 std::ostringstream m2p_signame; 985 m2p_signame << "[SIG]PROC_" << x << "_" << y << "_" << proc << " M2P"; 986 987 clusters[x][y]->signal_vci_ini_proc[proc].print_trace(proc_signame.str()); 988 clusters[x][y]->signal_dspin_p2m_proc[proc].print_trace(p2m_signame.str()); 989 clusters[x][y]->signal_dspin_m2p_proc[proc].print_trace(m2p_signame.str()); 990 } 991 992 clusters[x][y]->memc->print_trace(); 993 994 std::ostringstream smemc; 995 smemc << "[SIG]MEMC_" << x << "_" << y; 996 std::ostringstream sxram; 997 sxram << "[SIG]XRAM_" << x << "_" << y; 998 std::ostringstream sm2p; 999 sm2p << "[SIG]MEMC_" << x << "_" << y << " M2P"; 1000 std::ostringstream sp2m; 1001 sp2m << "[SIG]MEMC_" << x << "_" << y << " P2M"; 1002 1003 clusters[x][y]->signal_vci_tgt_memc.print_trace(smemc.str()); 1004 clusters[x][y]->signal_vci_xram.print_trace(sxram.str()); 1005 clusters[x][y]->signal_dspin_p2m_memc.print_trace(sp2m.str()); 1006 clusters[x][y]->signal_dspin_m2p_memc.print_trace(sm2p.str()); 1007 } 1008 } 1009 } 1010 1011 sc_start(sc_core::sc_time(1, SC_NS)); 1012 } 1013 } 1014 else { 1015 int64_t n = 0; 1016 while (!stop_called && n != ncycles) { 1017 if (gettimeofday(&t1, NULL) != 0) { 1018 perror("gettimeofday"); 1019 return EXIT_FAILURE; 1020 } 1021 int64_t nb_cycles = min(max_cycles, ncycles - n); 1022 if (do_reset_counters) { 1023 nb_cycles = min(nb_cycles, reset_counters - n); 1024 } 1025 if (do_dump_counters) { 1026 nb_cycles = min(nb_cycles, dump_counters - n); 1027 } 1028 1029 sc_start(sc_core::sc_time(nb_cycles, SC_NS)); 1030 n += nb_cycles; 1031 1032 if (do_reset_counters && n == reset_counters) { 1033 // Reseting counters 1034 for (size_t x = 0; x < (X_SIZE); x++) { 1035 for (size_t y = 0; y < Y_SIZE; y++) { 1036 clusters[x][y]->memc->reset_counters(); 1037 } 1038 } 1039 do_reset_counters = false; 1040 } 1041 1042 if (do_dump_counters && n == dump_counters) { 1043 // Dumping counters 1044 for (size_t x = 0; x < (X_SIZE); x++) { 1045 for (size_t y = 0; y < Y_SIZE; y++) { 1046 clusters[x][y]->memc->print_stats(true, false); 1047 } 1048 } 1049 do_dump_counters = false; 1050 } 1051 982 1052 983 1053 if (gettimeofday(&t2, NULL) != 0) { 984 perror("gettimeofday"); 985 return EXIT_FAILURE; 986 } 987 1054 perror("gettimeofday"); 1055 return EXIT_FAILURE; 1056 } 988 1057 ms1 = (uint64_t) t1.tv_sec * 1000ULL + (uint64_t) t1.tv_usec / 1000; 989 1058 ms2 = (uint64_t) t2.tv_sec * 1000ULL + (uint64_t) t2.tv_usec / 1000; 990 std::cerr << "platform clock frequency " << (double) 5000000 / (double) (ms2 - ms1) << "Khz" << std::endl; 991 992 if (gettimeofday(&t1, NULL) != 0) 993 { 994 perror("gettimeofday"); 995 return EXIT_FAILURE; 996 } 997 } 998 999 1000 if (n == reset_counters) { 1001 for (size_t x = 0; x < (X_SIZE); x++) { 1002 for (size_t y = 0; y < Y_SIZE; y++) { 1003 clusters[x][y]->memc->reset_counters(); 1004 } 1005 } 1006 } 1007 1008 if (n == dump_counters) { 1009 for (size_t x = 0; x < (X_SIZE); x++) { 1010 for (size_t y = 0; y < Y_SIZE; y++) { 1011 clusters[x][y]->memc->print_stats(true, false); 1012 } 1013 } 1014 } 1015 1016 if ((n > debug_from) and (n % debug_period == 0)) { 1017 std::cout << "****************** cycle " << std::dec << n ; 1018 std::cout << "************************************************" << std::endl; 1019 1020 for (size_t x = 0; x < X_SIZE ; x++) { 1021 for (size_t y = 0; y < Y_SIZE ; y++) { 1022 for (int proc = 0; proc < NB_PROCS_MAX; proc++) { 1023 if (x == 0 && y == 0 && proc == 2) { 1024 continue; 1025 } 1026 clusters[x][y]->proc[proc]->print_trace(); 1027 std::ostringstream proc_signame; 1028 proc_signame << "[SIG]PROC_" << x << "_" << y << "_" << proc ; 1029 std::ostringstream p2m_signame; 1030 p2m_signame << "[SIG]PROC_" << x << "_" << y << "_" << proc << " P2M"; 1031 std::ostringstream m2p_signame; 1032 m2p_signame << "[SIG]PROC_" << x << "_" << y << "_" << proc << " M2P"; 1033 1034 clusters[x][y]->signal_vci_ini_proc[proc].print_trace(proc_signame.str()); 1035 clusters[x][y]->signal_dspin_p2m_proc[proc].print_trace(p2m_signame.str()); 1036 clusters[x][y]->signal_dspin_m2p_proc[proc].print_trace(m2p_signame.str()); 1037 } 1038 1039 clusters[x][y]->memc->print_trace(); 1040 1041 std::ostringstream smemc; 1042 smemc << "[SIG]MEMC_" << x << "_" << y; 1043 std::ostringstream sxram; 1044 sxram << "[SIG]XRAM_" << x << "_" << y; 1045 std::ostringstream sm2p; 1046 sm2p << "[SIG]MEMC_" << x << "_" << y << " M2P"; 1047 std::ostringstream sp2m; 1048 sp2m << "[SIG]MEMC_" << x << "_" << y << " P2M"; 1049 1050 clusters[x][y]->signal_vci_tgt_memc.print_trace(smemc.str()); 1051 clusters[x][y]->signal_vci_xram.print_trace(sxram.str()); 1052 clusters[x][y]->signal_dspin_p2m_memc.print_trace(sp2m.str()); 1053 clusters[x][y]->signal_dspin_m2p_memc.print_trace(sm2p.str()); 1054 } 1055 } 1056 } 1057 1058 sc_start(sc_core::sc_time(1, SC_NS)); 1059 } 1060 } 1061 else { 1062 int64_t n = 0; 1063 while (!stop_called && n != ncycles) { 1064 if (gettimeofday(&t1, NULL) != 0) { 1065 perror("gettimeofday"); 1066 return EXIT_FAILURE; 1067 } 1068 int64_t nb_cycles = min(max_cycles, ncycles - n); 1069 if (do_reset_counters) { 1070 nb_cycles = min(nb_cycles, reset_counters - n); 1071 } 1072 if (do_dump_counters) { 1073 nb_cycles = min(nb_cycles, dump_counters - n); 1074 } 1075 1076 sc_start(sc_core::sc_time(nb_cycles, SC_NS)); 1077 n += nb_cycles; 1078 1079 if (do_reset_counters && n == reset_counters) { 1080 // Reseting counters 1081 for (size_t x = 0; x < (X_SIZE); x++) { 1082 for (size_t y = 0; y < Y_SIZE; y++) { 1083 clusters[x][y]->memc->reset_counters(); 1084 } 1085 } 1086 do_reset_counters = false; 1087 } 1088 1089 if (do_dump_counters && n == dump_counters) { 1090 // Dumping counters 1091 for (size_t x = 0; x < (X_SIZE); x++) { 1092 for (size_t y = 0; y < Y_SIZE; y++) { 1093 clusters[x][y]->memc->print_stats(true, false); 1094 } 1095 } 1096 do_dump_counters = false; 1097 } 1098 1099 1100 if (gettimeofday(&t2, NULL) != 0) { 1101 perror("gettimeofday"); 1102 return EXIT_FAILURE; 1103 } 1104 ms1 = (uint64_t) t1.tv_sec * 1000ULL + (uint64_t) t1.tv_usec / 1000; 1105 ms2 = (uint64_t) t2.tv_sec * 1000ULL + (uint64_t) t2.tv_usec / 1000; 1106 std::cerr << std::dec << "cycle " << n << " platform clock frequency " << (double) nb_cycles / (double) (ms2 - ms1) << "Khz" << std::endl; 1107 } 1108 } 1109 1110 1111 // Free memory 1112 for (size_t i = 0; i < (X_SIZE * Y_SIZE); i++) { 1113 size_t x = i / Y_SIZE; 1114 size_t y = i % Y_SIZE; 1115 delete clusters[x][y]; 1116 } 1117 1118 dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_h_cmd_inc, X_SIZE - 1, Y_SIZE); 1119 dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_h_cmd_dec, X_SIZE - 1, Y_SIZE); 1120 1121 dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_h_rsp_inc, X_SIZE - 1, Y_SIZE); 1122 dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_h_rsp_dec, X_SIZE - 1, Y_SIZE); 1123 1124 dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_h_m2p_inc, X_SIZE - 1, Y_SIZE); 1125 dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_h_m2p_dec, X_SIZE - 1, Y_SIZE); 1126 1127 dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_h_p2m_inc, X_SIZE - 1, Y_SIZE); 1128 dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_h_p2m_dec, X_SIZE - 1, Y_SIZE); 1129 1130 dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_h_cla_inc, X_SIZE - 1, Y_SIZE); 1131 dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_h_cla_dec, X_SIZE - 1, Y_SIZE); 1132 1133 dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_v_cmd_inc, X_SIZE, Y_SIZE - 1); 1134 dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_v_cmd_dec, X_SIZE, Y_SIZE - 1); 1135 1136 dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_v_rsp_inc, X_SIZE, Y_SIZE - 1); 1137 dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_v_rsp_dec, X_SIZE, Y_SIZE - 1); 1138 1139 dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_v_m2p_inc, X_SIZE, Y_SIZE - 1); 1140 dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_v_m2p_dec, X_SIZE, Y_SIZE - 1); 1141 1142 dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_v_p2m_inc, X_SIZE, Y_SIZE - 1); 1143 dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_v_p2m_dec, X_SIZE, Y_SIZE - 1); 1144 1145 dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_v_cla_inc, X_SIZE, Y_SIZE - 1); 1146 dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_v_cla_dec, X_SIZE, Y_SIZE - 1); 1147 1148 dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_bound_cmd_in, X_SIZE, Y_SIZE, 4); 1149 dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_bound_cmd_out, X_SIZE, Y_SIZE, 4); 1150 1151 dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_bound_rsp_in, X_SIZE, Y_SIZE, 4); 1152 dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_bound_rsp_out, X_SIZE, Y_SIZE, 4); 1153 1154 dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_bound_m2p_in, X_SIZE, Y_SIZE, 4); 1155 dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_bound_m2p_out, X_SIZE, Y_SIZE, 4); 1156 1157 dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_bound_p2m_in, X_SIZE, Y_SIZE, 4); 1158 dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_bound_p2m_out, X_SIZE, Y_SIZE, 4); 1159 1160 dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_bound_cla_in, X_SIZE, Y_SIZE, 4); 1161 dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_bound_cla_out, X_SIZE, Y_SIZE, 4); 1162 1163 return EXIT_SUCCESS; 1059 std::cerr << std::dec << "cycle " << n << " platform clock frequency " << (double) nb_cycles / (double) (ms2 - ms1) << "Khz" << std::endl; 1060 } 1061 } 1062 1063 1064 // Free memory 1065 for (size_t i = 0; i < (X_SIZE * Y_SIZE); i++) { 1066 size_t x = i / Y_SIZE; 1067 size_t y = i % Y_SIZE; 1068 delete clusters[x][y]; 1069 } 1070 1071 dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_h_cmd_inc, X_SIZE - 1, Y_SIZE); 1072 dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_h_cmd_dec, X_SIZE - 1, Y_SIZE); 1073 1074 dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_h_rsp_inc, X_SIZE - 1, Y_SIZE); 1075 dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_h_rsp_dec, X_SIZE - 1, Y_SIZE); 1076 1077 dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_h_m2p_inc, X_SIZE - 1, Y_SIZE); 1078 dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_h_m2p_dec, X_SIZE - 1, Y_SIZE); 1079 1080 dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_h_p2m_inc, X_SIZE - 1, Y_SIZE); 1081 dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_h_p2m_dec, X_SIZE - 1, Y_SIZE); 1082 1083 dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_h_cla_inc, X_SIZE - 1, Y_SIZE); 1084 dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_h_cla_dec, X_SIZE - 1, Y_SIZE); 1085 1086 dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_v_cmd_inc, X_SIZE, Y_SIZE - 1); 1087 dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_v_cmd_dec, X_SIZE, Y_SIZE - 1); 1088 1089 dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_v_rsp_inc, X_SIZE, Y_SIZE - 1); 1090 dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_v_rsp_dec, X_SIZE, Y_SIZE - 1); 1091 1092 dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_v_m2p_inc, X_SIZE, Y_SIZE - 1); 1093 dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_v_m2p_dec, X_SIZE, Y_SIZE - 1); 1094 1095 dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_v_p2m_inc, X_SIZE, Y_SIZE - 1); 1096 dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_v_p2m_dec, X_SIZE, Y_SIZE - 1); 1097 1098 dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_v_cla_inc, X_SIZE, Y_SIZE - 1); 1099 dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_v_cla_dec, X_SIZE, Y_SIZE - 1); 1100 1101 dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_bound_cmd_in, X_SIZE, Y_SIZE, 4); 1102 dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_bound_cmd_out, X_SIZE, Y_SIZE, 4); 1103 1104 dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_bound_rsp_in, X_SIZE, Y_SIZE, 4); 1105 dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_bound_rsp_out, X_SIZE, Y_SIZE, 4); 1106 1107 dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_bound_m2p_in, X_SIZE, Y_SIZE, 4); 1108 dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_bound_m2p_out, X_SIZE, Y_SIZE, 4); 1109 1110 dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_bound_p2m_in, X_SIZE, Y_SIZE, 4); 1111 dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_bound_p2m_out, X_SIZE, Y_SIZE, 4); 1112 1113 dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_bound_cla_in, X_SIZE, Y_SIZE, 4); 1114 dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_bound_cla_out, X_SIZE, Y_SIZE, 4); 1115 1116 return EXIT_SUCCESS; 1164 1117 } 1165 1118 1166 1119 1167 1120 void handler(int dummy = 0) { 1168 stop_called = true;1169 sc_stop();1121 stop_called = true; 1122 sc_stop(); 1170 1123 } 1171 1124 … … 1173 1126 1174 1127 int sc_main (int argc, char *argv[]) { 1175 signal(SIGINT, handler); 1176 signal(SIGPIPE, voidhandler); 1177 1178 try { 1179 return _main(argc, argv); 1180 } catch (std::exception &e) { 1181 std::cout << e.what() << std::endl; 1182 } 1183 catch (...) { 1184 std::cout << "Unknown exception occured" << std::endl; 1185 throw; 1186 } 1187 return 1; 1128 signal(SIGINT, handler); 1129 signal(SIGPIPE, voidhandler); 1130 1131 try { 1132 int ret =_main(argc, argv); 1133 if (!stop_called) { 1134 sc_stop(); 1135 sc_start(sc_core::sc_time(0, SC_NS)); 1136 } 1137 return ret; 1138 } catch (std::exception &e) { 1139 std::cout << e.what() << std::endl; 1140 } 1141 catch (...) { 1142 std::cout << "Unknown exception occured" << std::endl; 1143 throw; 1144 } 1145 return 1; 1188 1146 } 1189 1147 1190 1148 1191 1149 // Local Variables: 1192 // tab-width: 31193 // c-basic-offset: 31150 // tab-width: 4 1151 // c-basic-offset: 4 1194 1152 // c-file-offsets:((innamespace . 0)(inline-open . 0)) 1195 1153 // indent-tabs-mode: nil 1196 1154 // End: 1197 1155 1198 // vim: filetype=cpp:expandtab:shiftwidth= 3:tabstop=3:softtabstop=31156 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=4:softtabstop=4
Note: See TracChangeset
for help on using the changeset viewer.