From 16fa8d7cc8c92f5ab879e4cf9c6c0bbb3567860f Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Thu, 24 May 2018 01:37:55 -0700 Subject: systemc: Import tests from the Accellera systemc distribution. Change-Id: Iad76b398949a55d768a34d027a2d8e3739953da6 Reviewed-on: https://gem5-review.googlesource.com/10845 Reviewed-by: Giacomo Travaglini Maintainer: Gabe Black --- .../disable_enable/test1/golden/test1.log | 29 +++ .../process_control/disable_enable/test1/test1.cpp | 201 +++++++++++++++++++ .../disable_enable/test2/golden/test2.log | 84 ++++++++ .../process_control/disable_enable/test2/test2.cpp | 222 +++++++++++++++++++++ 4 files changed, 536 insertions(+) create mode 100644 src/systemc/tests/systemc/kernel/process_control/disable_enable/test1/golden/test1.log create mode 100644 src/systemc/tests/systemc/kernel/process_control/disable_enable/test1/test1.cpp create mode 100644 src/systemc/tests/systemc/kernel/process_control/disable_enable/test2/golden/test2.log create mode 100644 src/systemc/tests/systemc/kernel/process_control/disable_enable/test2/test2.cpp (limited to 'src/systemc/tests/systemc/kernel/process_control/disable_enable') diff --git a/src/systemc/tests/systemc/kernel/process_control/disable_enable/test1/golden/test1.log b/src/systemc/tests/systemc/kernel/process_control/disable_enable/test1/golden/test1.log new file mode 100644 index 000000000..a5d597234 --- /dev/null +++ b/src/systemc/tests/systemc/kernel/process_control/disable_enable/test1/golden/test1.log @@ -0,0 +1,29 @@ +SystemC Simulation +0 s[0]: target_method0: starting +0 s[0]: target_method0: issuing self disable +0 s[0]: target_method0: after issuing self disable + +0 s[0]: target_thread0: starting +0 s[0]: target_thread0: issuing self disable +0 s[0]: target_thread0: after issuing self disable + +0 s[1]: target_cthread0: starting +0 s[1]: target_cthread0: issuing self disable +0 s[1]: target_cthread0: after issuing self disable + + +10 ns[21]: stimulator: enabling target_cthread0 + + +20 ns[51]: stimulator: enabling target_method0 + + +30 ns[81]: stimulator: enabling target_thread0 + +80 ns[231]: target_thread0: terminating +109 ns[319]: target_cthread0: terminating +118 ns[346]: target_method0: terminating + +1030 ns[3081]: stimulator: terminating + +Info: /OSCI/SystemC: Simulation stopped by user. diff --git a/src/systemc/tests/systemc/kernel/process_control/disable_enable/test1/test1.cpp b/src/systemc/tests/systemc/kernel/process_control/disable_enable/test1/test1.cpp new file mode 100644 index 000000000..62a88b763 --- /dev/null +++ b/src/systemc/tests/systemc/kernel/process_control/disable_enable/test1/test1.cpp @@ -0,0 +1,201 @@ +/***************************************************************************** + + 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. + + *****************************************************************************/ + +//***************************************************************************** +// +// test01.cpp -- test self disables on processes +// +// Original Author: Andy Goodrich, Forte Design Systems, Inc. +// +// CVS MODIFICATION LOG - modifiers, enter your name, affiliation, date and +// changes you are making here. +// +// $Log: test1.cpp,v $ +// Revision 1.2 2009/07/28 01:09:48 acg +// Andy Goodrich: replacement test using standardized environment. +// +//***************************************************************************** + +#define SC_INCLUDE_DYNAMIC_PROCESSES +#include "systemc.h" + +enum my_process_states { + ST_DISABLED, + ST_NORMAL, + ST_SUSPENDED +}; + +inline ostream& time_stamp( ostream& os ) +{ + os << dec << sc_time_stamp() << "[" << sc_delta_count() << "]: "; + return os; +} + +SC_MODULE(top) { + // constructor: + + SC_CTOR(top) : + m_state_cthread0(ST_NORMAL), + m_state_method0(ST_NORMAL), + m_state_thread0(ST_NORMAL) + { + SC_THREAD(stimulator0); + + SC_CTHREAD( target_cthread0, m_clk.pos() ); + m_target_cthread0 = sc_get_current_process_handle(); + + SC_METHOD(target_method0); + sensitive << m_clk.pos(); + m_target_method0 = sc_get_current_process_handle(); + + SC_THREAD(target_thread0); + m_target_thread0 = sc_get_current_process_handle(); + } + + // processes: + + void stimulator0(); + void target_cthread0(); + void target_method0(); + void target_thread0(); + + // Storage: + + sc_in m_clk; + int m_state_cthread0; + int m_state_method0; + int m_state_thread0; + sc_process_handle m_target_cthread0; + sc_process_handle m_target_method0; + sc_process_handle m_target_thread0; +}; + +void top::stimulator0() +{ + const char* name = "stimulator"; + wait(10, SC_NS); + cout << endl; + time_stamp(cout) << name << ": enabling target_cthread0" << endl; + cout << endl; + m_state_cthread0 = ST_NORMAL; + m_target_cthread0.enable(); + wait(10, SC_NS); + + cout << endl; + time_stamp(cout) << name << ": enabling target_method0" << endl; + cout << endl; + m_state_method0 = ST_NORMAL; + m_target_method0.enable(); + wait(10, SC_NS); + + cout << endl; + time_stamp(cout) << name << ": enabling target_thread0" << endl; + cout << endl; + m_state_thread0 = ST_NORMAL; + m_target_thread0.enable(); + ::sc_core::wait(1000, SC_NS); + + cout << endl; + time_stamp(cout) << name << ": terminating" << endl; + sc_stop(); +} + +void top::target_cthread0() +{ + int i; + const char* name = "target_cthread0"; + + time_stamp(cout) << name << ": starting" << endl; + time_stamp(cout) << name << ": issuing self disable" << endl; + m_state_cthread0 = ST_DISABLED; + m_target_cthread0.disable(); + time_stamp(cout) << name << ": after issuing self disable" << endl; + cout << endl; + for ( i = 0; i < 100; i++ ) + { + wait(); + if ( m_state_cthread0 == ST_DISABLED ) + { + time_stamp(cout) << name << ": ERROR should not see this" << endl; + } + } + time_stamp(cout) << name << ": terminating" << endl; +} + +void top::target_method0() +{ + const char* name = "target_method0"; + static int state = 0; + switch( state ) + { + case 0: + time_stamp(cout) << name << ": starting" << endl; + time_stamp(cout) << name << ": issuing self disable" << endl; + m_state_method0 = ST_DISABLED; + m_target_method0.disable(); + time_stamp(cout) << name << ": after issuing self disable" << endl; + cout << endl; + break; + default: + if ( m_state_method0 == ST_DISABLED ) + { + time_stamp(cout) << name << ": ERROR should not see this" << endl; + } + break; + case 99: + time_stamp(cout) << name << ": terminating" << endl; + break; + } + state++; +} + +void top::target_thread0() +{ + const char* name = "target_thread0"; + + time_stamp(cout) << name << ": starting" << endl; + time_stamp(cout) << name << ": issuing self disable" << endl; + m_state_thread0 = ST_DISABLED; + m_target_thread0.disable(); + time_stamp(cout) << name << ": after issuing self disable" << endl; + cout << endl; + + // We wait a long enough time that our event will not occur until + // after we are re-enabled. Otherwise this thread will just go away + // quietly when the disable cancels the event. + + ::sc_core::wait(80, SC_NS); + if ( m_state_thread0 == ST_DISABLED ) + { + time_stamp(cout) << name << ": ERROR should not see this" << endl; + } + time_stamp(cout) << name << ": terminating" << endl; +} + +int sc_main (int argc, char *argv[]) +{ + sc_clock clock( "clock", 1.0, SC_NS ); + + top* top_p = new top("top"); + top_p->m_clk(clock); + + sc_start(); + return 0; +} + diff --git a/src/systemc/tests/systemc/kernel/process_control/disable_enable/test2/golden/test2.log b/src/systemc/tests/systemc/kernel/process_control/disable_enable/test2/golden/test2.log new file mode 100644 index 000000000..6a5b9bd77 --- /dev/null +++ b/src/systemc/tests/systemc/kernel/process_control/disable_enable/test2/golden/test2.log @@ -0,0 +1,84 @@ +SystemC Simulation +0 s[0]: target_method0: starting +0 s[0]: target_thread0: starting +0 s[1]: target_method0: active +0 s[1]: target_cthread0: starting +1 ns[3]: target_thread0: active + +2 ns[4]: stimulator: disabling target_cthread0 + +2 ns[5]: target_method0: active +3 ns[7]: target_thread0: active +4 ns[9]: target_method0: active + +5 ns[10]: stimulator: disabling target_method0 + +5 ns[11]: target_thread0: active +7 ns[14]: target_thread0: active + +8 ns[15]: stimulator: disabling target_thread0 + + +11 ns[18]: stimulator: enabling target_cthread0 + +12 ns[20]: target_cthread0: active + +14 ns[22]: stimulator: enabling target_method0 + +14 ns[23]: target_method0: active +14 ns[23]: target_cthread0: active +16 ns[26]: target_method0: active +16 ns[26]: target_cthread0: active + +17 ns[27]: stimulator: enabling target_thread0 + +17 ns[28]: target_thread0: active +18 ns[30]: target_method0: active +18 ns[30]: target_cthread0: active +19 ns[32]: target_thread0: active + +20 ns[33]: stimulator: disabling target_cthread0 + +20 ns[34]: target_method0: active +21 ns[36]: target_thread0: active +22 ns[38]: target_method0: active + +23 ns[39]: stimulator: disabling target_method0 + +23 ns[40]: target_thread0: active +25 ns[43]: target_thread0: active + +26 ns[44]: stimulator: disabling target_thread0 + + +29 ns[47]: stimulator: enabling target_cthread0 + +30 ns[49]: target_cthread0: active + +32 ns[51]: stimulator: enabling target_method0 + +32 ns[52]: target_method0: active +32 ns[52]: target_cthread0: active +34 ns[55]: target_method0: active +34 ns[55]: target_cthread0: active + +35 ns[56]: stimulator: enabling target_thread0 + +35 ns[57]: target_thread0: active +35 ns[57]: target_thread0: terminating +36 ns[59]: target_method0: active +36 ns[59]: target_cthread0: active +38 ns[62]: target_method0: active +38 ns[62]: target_cthread0: active +40 ns[65]: target_method0: active +40 ns[65]: target_cthread0: active +40 ns[65]: target_cthread0: terminating +42 ns[68]: target_method0: active +44 ns[71]: target_method0: active +46 ns[74]: target_method0: active +48 ns[77]: target_method0: active +52 ns[83]: target_method0: terminating + +1038 ns[1561]: stimulator: terminating + +Info: /OSCI/SystemC: Simulation stopped by user. diff --git a/src/systemc/tests/systemc/kernel/process_control/disable_enable/test2/test2.cpp b/src/systemc/tests/systemc/kernel/process_control/disable_enable/test2/test2.cpp new file mode 100644 index 000000000..f42d9bc98 --- /dev/null +++ b/src/systemc/tests/systemc/kernel/process_control/disable_enable/test2/test2.cpp @@ -0,0 +1,222 @@ +/***************************************************************************** + + 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. + + *****************************************************************************/ + +//***************************************************************************** +// +// test02.cpp -- test that disabled processes with static sensitivity +// wake up when enabled. +// +// Original Author: Andy Goodrich, Forte Design Systems, Inc. +// +// CVS MODIFICATION LOG - modifiers, enter your name, affiliation, date and +// changes you are making here. +// +// $Log: test2.cpp,v $ +// Revision 1.2 2009/07/28 01:10:19 acg +// Andy Goodrich: replacement test using standardized test bench. +// +//***************************************************************************** + +#define SC_INCLUDE_DYNAMIC_PROCESSES +#include "systemc.h" + +enum my_process_states { + ST_DISABLED, + ST_NORMAL, + ST_SUSPENDED +}; + +inline ostream& time_stamp( ostream& os ) +{ + os << dec << sc_time_stamp() << "[" << sc_delta_count() << "]: "; + return os; +} + +SC_MODULE(top) { + // constructor: + + SC_CTOR(top) + { + m_state_cthread0 = ST_NORMAL; + m_state_method0 = ST_NORMAL; + m_state_thread0 = ST_NORMAL; + + SC_THREAD(stimulator0); + + SC_CTHREAD( target_cthread0, m_clk.pos() ); + m_target_cthread0 = sc_get_current_process_handle(); + + SC_METHOD(target_method0); + sensitive << m_clk.pos(); + m_target_method0 = sc_get_current_process_handle(); + + SC_THREAD(target_thread0); + sensitive << m_clk.neg(); + m_target_thread0 = sc_get_current_process_handle(); + } + + // processes: + + void stimulator0(); + void target_cthread0(); + void target_method0(); + void target_thread0(); + + // Storage: + + sc_in m_clk; + sc_signal m_state_cthread0; + sc_signal m_state_method0; + sc_signal m_state_thread0; + sc_process_handle m_target_cthread0; + sc_process_handle m_target_method0; + sc_process_handle m_target_thread0; +}; + +#define DISABLE(TARGET) \ + cout << endl; \ + time_stamp(cout) << name << ": disabling target_" << #TARGET << endl; \ + m_state_##TARGET = ST_DISABLED; \ + m_target_##TARGET.disable(); \ + cout << endl; + +#define ENABLE(TARGET) \ + cout << endl; \ + time_stamp(cout) << name << ": enabling target_" << #TARGET << endl; \ + m_state_##TARGET = ST_NORMAL; \ + m_target_##TARGET.enable(); \ + cout << endl; + +void top::stimulator0() +{ + const char* name = "stimulator"; + + wait(2, SC_NS); + + DISABLE(cthread0) + wait(3, SC_NS); + DISABLE(method0) + wait(3, SC_NS); + DISABLE(thread0) + wait(3, SC_NS); + + ENABLE(cthread0) + wait(3, SC_NS); + ENABLE(method0) + wait(3, SC_NS); + ENABLE(thread0) + wait(3, SC_NS); + + DISABLE(cthread0) + wait(3, SC_NS); + DISABLE(method0) + wait(3, SC_NS); + DISABLE(thread0) + wait(3, SC_NS); + + ENABLE(cthread0) + wait(3, SC_NS); + ENABLE(method0) + wait(3, SC_NS); + ENABLE(thread0) + wait(3, SC_NS); + + ::sc_core::wait(1000, SC_NS); + cout << endl; + time_stamp(cout) << name << ": terminating" << endl; + sc_stop(); +} + +void top::target_cthread0() +{ + const char* name = "target_cthread0"; + + time_stamp(cout) << name << ": starting" << endl; + for (int i = 0; i < 10; i++) + { + wait(); + if ( m_state_cthread0 == ST_DISABLED ) + { + time_stamp(cout) << name << ": ERROR should not see this" << endl; + } + else + { + time_stamp(cout) << name << ": active" << endl; + } + } + time_stamp(cout) << name << ": terminating" << endl; +} + +void top::target_method0() +{ + const char* name = "target_method0"; + static int state = 0; + switch( state ) + { + case 0: + time_stamp(cout) << name << ": starting" << endl; + break; + default: + if ( m_state_method0 == ST_DISABLED ) + { + time_stamp(cout) << name << ": ERROR should not see this" << endl; + } + else if ( state < 18 ) + { + time_stamp(cout) << name << ": active" << endl; + } + break; + case 19: + time_stamp(cout) << name << ": terminating" << endl; + break; + } + state++; +} + +void top::target_thread0() +{ + const char* name = "target_thread0"; + + time_stamp(cout) << name << ": starting" << endl; + for (int i = 0; i < 10; i++) + { + wait(); + if ( m_state_thread0 == ST_DISABLED ) + { + time_stamp(cout) << name << ": ERROR should not see this" << endl; + } + else + { + time_stamp(cout) << name << ": active" << endl; + } + } + time_stamp(cout) << name << ": terminating" << endl; +} + +int sc_main (int argc, char *argv[]) +{ + sc_clock clock( "clock", 2.0, SC_NS ); + + top* top_p = new top("top"); + top_p->m_clk(clock); + + sc_start(); + return 0; +} + -- cgit v1.2.3