[327] | 1 | #include <systemc> |
---|
| 2 | #include <sys/time.h> |
---|
| 3 | #include <iostream> |
---|
| 4 | #include <cstdlib> |
---|
| 5 | #include <cstdarg> |
---|
| 6 | |
---|
| 7 | #include "mapping_table.h" |
---|
| 8 | #include "dspin_simple_ring_fast_c.h" |
---|
| 9 | #include "soclib_vci_initiator.h" |
---|
| 10 | #include "soclib_vci_target.h" |
---|
| 11 | #include "alloc_elems.h" |
---|
| 12 | #include "vci_param.h" |
---|
| 13 | |
---|
| 14 | #define SRCID_WIDTH 4 |
---|
| 15 | #define CYCLES 100000 |
---|
| 16 | |
---|
| 17 | int _main(int argc, char *argv[]) |
---|
| 18 | { |
---|
| 19 | using namespace sc_core; |
---|
| 20 | // Avoid repeating these everywhere |
---|
| 21 | using soclib::common::IntTab; |
---|
| 22 | using soclib::common::Segment; |
---|
| 23 | using soclib::common::alloc_elems; |
---|
| 24 | |
---|
| 25 | // Define VCI parameters |
---|
| 26 | typedef soclib::caba::VciParams<4,8,32,1,1,1,8,4,4,1> vci_param; |
---|
| 27 | |
---|
| 28 | // Mapping table primary network |
---|
| 29 | |
---|
| 30 | soclib::common::MappingTable maptabp(32, IntTab(SRCID_WIDTH), IntTab(SRCID_WIDTH), 0x00FF0000); |
---|
| 31 | |
---|
| 32 | for ( size_t p = 0 ; p < 4 ; p++) |
---|
| 33 | { |
---|
| 34 | std::ostringstream sp; |
---|
| 35 | sp << "c_seg_proc_" << p; |
---|
| 36 | maptabp.add( Segment( sp.str() , (p << (32 - SRCID_WIDTH)), 0x10 , IntTab(p) , false)); |
---|
| 37 | } |
---|
| 38 | // Signals |
---|
| 39 | |
---|
| 40 | sc_clock signal_clk("clk"); |
---|
| 41 | sc_signal<bool> signal_resetn("resetn"); |
---|
| 42 | |
---|
| 43 | soclib::caba::DspinSignals<40> * dspin_cmd = soclib::common::alloc_elems<soclib::caba::DspinSignals<40> >("dspin_cmd", 5); |
---|
| 44 | soclib::caba::DspinSignals<33> * dspin_rsp = soclib::common::alloc_elems<soclib::caba::DspinSignals<33> >("dspin_rsp", 5); |
---|
| 45 | |
---|
| 46 | |
---|
| 47 | soclib::caba::SoclibVciInitiator<40,33> |
---|
| 48 | initp0("initp0", 4); |
---|
| 49 | //soclib::caba::SoclibVciInitiator<vci_param> |
---|
| 50 | //initp1("initp1", 1); |
---|
| 51 | //soclib::caba::SoclibVciInitiator<vci_param> |
---|
| 52 | //initp2("initp2", 2); |
---|
| 53 | //soclib::caba::SoclibVciInitiator<vci_param> |
---|
| 54 | //initp3("initp3", 3); |
---|
| 55 | |
---|
| 56 | soclib::caba::SoclibVciTarget<40,33> |
---|
| 57 | target0("target0"); |
---|
| 58 | soclib::caba::SoclibVciTarget<40,33> |
---|
| 59 | target1("target1"); |
---|
| 60 | soclib::caba::SoclibVciTarget<40,33> |
---|
| 61 | target2("target2"); |
---|
| 62 | soclib::caba::SoclibVciTarget<40,33> |
---|
| 63 | target3("target3"); |
---|
| 64 | |
---|
| 65 | // Local ring interconnects : 1 direct ring per cluster |
---|
| 66 | soclib::caba::DspinSimpleRingFastC<vci_param, 40, 33> |
---|
| 67 | cluster("cluster",maptabp, IntTab(), 2, 1, 4); |
---|
| 68 | |
---|
| 69 | |
---|
| 70 | // Initiators |
---|
| 71 | initp0.p_clk(signal_clk); |
---|
| 72 | initp0.p_resetn(signal_resetn); |
---|
| 73 | initp0.p_cmd_out(dspin_cmd[0]); |
---|
| 74 | initp0.p_rsp_in(dspin_rsp[0]); |
---|
| 75 | |
---|
| 76 | |
---|
| 77 | // Target |
---|
| 78 | target0.p_clk(signal_clk); |
---|
| 79 | target0.p_resetn(signal_resetn); |
---|
| 80 | target0.p_cmd_in(dspin_cmd[1]); |
---|
| 81 | target0.p_rsp_out(dspin_rsp[1]); |
---|
| 82 | |
---|
| 83 | target1.p_clk(signal_clk); |
---|
| 84 | target1.p_resetn(signal_resetn); |
---|
| 85 | target1.p_cmd_in(dspin_cmd[2]); |
---|
| 86 | target1.p_rsp_out(dspin_rsp[2]); |
---|
| 87 | |
---|
| 88 | target2.p_clk(signal_clk); |
---|
| 89 | target2.p_resetn(signal_resetn); |
---|
| 90 | target2.p_cmd_in(dspin_cmd[3]); |
---|
| 91 | target2.p_rsp_out(dspin_rsp[3]); |
---|
| 92 | |
---|
| 93 | target3.p_clk(signal_clk); |
---|
| 94 | target3.p_resetn(signal_resetn); |
---|
| 95 | target3.p_cmd_in(dspin_cmd[4]); |
---|
| 96 | target3.p_rsp_out(dspin_rsp[4]); |
---|
| 97 | |
---|
| 98 | cluster.p_clk(signal_clk); |
---|
| 99 | cluster.p_resetn(signal_resetn); |
---|
| 100 | |
---|
| 101 | cluster.p_cmd_out[0](dspin_cmd[1]); |
---|
| 102 | cluster.p_rsp_in[0](dspin_rsp[1]); |
---|
| 103 | cluster.p_cmd_out[1](dspin_cmd[2]); |
---|
| 104 | cluster.p_rsp_in[1](dspin_rsp[2]); |
---|
| 105 | cluster.p_cmd_out[2](dspin_cmd[3]); |
---|
| 106 | cluster.p_rsp_in[2](dspin_rsp[3]); |
---|
| 107 | cluster.p_cmd_out[3](dspin_cmd[4]); |
---|
| 108 | cluster.p_rsp_in[3](dspin_rsp[4]); |
---|
| 109 | |
---|
| 110 | cluster.p_cmd_in[0](dspin_cmd[0]); |
---|
| 111 | cluster.p_rsp_out[0](dspin_rsp[0]); |
---|
| 112 | |
---|
| 113 | |
---|
| 114 | //////////////////////////////////////////////////////// |
---|
| 115 | |
---|
| 116 | int ncycles; |
---|
| 117 | |
---|
| 118 | sc_start(sc_core::sc_time(0, SC_NS)); |
---|
| 119 | signal_resetn = false; |
---|
| 120 | |
---|
| 121 | sc_start(sc_core::sc_time(1, SC_NS)); |
---|
| 122 | signal_resetn = true; |
---|
| 123 | |
---|
| 124 | while(1) |
---|
| 125 | { |
---|
| 126 | sc_start(sc_core::sc_time(CYCLES, SC_NS)); |
---|
| 127 | |
---|
| 128 | } |
---|
| 129 | |
---|
| 130 | std::cout << "Hit ENTER to end simulation" << std::endl; |
---|
| 131 | char buf[1]; |
---|
| 132 | |
---|
| 133 | std::cin.getline(buf,1); |
---|
| 134 | |
---|
| 135 | return EXIT_SUCCESS; |
---|
| 136 | } |
---|
| 137 | |
---|
| 138 | int sc_main (int argc, char *argv[]) |
---|
| 139 | { |
---|
| 140 | try { |
---|
| 141 | return _main(argc, argv); |
---|
| 142 | } catch (std::exception &e) { |
---|
| 143 | std::cout << e.what() << std::endl; |
---|
| 144 | } catch (...) { |
---|
| 145 | std::cout << "Unknown exception occured" << std::endl; |
---|
| 146 | throw; |
---|
| 147 | } |
---|
| 148 | return 1; |
---|
| 149 | } |
---|