diff options
author | Gabe Black <gabeblack@google.com> | 2018-05-24 01:37:55 -0700 |
---|---|---|
committer | Gabe Black <gabeblack@google.com> | 2018-08-08 10:09:54 +0000 |
commit | 16fa8d7cc8c92f5ab879e4cf9c6c0bbb3567860f (patch) | |
tree | 7b6faaacb4574a555e561534aa4a8508c0624c32 /src/systemc/tests/systemc/kernel/sc_event/test15 | |
parent | 7235d3b5211d0ba8f528d930a4c1e7ad62eec51a (diff) | |
download | gem5-16fa8d7cc8c92f5ab879e4cf9c6c0bbb3567860f.tar.xz |
systemc: Import tests from the Accellera systemc distribution.
Change-Id: Iad76b398949a55d768a34d027a2d8e3739953da6
Reviewed-on: https://gem5-review.googlesource.com/10845
Reviewed-by: Giacomo Travaglini <giacomo.travaglini@arm.com>
Maintainer: Gabe Black <gabeblack@google.com>
Diffstat (limited to 'src/systemc/tests/systemc/kernel/sc_event/test15')
-rw-r--r-- | src/systemc/tests/systemc/kernel/sc_event/test15/event_triggered.cpp | 203 | ||||
-rw-r--r-- | src/systemc/tests/systemc/kernel/sc_event/test15/golden/event_triggered.log | 48 |
2 files changed, 251 insertions, 0 deletions
diff --git a/src/systemc/tests/systemc/kernel/sc_event/test15/event_triggered.cpp b/src/systemc/tests/systemc/kernel/sc_event/test15/event_triggered.cpp new file mode 100644 index 000000000..fee0d2516 --- /dev/null +++ b/src/systemc/tests/systemc/kernel/sc_event/test15/event_triggered.cpp @@ -0,0 +1,203 @@ +/***************************************************************************** + + Licensed to Accellera Systems Initiative Inc. (Accellera) under one or + more contributor license agreements. See the NOTICE file distributed + with this work for additional information regarding copyright ownership. + Accellera licenses this file to you under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with the + License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied. See the License for the specific language governing + permissions and limitations under the License. + + *****************************************************************************/ + +/***************************************************************************** + + event_triggered.cpp -- test sc_event::triggered + + Original Author: Philipp A. Hartmann, Intel Corporation - 2017-08-06 + + *****************************************************************************/ + +/***************************************************************************** + + MODIFICATION LOG - modifiers, enter your name, affiliation, date and + changes you are making here. + + Name, Affiliation, Date: + Description of Modification: + + *****************************************************************************/ + +#define SC_INCLUDE_DYNAMIC_PROCESSES +#include <systemc> +#include <iomanip> + +#ifdef BENCHMARK + static const sc_dt::uint64 num_events = 128; + static const sc_dt::uint64 num_triggers = 4; + static const sc_dt::uint64 num_iterations = 10000000; +# define CHECK(expr) ((void)0) +#else + static const sc_dt::uint64 num_events = 16; + static const sc_dt::uint64 num_triggers = 4; + static const sc_dt::uint64 num_iterations = 4; +# define CHECK(expr) sc_assert(expr) +#endif + +#ifndef UINT64_C +#if defined(_WIN32) && !defined(__MINGW32__) +# define UINT64_C(v) v ## ui64 +#else +# define UINT64_C(v) v ## ULL +#endif +#endif // UINT64_C + +using namespace sc_core; + +SC_MODULE( module ) +{ + sc_vector<sc_event> events; + sc_event event_return; + + SC_CTOR( module ) + : events("ev", num_events) + , m_rng_state() + { + SC_THREAD(driver); + + SC_THREAD(consumer_dynamic); + SC_THREAD(consumer_static); // odd events only + for(unsigned i = 1; i<events.size(); i+=2) + sensitive << events[i]; + } +private: + + void driver() + { + CHECK( !event_return.triggered() ); + wait(1, SC_NS); + CHECK( !event_return.triggered() ); + + random_notify(); + random_notify(); + wait(event_return); + + random_notify(SC_ZERO_TIME); + random_notify(SC_ZERO_TIME); + wait(event_return); + + random_notify(sc_time(1, SC_NS)); + random_notify(sc_time(1, SC_NS)); + wait(event_return); + wait(2, SC_NS); + CHECK( !event_return.triggered() ); + + for(unsigned i = 0; i < num_triggers; ++i) + random_notify(); + wait(event_return); + CHECK( event_return.triggered() ); + + for(unsigned i = 0; i < num_triggers; ++i) + random_notify(SC_ZERO_TIME); + wait(event_return); + CHECK( event_return.triggered() ); + + for(unsigned iter = 0; iter < num_iterations; ++iter) { + for(unsigned i = 0; i < num_triggers; ++i) { + random_notify(sc_time(1, SC_NS)); + } + wait(event_return); + } + CHECK( event_return.triggered() ); + } + + void consumer_dynamic() + { + sc_event_or_list events_or; // even events only + for(unsigned i = 0; i < events.size(); i+=2) + events_or |= events[i]; + + while(true) { + wait(events_or); + print_triggered(); + event_return.notify(); + } + } + + void consumer_static() + { + while(true) { + wait(); + print_triggered(); + event_return.notify(); + } + } + + void print_triggered() + { +#ifndef BENCHMARK + using namespace std; + cout + << setw(6) << sc_time_stamp() + << " (" << sc_delta_count() << "): " + << sc_get_current_process_handle().name() << ": "; + for(unsigned i =0; i< events.size(); ++i) + if (events[i].triggered()) + std::cout << events[i].basename() << " "; + cout << endl; +#endif + } + + void random_notify() + { random_notify(SC_ZERO_TIME, true); } + + void random_notify(const sc_time& t, bool immediate = false) + { + sc_event& ev = events[ lcg_rng() % num_events ]; +#ifndef BENCHMARK + using namespace std; + cout + << setw(6) << sc_time_stamp() + << " (" << sc_delta_count() << "): " + << sc_get_current_process_handle().name() << ": " + << ev.basename(); + if (immediate) { + cout << ".notify()"; + } else { + cout << ".notify(" << t << ")"; + } + cout << endl; +#endif + if (immediate) { + ev.notify(); + } else { + ev.notify(t); + } + } + + unsigned lcg_rng() + { + m_rng_state = UINT64_C(2862933555777941757) * m_rng_state + + UINT64_C(3037000493); + return ( m_rng_state >> 48 ); + } + + sc_dt::uint64 m_rng_state; +}; + + +int +sc_main( int, char*[] ) +{ + module m("m"); + sc_start(); + sc_stop(); + return 0; +} diff --git a/src/systemc/tests/systemc/kernel/sc_event/test15/golden/event_triggered.log b/src/systemc/tests/systemc/kernel/sc_event/test15/golden/event_triggered.log new file mode 100644 index 000000000..911cbc94f --- /dev/null +++ b/src/systemc/tests/systemc/kernel/sc_event/test15/golden/event_triggered.log @@ -0,0 +1,48 @@ +SystemC Simulation + 1 ns (1): m.driver: ev_0.notify() + 1 ns (1): m.driver: ev_6.notify() + 1 ns (1): m.consumer_dynamic: ev_0 ev_6 + 1 ns (1): m.driver: ev_1.notify(0 s) + 1 ns (1): m.driver: ev_15.notify(0 s) + 1 ns (2): m.consumer_static: ev_1 ev_15 + 1 ns (2): m.driver: ev_8.notify(1 ns) + 1 ns (2): m.driver: ev_7.notify(1 ns) + 2 ns (3): m.consumer_dynamic: ev_7 ev_8 + 2 ns (3): m.consumer_static: ev_7 ev_8 + 4 ns (4): m.driver: ev_5.notify() + 4 ns (4): m.driver: ev_9.notify() + 4 ns (4): m.driver: ev_13.notify() + 4 ns (4): m.driver: ev_2.notify() + 4 ns (4): m.consumer_static: ev_2 ev_5 ev_9 ev_13 + 4 ns (4): m.consumer_dynamic: ev_2 ev_5 ev_9 ev_13 + 4 ns (4): m.driver: ev_9.notify(0 s) + 4 ns (4): m.driver: ev_5.notify(0 s) + 4 ns (4): m.driver: ev_12.notify(0 s) + 4 ns (4): m.driver: ev_8.notify(0 s) + 4 ns (5): m.consumer_dynamic: ev_5 ev_8 ev_9 ev_12 + 4 ns (5): m.consumer_static: ev_5 ev_8 ev_9 ev_12 + 4 ns (5): m.driver: ev_14.notify(1 ns) + 4 ns (5): m.driver: ev_2.notify(1 ns) + 4 ns (5): m.driver: ev_5.notify(1 ns) + 4 ns (5): m.driver: ev_0.notify(1 ns) + 5 ns (6): m.consumer_dynamic: ev_0 ev_2 ev_5 ev_14 + 5 ns (6): m.consumer_static: ev_0 ev_2 ev_5 ev_14 + 5 ns (6): m.driver: ev_11.notify(1 ns) + 5 ns (6): m.driver: ev_14.notify(1 ns) + 5 ns (6): m.driver: ev_12.notify(1 ns) + 5 ns (6): m.driver: ev_5.notify(1 ns) + 6 ns (7): m.consumer_static: ev_5 ev_11 ev_12 ev_14 + 6 ns (7): m.consumer_dynamic: ev_5 ev_11 ev_12 ev_14 + 6 ns (7): m.driver: ev_0.notify(1 ns) + 6 ns (7): m.driver: ev_4.notify(1 ns) + 6 ns (7): m.driver: ev_8.notify(1 ns) + 6 ns (7): m.driver: ev_12.notify(1 ns) + 7 ns (8): m.consumer_dynamic: ev_0 ev_4 ev_8 ev_12 + 7 ns (8): m.driver: ev_12.notify(1 ns) + 7 ns (8): m.driver: ev_6.notify(1 ns) + 7 ns (8): m.driver: ev_11.notify(1 ns) + 7 ns (8): m.driver: ev_13.notify(1 ns) + 8 ns (9): m.consumer_dynamic: ev_6 ev_11 ev_12 ev_13 + 8 ns (9): m.consumer_static: ev_6 ev_11 ev_12 ev_13 + +Info: /OSCI/SystemC: Simulation stopped by user. |