112855Sgabeblack@google.com#define SC_INCLUDE_DYNAMIC_PROCESSES 212855Sgabeblack@google.com 312855Sgabeblack@google.com#include <systemc> 412855Sgabeblack@google.com 512855Sgabeblack@google.comusing namespace sc_core; 612855Sgabeblack@google.comusing std::cout; 712855Sgabeblack@google.comusing std::endl; 812855Sgabeblack@google.com 912855Sgabeblack@google.comstruct M5: sc_module 1012855Sgabeblack@google.com{ 1112855Sgabeblack@google.com M5(sc_module_name _name) 1212855Sgabeblack@google.com { 1312855Sgabeblack@google.com SC_THREAD(ticker); 1412855Sgabeblack@google.com SC_THREAD(calling); 1512855Sgabeblack@google.com SC_METHOD(target); 1612855Sgabeblack@google.com sensitive << ev; 1712855Sgabeblack@google.com dont_initialize(); 1812855Sgabeblack@google.com t = sc_get_current_process_handle(); 1912855Sgabeblack@google.com suspend_target = false; 2012855Sgabeblack@google.com resume_target = false; 2112855Sgabeblack@google.com } 2212855Sgabeblack@google.com 2312855Sgabeblack@google.com sc_process_handle t; 2412855Sgabeblack@google.com sc_event ev; 2512855Sgabeblack@google.com bool suspend_target; 2612855Sgabeblack@google.com bool resume_target; 2712855Sgabeblack@google.com 2812855Sgabeblack@google.com void ticker() 2912855Sgabeblack@google.com { 3012855Sgabeblack@google.com for (;;) 3112855Sgabeblack@google.com { 3212855Sgabeblack@google.com wait(10, SC_NS); 3312855Sgabeblack@google.com ev.notify(); 3412855Sgabeblack@google.com } 3512855Sgabeblack@google.com } 3612855Sgabeblack@google.com 3712855Sgabeblack@google.com void calling() 3812855Sgabeblack@google.com { 3912855Sgabeblack@google.com wait(15, SC_NS); 4012855Sgabeblack@google.com // Target runs at 10 NS 4112855Sgabeblack@google.com 4212855Sgabeblack@google.com suspend_target = true; 4312855Sgabeblack@google.com wait(10, SC_NS); 4412855Sgabeblack@google.com // Target runs at 20 NS and suspends itself 4512855Sgabeblack@google.com 4612855Sgabeblack@google.com wait(10, SC_NS); 4712855Sgabeblack@google.com // Target does not run at 30 NS 4812855Sgabeblack@google.com 4912855Sgabeblack@google.com suspend_target = false; 5012855Sgabeblack@google.com t.resume(); 5112855Sgabeblack@google.com // Target runs at 35 NS 5212855Sgabeblack@google.com 5312855Sgabeblack@google.com wait(10, SC_NS); 5412855Sgabeblack@google.com // Target runs at 40 NS 5512855Sgabeblack@google.com 5612855Sgabeblack@google.com suspend_target = true; 5712855Sgabeblack@google.com resume_target = true; 5812855Sgabeblack@google.com wait(10, SC_NS); 5912855Sgabeblack@google.com // Target runs at 50 NS 6012855Sgabeblack@google.com 6112855Sgabeblack@google.com sc_stop(); 6212855Sgabeblack@google.com } 6312855Sgabeblack@google.com 6412855Sgabeblack@google.com void target() 6512855Sgabeblack@google.com { 6612855Sgabeblack@google.com cout << "Target called at " << sc_time_stamp() << endl; 6712855Sgabeblack@google.com if (suspend_target) 6812855Sgabeblack@google.com t.suspend(); 6912855Sgabeblack@google.com if (resume_target) 7012855Sgabeblack@google.com { 7112855Sgabeblack@google.com t.resume(); 7212855Sgabeblack@google.com suspend_target = false; 7312855Sgabeblack@google.com } 7412855Sgabeblack@google.com } 7512855Sgabeblack@google.com 7612855Sgabeblack@google.com SC_HAS_PROCESS(M5); 7712855Sgabeblack@google.com}; 7812855Sgabeblack@google.com 7912855Sgabeblack@google.comint sc_main(int argc, char* argv[]) 8012855Sgabeblack@google.com{ 8112855Sgabeblack@google.com M5 m("m"); 8212855Sgabeblack@google.com 8312855Sgabeblack@google.com sc_core::sc_allow_process_control_corners = true; 8412855Sgabeblack@google.com sc_start(); 8512855Sgabeblack@google.com 8612855Sgabeblack@google.com return 0; 8712855Sgabeblack@google.com} 8812855Sgabeblack@google.com 89