#include #include #include #include #include #include #include "arithmetics.h" #include "mapping_table.h" #include "alloc_elems.h" #include "vci_simple_ram.h" #include "vci_local_ring_fast.h" #include "virtual_dspin_router.h" #include "vci_synthetic_initiator.h" // MESH SIZE #define X_MAX 2 #define Y_MAX 2 #define N_CLUSTERS X_MAX*Y_MAX // FLIT_WIDTH #define WIDTH_CMD 40 #define WIDTH_RSP 33 // Face of each DSPIN Router #define NORTH 0 #define SOUTH 1 #define EAST 2 #define WEST 3 #define LOCAL 4 // VCI parameters #define cell_width 4 #define plen_width 8 #define address_width 32 #define error_width 1 #define clen_width 1 #define rflag_width 1 #define srcid_width 11 #define pktid_width 4 #define trdid_width 4 #define wrplen_width 1 // Adress of targets #define TARGET_ADDR 0x00000000 #define TARGET_SIZE 0x400 int _main(int argc, char *argv[]) { using namespace sc_core; // Avoid repeating these everywhere using soclib::common::IntTab; using soclib::common::Segment; using soclib::common::uint32_log2; // Define VCI parameters typedef soclib::caba::VciParams vci_param; //soclib::common::Loader loader(); // Mapping table primary network soclib::common::MappingTable maptab0(address_width, IntTab(srcid_width-1 ,1), IntTab(srcid_width-1 ,1), 0xFFC0000); soclib::common::MappingTable maptab1(address_width, IntTab(srcid_width-1 ,1), IntTab(srcid_width-1 ,1), 0xFFC0000); for(int i = 0 ; i < Y_MAX ; i++){ for(int j = 0 ; j < X_MAX ; j++){ std::ostringstream str0; std::ostringstream str1; str0 << "Target_c0_" << (i*X_MAX+j) ; str1 << "Target_c1_" << (i*X_MAX+j) ; maptab0.add(Segment(str0.str(), TARGET_ADDR + ((i*X_MAX+j) << (address_width-srcid_width+1)), TARGET_SIZE, IntTab((i*X_MAX+j),0), false)); maptab1.add(Segment(str1.str(), TARGET_ADDR + ((i*X_MAX+j) << (address_width-srcid_width+1)), TARGET_SIZE, IntTab((i*X_MAX+j),0), false)); } } std::cout << maptab0 << std::endl; // Signals sc_clock signal_clk("clk"); sc_signal signal_resetn("resetn"); soclib::caba::VciSignals ** signal_vci_ini_synth_c0 = soclib::common::alloc_elems >("signal_vci_ini_synth_c0", 2, N_CLUSTERS); soclib::caba::VciSignals ** signal_vci_ini_synth_c1 = soclib::common::alloc_elems >("signal_vci_ini_synth_c1", 2, N_CLUSTERS); /////////////////////////////////////////////////////////////// // VDSPIN Signals : one level for in and out, one level for X length in the mesh, // one level for Y length in the mesh, last level for each port of the router /////////////////////////////////////////////////////////////// soclib::caba::DspinSignals **** dspin_signals_cmd_c0 = soclib::common::alloc_elems >("Dspin_cmd_signals_channel_0", 2, Y_MAX, X_MAX, 5 ); soclib::caba::DspinSignals **** dspin_signals_cmd_c1 = soclib::common::alloc_elems >("Dspin_cmd_signals_channel_1", 2, Y_MAX, X_MAX, 5 ); soclib::caba::DspinSignals **** dspin_signals_rsp_c0 = soclib::common::alloc_elems >("Dspin_rsp_signals_channel_0", 2, Y_MAX, X_MAX, 5 ); soclib::caba::DspinSignals **** dspin_signals_rsp_c1 = soclib::common::alloc_elems >("Dspin_rsp_signals_channel_2", 2, Y_MAX, X_MAX, 5 ); //soclib::caba::VciSignals * signal_vci_tgt_proc = soclib::common::alloc_elems >("signal_vci_tgt_proc", N_CLUSTERS); // N_CLUSTERS ring. soclib::caba::VciLocalRingFast * local_ring_c0 = (soclib::caba::VciLocalRingFast *) malloc(sizeof(soclib::caba::VciLocalRingFast ) * N_CLUSTERS) ; soclib::caba::VciLocalRingFast * local_ring_c1 = (soclib::caba::VciLocalRingFast *) malloc(sizeof(soclib::caba::VciLocalRingFast ) * N_CLUSTERS) ; for(int i = 0 ; i < N_CLUSTERS ; i++){ // ringid, fifo, fifo, nb_init, nb_tgt std::cout << "Passe " << i << " pour instanciation ring" << std::endl; std::ostringstream str0; std::ostringstream str1; str0 << "cluster_c0_" << i ; str1 << "cluster_c1_" << i ; new(&local_ring_c0[i]) soclib::caba::VciLocalRingFast (str0.str().c_str() ,maptab0, IntTab(i), 2, 18, 1, 1); new(&local_ring_c1[i]) soclib::caba::VciLocalRingFast (str1.str().c_str() ,maptab1, IntTab(i), 2, 18, 1, 1); } // Virtual dspin routers soclib::caba::VirtualDspinRouter ** routers_cmd = (soclib::caba::VirtualDspinRouter **) malloc(sizeof(soclib::caba::VirtualDspinRouter *) * Y_MAX); soclib::caba::VirtualDspinRouter ** routers_rsp = (soclib::caba::VirtualDspinRouter **) malloc(sizeof(soclib::caba::VirtualDspinRouter *) * Y_MAX); for(int i = 0; i < Y_MAX; i++ ){ routers_cmd[i] = (soclib::caba::VirtualDspinRouter * ) malloc(sizeof(soclib::caba::VirtualDspinRouter) * X_MAX); routers_rsp[i] = (soclib::caba::VirtualDspinRouter * ) malloc(sizeof(soclib::caba::VirtualDspinRouter) * X_MAX); for(int j = 0; j < X_MAX; j++){ std::cout << "Passe " << i << j << " pour instanciation vdspin" << std::endl; new(&routers_cmd[i][j]) soclib::caba::VirtualDspinRouter ("VDspinRouterCMD" + i + j, j, i, soclib::common::uint32_log2(X_MAX), soclib::common::uint32_log2(Y_MAX), 4, 4); new(&routers_rsp[i][j]) soclib::caba::VirtualDspinRouter ("VDspinRouterRSP" + i + j, j, i, soclib::common::uint32_log2(X_MAX), soclib::common::uint32_log2(Y_MAX), 4, 4); } } /////////////////////////////////////////////////////////////// // Components /////////////////////////////////////////////////////////////// // N_CLUSTERS VCI Synthetic Initiator (1 initiator per cluster/network) soclib::caba::VciSyntheticInitiator * initiator_c0 = (soclib::caba::VciSyntheticInitiator *) malloc(sizeof(soclib::caba::VciSyntheticInitiator )* N_CLUSTERS); soclib::caba::VciSyntheticInitiator * initiator_c1 = (soclib::caba::VciSyntheticInitiator *) malloc(sizeof(soclib::caba::VciSyntheticInitiator )* N_CLUSTERS); for(int i = 0 ; i < Y_MAX; i++) for(int j = 0 ; j < X_MAX ; j++){ std::cout << "Passe " << i << j << " pour instanciation synthetic_init" << std::endl; std::ostringstream str0; std::ostringstream str1; str0 << "Initiator_c0_" << (i*X_MAX+j) ; str1 << "Initiator_c1_" << (i*X_MAX+j) ; new(&initiator_c0[X_MAX*i+j]) soclib::caba::VciSyntheticInitiator (str0.str().c_str() , maptab0, IntTab(i*X_MAX+j,0), 16, 0.5, 2, X_MAX, Y_MAX ); //, 0, 0, 0, 0, 0); new(&initiator_c1[X_MAX*i+j]) soclib::caba::VciSyntheticInitiator (str1.str().c_str() , maptab0, IntTab(i*X_MAX+j,0), 16, 0.5, 2, X_MAX, Y_MAX ); //, 0, 0, 0, 0, 0); } soclib::caba::VciSimpleRam * ram_c0 = (soclib::caba::VciSimpleRam *) malloc(sizeof(soclib::caba::VciSimpleRam) * N_CLUSTERS); soclib::caba::VciSimpleRam * ram_c1 = (soclib::caba::VciSimpleRam *) malloc(sizeof(soclib::caba::VciSimpleRam) * N_CLUSTERS); for(int i = 0 ; i < Y_MAX ; i++) for(int j = 0 ; j < X_MAX ; j++){ std::cout << "Passe " << i << j << " pour instanciation Ram" << std::endl; std::ostringstream str0; std::ostringstream str1; str0 << "Ram_c0_" << (i*X_MAX+j) ; str1 << "Ram_c1_" << (i*X_MAX+j) ; new(&ram_c0[X_MAX*i+j]) soclib::caba::VciSimpleRam (str0.str().c_str() , IntTab(i*X_MAX+j,0), maptab0, soclib::common::Loader(), 0); new(&ram_c1[X_MAX*i+j]) soclib::caba::VciSimpleRam (str1.str().c_str() , IntTab(i*X_MAX+j,0), maptab1, soclib::common::Loader(), 0); } /////////////////////////////////////////////////////////////// // Connection of Synthetic Initiator to each local ring per cluster /////////////////////////////////////////////////////////////// for(int i = 0 ; i < N_CLUSTERS ; i++){ local_ring_c0[i].p_clk(signal_clk); local_ring_c0[i].p_resetn(signal_resetn); local_ring_c0[i].p_to_initiator[0](signal_vci_ini_synth_c0[0][i]); local_ring_c0[i].p_to_target[0](signal_vci_ini_synth_c0[1][i]); initiator_c0[i].p_clk(signal_clk); initiator_c0[i].p_resetn(signal_resetn); initiator_c0[i].p_vci(signal_vci_ini_synth_c0[0][i]); ram_c0[i].p_clk(signal_clk); ram_c0[i].p_resetn(signal_resetn); ram_c0[i].p_vci(signal_vci_ini_synth_c0[1][i]); local_ring_c1[i].p_clk(signal_clk); local_ring_c1[i].p_resetn(signal_resetn); local_ring_c1[i].p_to_initiator[0](signal_vci_ini_synth_c1[0][i]); local_ring_c1[i].p_to_target[0](signal_vci_ini_synth_c1[1][i]); initiator_c1[i].p_clk(signal_clk); initiator_c1[i].p_resetn(signal_resetn); initiator_c1[i].p_vci(signal_vci_ini_synth_c1[0][i]); ram_c1[i].p_clk(signal_clk); ram_c1[i].p_resetn(signal_resetn); ram_c1[i].p_vci(signal_vci_ini_synth_c1[1][i]); } /////////////////////////////////////////////////////////////// // Connection of each VDspin Router to each local ring and // neighbors VDspin Router /////////////////////////////////////////////////////////////// for(int i = 0; i < Y_MAX ; i++){ for(int j = 0; j < X_MAX ; j++){ routers_cmd[i][j].p_clk(signal_clk); routers_cmd[i][j].p_resetn(signal_resetn); routers_rsp[i][j].p_clk(signal_clk); routers_rsp[i][j].p_resetn(signal_resetn); local_ring_c0[i*X_MAX+j].p_gate_cmd_in( dspin_signals_cmd_c0[0][i][j][LOCAL]); local_ring_c0[i*X_MAX+j].p_gate_cmd_out(dspin_signals_cmd_c0[1][i][j][LOCAL] ); local_ring_c0[i*X_MAX+j].p_gate_rsp_in( dspin_signals_rsp_c0[0][i][j][LOCAL]); local_ring_c0[i*X_MAX+j].p_gate_rsp_out(dspin_signals_rsp_c0[1][i][j][LOCAL] ); local_ring_c1[i*X_MAX+j].p_gate_cmd_in( dspin_signals_cmd_c1[0][i][j][LOCAL]); local_ring_c1[i*X_MAX+j].p_gate_cmd_out(dspin_signals_cmd_c1[1][i][j][LOCAL] ); local_ring_c1[i*X_MAX+j].p_gate_rsp_in( dspin_signals_rsp_c1[0][i][j][LOCAL]); local_ring_c1[i*X_MAX+j].p_gate_rsp_out(dspin_signals_rsp_c1[1][i][j][LOCAL] ); for(int k = 0; k < 5; k++){ if(i == 0){ if(j == 0){ routers_cmd[i][j].p_out[0][k](dspin_signals_cmd_c0[0][i][j][k]); routers_cmd[i][j].p_out[1][k](dspin_signals_cmd_c1[0][i][j][k]); routers_cmd[i][j].p_in[0][k](dspin_signals_cmd_c0[1][i][j][k]); routers_cmd[i][j].p_in[1][k](dspin_signals_cmd_c1[1][i][j][k]); routers_rsp[i][j].p_out[0][k](dspin_signals_rsp_c0[0][i][j][k]); routers_rsp[i][j].p_out[1][k](dspin_signals_rsp_c1[0][i][j][k]); routers_rsp[i][j].p_in[0][k](dspin_signals_rsp_c0[1][i][j][k]); routers_rsp[i][j].p_in[1][k](dspin_signals_rsp_c1[1][i][j][k]); } else { if(k == WEST){ routers_cmd[i][j].p_out[0][k](dspin_signals_cmd_c0[1][i][j-1][EAST]); routers_cmd[i][j].p_out[1][k](dspin_signals_cmd_c1[1][i][j-1][EAST]); routers_cmd[i][j].p_in[0][k](dspin_signals_cmd_c0[0][i][j-1][EAST]); routers_cmd[i][j].p_in[1][k](dspin_signals_cmd_c1[0][i][j-1][EAST]); routers_rsp[i][j].p_out[0][k](dspin_signals_rsp_c0[1][i][j-1][EAST]); routers_rsp[i][j].p_out[1][k](dspin_signals_rsp_c1[1][i][j-1][EAST]); routers_rsp[i][j].p_in[0][k](dspin_signals_rsp_c0[0][i][j-1][EAST]); routers_rsp[i][j].p_in[1][k](dspin_signals_rsp_c1[0][i][j-1][EAST]); } else { routers_cmd[i][j].p_out[0][k](dspin_signals_cmd_c0[0][i][j][k]); routers_cmd[i][j].p_out[1][k](dspin_signals_cmd_c1[0][i][j][k]); routers_cmd[i][j].p_in[0][k](dspin_signals_cmd_c0[1][i][j][k]); routers_cmd[i][j].p_in[1][k](dspin_signals_cmd_c1[1][i][j][k]); routers_rsp[i][j].p_out[0][k](dspin_signals_rsp_c0[0][i][j][k]); routers_rsp[i][j].p_out[1][k](dspin_signals_rsp_c1[0][i][j][k]); routers_rsp[i][j].p_in[0][k](dspin_signals_rsp_c0[1][i][j][k]); routers_rsp[i][j].p_in[1][k](dspin_signals_rsp_c1[1][i][j][k]); } } } else { if(k == SOUTH){ routers_cmd[i][j].p_out[0][k](dspin_signals_cmd_c0[1][i-1][j][NORTH]); routers_cmd[i][j].p_out[1][k](dspin_signals_cmd_c1[1][i-1][j][NORTH]); routers_cmd[i][j].p_in[0][k](dspin_signals_cmd_c0[0][i-1][j][NORTH]); routers_cmd[i][j].p_in[1][k](dspin_signals_cmd_c1[0][i-1][j][NORTH]); routers_rsp[i][j].p_out[0][k](dspin_signals_rsp_c0[1][i-1][j][NORTH]); routers_rsp[i][j].p_out[1][k](dspin_signals_rsp_c1[1][i-1][j][NORTH]); routers_rsp[i][j].p_in[0][k](dspin_signals_rsp_c0[0][i-1][j][NORTH]); routers_rsp[i][j].p_in[1][k](dspin_signals_rsp_c1[0][i-1][j][NORTH]); } else if(k == WEST){ if(j == 0){ routers_cmd[i][j].p_out[0][k](dspin_signals_cmd_c0[0][i][j][k]); routers_cmd[i][j].p_out[1][k](dspin_signals_cmd_c1[0][i][j][k]); routers_cmd[i][j].p_in[0][k](dspin_signals_cmd_c0[1][i][j][k]); routers_cmd[i][j].p_in[1][k](dspin_signals_cmd_c1[1][i][j][k]); routers_rsp[i][j].p_out[0][k](dspin_signals_rsp_c0[0][i][j][k]); routers_rsp[i][j].p_out[1][k](dspin_signals_rsp_c1[0][i][j][k]); routers_rsp[i][j].p_in[0][k](dspin_signals_rsp_c0[1][i][j][k]); routers_rsp[i][j].p_in[1][k](dspin_signals_rsp_c1[1][i][j][k]); } else { routers_cmd[i][j].p_out[0][k](dspin_signals_cmd_c0[1][i][j-1][EAST]); routers_cmd[i][j].p_out[1][k](dspin_signals_cmd_c1[1][i][j-1][EAST]); routers_cmd[i][j].p_in[0][k](dspin_signals_cmd_c0[0][i][j-1][EAST]); routers_cmd[i][j].p_in[1][k](dspin_signals_cmd_c1[0][i][j-1][EAST]); routers_rsp[i][j].p_out[0][k](dspin_signals_rsp_c0[1][i][j-1][EAST]); routers_rsp[i][j].p_out[1][k](dspin_signals_rsp_c1[1][i][j-1][EAST]); routers_rsp[i][j].p_in[0][k](dspin_signals_rsp_c0[0][i][j-1][EAST]); routers_rsp[i][j].p_in[1][k](dspin_signals_rsp_c1[0][i][j-1][EAST]); } } else { routers_cmd[i][j].p_out[0][k](dspin_signals_cmd_c0[0][i][j][k]); routers_cmd[i][j].p_out[1][k](dspin_signals_cmd_c1[0][i][j][k]); routers_cmd[i][j].p_in[0][k](dspin_signals_cmd_c0[1][i][j][k]); routers_cmd[i][j].p_in[1][k](dspin_signals_cmd_c1[1][i][j][k]); routers_rsp[i][j].p_out[0][k](dspin_signals_rsp_c0[0][i][j][k]); routers_rsp[i][j].p_out[1][k](dspin_signals_rsp_c1[0][i][j][k]); routers_rsp[i][j].p_in[0][k](dspin_signals_rsp_c0[1][i][j][k]); routers_rsp[i][j].p_in[1][k](dspin_signals_rsp_c1[1][i][j][k]); } } } } } //////////////////////////////////////////////////////// //////////////////////////////////////////////// // Simulation Loop // //////////////////////////////////////////////// int ncycles; sc_start(sc_core::sc_time(0, SC_NS)); signal_resetn = false; sc_start(sc_core::sc_time(1, SC_NS)); signal_resetn = true; while(1) { sc_start(sc_core::sc_time(100000, SC_NS)); } return EXIT_SUCCESS; } int sc_main (int argc, char *argv[]) { try { return _main(argc, argv); } catch (std::exception &e) { std::cout << e.what() << std::endl; } catch (...) { std::cout << "Unknown exception occured" << std::endl; throw; } return 1; }