test02.cpp revision 12855
15625Sgblack@eecs.umich.edu/***************************************************************************** 25625Sgblack@eecs.umich.edu 35625Sgblack@eecs.umich.edu Licensed to Accellera Systems Initiative Inc. (Accellera) under one or 45625Sgblack@eecs.umich.edu more contributor license agreements. See the NOTICE file distributed 55625Sgblack@eecs.umich.edu with this work for additional information regarding copyright ownership. 65625Sgblack@eecs.umich.edu Accellera licenses this file to you under the Apache License, Version 2.0 75625Sgblack@eecs.umich.edu (the "License"); you may not use this file except in compliance with the 85625Sgblack@eecs.umich.edu License. You may obtain a copy of the License at 95625Sgblack@eecs.umich.edu 105625Sgblack@eecs.umich.edu http://www.apache.org/licenses/LICENSE-2.0 115625Sgblack@eecs.umich.edu 125625Sgblack@eecs.umich.edu Unless required by applicable law or agreed to in writing, software 135625Sgblack@eecs.umich.edu distributed under the License is distributed on an "AS IS" BASIS, 145625Sgblack@eecs.umich.edu WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 155625Sgblack@eecs.umich.edu implied. See the License for the specific language governing 165625Sgblack@eecs.umich.edu permissions and limitations under the License. 175625Sgblack@eecs.umich.edu 185625Sgblack@eecs.umich.edu *****************************************************************************/ 195625Sgblack@eecs.umich.edu 205625Sgblack@eecs.umich.edu// test02.cpp -- Test Method Suspending Itself 215625Sgblack@eecs.umich.edu// 225625Sgblack@eecs.umich.edu// Original Author: John Aynsley, Doulos 235625Sgblack@eecs.umich.edu// 245625Sgblack@eecs.umich.edu// MODIFICATION LOG - modifiers, enter your name, affiliation, date and 255625Sgblack@eecs.umich.edu// 265625Sgblack@eecs.umich.edu// $Log: test02.cpp,v $ 275625Sgblack@eecs.umich.edu// Revision 1.3 2011/03/07 19:32:19 acg 285625Sgblack@eecs.umich.edu// Andy Goodrich: addition to set sc_core::sc_allow_process_control_corners 295625Sgblack@eecs.umich.edu// to true so that this test avoids corner case error messages. 305625Sgblack@eecs.umich.edu// 315625Sgblack@eecs.umich.edu// Revision 1.2 2011/02/20 13:44:06 acg 325625Sgblack@eecs.umich.edu// Andy Goodrich: updates for IEEE 1666 2011. 335625Sgblack@eecs.umich.edu// 345625Sgblack@eecs.umich.edu// Revision 1.1 2011/02/05 21:13:26 acg 355625Sgblack@eecs.umich.edu// Andy Goodrich: move of tests John Aynsley will replace. 365625Sgblack@eecs.umich.edu// 375625Sgblack@eecs.umich.edu// Revision 1.1 2011/01/20 16:54:54 acg 385625Sgblack@eecs.umich.edu// Andy Goodrich: changes for IEEE 1666 2011. 395625Sgblack@eecs.umich.edu// 405625Sgblack@eecs.umich.edu 415625Sgblack@eecs.umich.edu#define SC_INCLUDE_DYNAMIC_PROCESSES 425625Sgblack@eecs.umich.edu 435625Sgblack@eecs.umich.edu#include <systemc> 445625Sgblack@eecs.umich.edu 455625Sgblack@eecs.umich.eduusing namespace sc_core; 465625Sgblack@eecs.umich.eduusing std::cout; 475625Sgblack@eecs.umich.eduusing std::endl; 485625Sgblack@eecs.umich.edu 495625Sgblack@eecs.umich.edustruct M5: sc_module 505625Sgblack@eecs.umich.edu{ 515625Sgblack@eecs.umich.edu M5(sc_module_name _name) 525625Sgblack@eecs.umich.edu { 535625Sgblack@eecs.umich.edu SC_THREAD(ticker); 545625Sgblack@eecs.umich.edu SC_THREAD(calling); 555625Sgblack@eecs.umich.edu SC_METHOD(target); 565625Sgblack@eecs.umich.edu sensitive << ev; 575625Sgblack@eecs.umich.edu dont_initialize(); 585625Sgblack@eecs.umich.edu t = sc_get_current_process_handle(); 595625Sgblack@eecs.umich.edu suspend_target = false; 605625Sgblack@eecs.umich.edu resume_target = false; 615625Sgblack@eecs.umich.edu } 625625Sgblack@eecs.umich.edu 635625Sgblack@eecs.umich.edu sc_process_handle t; 645625Sgblack@eecs.umich.edu sc_event ev; 655625Sgblack@eecs.umich.edu bool suspend_target; 665625Sgblack@eecs.umich.edu bool resume_target; 675625Sgblack@eecs.umich.edu 685625Sgblack@eecs.umich.edu void ticker() 695625Sgblack@eecs.umich.edu { 705625Sgblack@eecs.umich.edu for (;;) 715625Sgblack@eecs.umich.edu { 725625Sgblack@eecs.umich.edu wait(10, SC_NS); 735625Sgblack@eecs.umich.edu ev.notify(); 745625Sgblack@eecs.umich.edu } 755625Sgblack@eecs.umich.edu } 765625Sgblack@eecs.umich.edu 775625Sgblack@eecs.umich.edu void calling() 785625Sgblack@eecs.umich.edu { 795625Sgblack@eecs.umich.edu wait(15, SC_NS); 805625Sgblack@eecs.umich.edu // Target runs at 10 NS 815625Sgblack@eecs.umich.edu 825625Sgblack@eecs.umich.edu suspend_target = true; 835625Sgblack@eecs.umich.edu wait(10, SC_NS); 845625Sgblack@eecs.umich.edu // Target runs at 20 NS and suspends itself 855625Sgblack@eecs.umich.edu 865625Sgblack@eecs.umich.edu wait(10, SC_NS); 875625Sgblack@eecs.umich.edu // Target does not run at 30 NS 885625Sgblack@eecs.umich.edu 895770Sgblack@eecs.umich.edu suspend_target = false; 905770Sgblack@eecs.umich.edu t.resume(); 915770Sgblack@eecs.umich.edu // Target runs at 35 NS 925770Sgblack@eecs.umich.edu 935770Sgblack@eecs.umich.edu wait(10, SC_NS); 945770Sgblack@eecs.umich.edu // Target runs at 40 NS 955770Sgblack@eecs.umich.edu 965770Sgblack@eecs.umich.edu suspend_target = true; 975770Sgblack@eecs.umich.edu resume_target = true; 985625Sgblack@eecs.umich.edu wait(10, SC_NS); 995625Sgblack@eecs.umich.edu // Target runs at 50 NS 1005625Sgblack@eecs.umich.edu 1015625Sgblack@eecs.umich.edu sc_stop(); 1025625Sgblack@eecs.umich.edu } 1035625Sgblack@eecs.umich.edu 1045625Sgblack@eecs.umich.edu void target() 1055625Sgblack@eecs.umich.edu { 1065625Sgblack@eecs.umich.edu cout << "Target called at " << sc_time_stamp() << endl; 1075625Sgblack@eecs.umich.edu if (suspend_target) 1085625Sgblack@eecs.umich.edu t.suspend(); 1095625Sgblack@eecs.umich.edu if (resume_target) 1105625Sgblack@eecs.umich.edu { 1115625Sgblack@eecs.umich.edu t.resume(); 1125625Sgblack@eecs.umich.edu suspend_target = false; 1135625Sgblack@eecs.umich.edu } 1145625Sgblack@eecs.umich.edu } 1155625Sgblack@eecs.umich.edu 1165625Sgblack@eecs.umich.edu SC_HAS_PROCESS(M5); 1175625Sgblack@eecs.umich.edu}; 1185825Sgblack@eecs.umich.edu 1195825Sgblack@eecs.umich.eduint sc_main(int argc, char* argv[]) 1205825Sgblack@eecs.umich.edu{ 1215625Sgblack@eecs.umich.edu M5 m("m"); 1225625Sgblack@eecs.umich.edu 1235625Sgblack@eecs.umich.edu sc_core::sc_allow_process_control_corners = true; 1245625Sgblack@eecs.umich.edu sc_start(); 1255625Sgblack@eecs.umich.edu 1265625Sgblack@eecs.umich.edu return 0; 1275625Sgblack@eecs.umich.edu} 1285625Sgblack@eecs.umich.edu 1295625Sgblack@eecs.umich.edu