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