112027Sjungma@eit.uni-kl.de/***************************************************************************** 212027Sjungma@eit.uni-kl.de 312027Sjungma@eit.uni-kl.de Licensed to Accellera Systems Initiative Inc. (Accellera) under one or 412027Sjungma@eit.uni-kl.de more contributor license agreements. See the NOTICE file distributed 512027Sjungma@eit.uni-kl.de with this work for additional information regarding copyright ownership. 612027Sjungma@eit.uni-kl.de Accellera licenses this file to you under the Apache License, Version 2.0 712027Sjungma@eit.uni-kl.de (the "License"); you may not use this file except in compliance with the 812027Sjungma@eit.uni-kl.de License. You may obtain a copy of the License at 912027Sjungma@eit.uni-kl.de 1012027Sjungma@eit.uni-kl.de http://www.apache.org/licenses/LICENSE-2.0 1112027Sjungma@eit.uni-kl.de 1212027Sjungma@eit.uni-kl.de Unless required by applicable law or agreed to in writing, software 1312027Sjungma@eit.uni-kl.de distributed under the License is distributed on an "AS IS" BASIS, 1412027Sjungma@eit.uni-kl.de WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 1512027Sjungma@eit.uni-kl.de implied. See the License for the specific language governing 1612027Sjungma@eit.uni-kl.de permissions and limitations under the License. 1712027Sjungma@eit.uni-kl.de 1812027Sjungma@eit.uni-kl.de *****************************************************************************/ 1912027Sjungma@eit.uni-kl.de 2012027Sjungma@eit.uni-kl.de/***************************************************************************** 2112027Sjungma@eit.uni-kl.de 2212027Sjungma@eit.uni-kl.de sc_reset.cpp -- Support for reset. 2312027Sjungma@eit.uni-kl.de 2412027Sjungma@eit.uni-kl.de Original Author: Andy Goodrich, Forte Design Systems 2512027Sjungma@eit.uni-kl.de 2612027Sjungma@eit.uni-kl.de CHANGE LOG AT THE END OF THE FILE 2712027Sjungma@eit.uni-kl.de *****************************************************************************/ 2812027Sjungma@eit.uni-kl.de 2912027Sjungma@eit.uni-kl.de 3012027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_simcontext.h" 3112027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_reset.h" 3212027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_process_handle.h" 3312027Sjungma@eit.uni-kl.de#include "sysc/communication/sc_signal.h" 3412027Sjungma@eit.uni-kl.de#include "sysc/communication/sc_signal_ports.h" 3512027Sjungma@eit.uni-kl.de 3612027Sjungma@eit.uni-kl.de 3712027Sjungma@eit.uni-kl.de// THE SYSTEMC PROOF OF CONCEPT SIMULATOR RESET SIGNAL IMPLEMENTATION: 3812027Sjungma@eit.uni-kl.de// 3912027Sjungma@eit.uni-kl.de// (1) An instance of the sc_reset class is attached to each sc_signal<bool> 4012027Sjungma@eit.uni-kl.de// that is used as a reset signal. 4112027Sjungma@eit.uni-kl.de// 4212027Sjungma@eit.uni-kl.de// (2) Each process that is senstive to a reset signal will be registered in the 4312027Sjungma@eit.uni-kl.de// sc_reset class attached to that reset signal. 4412027Sjungma@eit.uni-kl.de// 4512027Sjungma@eit.uni-kl.de// (3) When a change in the value of a reset signal occurs it invokes the 4612027Sjungma@eit.uni-kl.de// notify_processes() method of its sc_reset object instance. The 4712027Sjungma@eit.uni-kl.de// notify_processes() method will call the reset_changed() method of each 4812027Sjungma@eit.uni-kl.de// process that is registered with it to inform the process that 4912027Sjungma@eit.uni-kl.de// state of the reset signal has changed. 5012027Sjungma@eit.uni-kl.de// 5112027Sjungma@eit.uni-kl.de// (4) A process may have multiple reset signals, so counters are kept for the 5212027Sjungma@eit.uni-kl.de// number of active asynchronous, and synchronous, reset signals that are 5312027Sjungma@eit.uni-kl.de// active. Those counters are incremented and decremented in the process' 5412027Sjungma@eit.uni-kl.de// reset_changed() method. 5512027Sjungma@eit.uni-kl.de// 5612027Sjungma@eit.uni-kl.de// (5) When a process' semantics() method is called the current reset state is 5712027Sjungma@eit.uni-kl.de// checked, and a reset sequence is initiated if the process is in reset. 5812027Sjungma@eit.uni-kl.de// This will occur every time an SC_METHOD is dispatched. SC_CTHREAD and 5912027Sjungma@eit.uni-kl.de// and SC_THREAD instances, only go through the semantics() method they 6012027Sjungma@eit.uni-kl.de// initially start up. So the reset check is duplicated in the suspend_me() 6112027Sjungma@eit.uni-kl.de// method, the tail of which will execute each time the thread is 6212027Sjungma@eit.uni-kl.de// dispatched. 6312027Sjungma@eit.uni-kl.de 6412027Sjungma@eit.uni-kl.denamespace sc_core { 6512027Sjungma@eit.uni-kl.de 6612027Sjungma@eit.uni-kl.declass sc_reset_finder; 6712027Sjungma@eit.uni-kl.destatic sc_reset_finder* reset_finder_q=0; // Q of reset finders to reconcile. 6812027Sjungma@eit.uni-kl.de 6912027Sjungma@eit.uni-kl.de//============================================================================== 7012027Sjungma@eit.uni-kl.de// sc_reset_finder - place holder class for a port reset signal until it is 7112027Sjungma@eit.uni-kl.de// bound and an interface class is available. When the port 7212027Sjungma@eit.uni-kl.de// has been bound the information in this class will be used 7312027Sjungma@eit.uni-kl.de// to initialize its sc_reset object instance. 7412027Sjungma@eit.uni-kl.de//============================================================================== 7512027Sjungma@eit.uni-kl.declass sc_reset_finder { 7612027Sjungma@eit.uni-kl.de friend class sc_reset; 7712027Sjungma@eit.uni-kl.de public: 7812027Sjungma@eit.uni-kl.de sc_reset_finder( bool async, const sc_in<bool>* port_p, bool level, 7912027Sjungma@eit.uni-kl.de sc_process_b* target_p); 8012027Sjungma@eit.uni-kl.de sc_reset_finder( bool async, const sc_inout<bool>* port_p, bool level, 8112027Sjungma@eit.uni-kl.de sc_process_b* target_p); 8212027Sjungma@eit.uni-kl.de sc_reset_finder( bool async, const sc_out<bool>* port_p, bool level, 8312027Sjungma@eit.uni-kl.de sc_process_b* target_p); 8412027Sjungma@eit.uni-kl.de 8512027Sjungma@eit.uni-kl.de protected: 8612027Sjungma@eit.uni-kl.de bool m_async; // True if asynchronous reset. 8712027Sjungma@eit.uni-kl.de bool m_level; // Level for reset. 8812027Sjungma@eit.uni-kl.de sc_reset_finder* m_next_p; // Next reset finder in list. 8912027Sjungma@eit.uni-kl.de const sc_in<bool>* m_in_p; // Port for which reset is needed. 9012027Sjungma@eit.uni-kl.de const sc_inout<bool>* m_inout_p; // Port for which reset is needed. 9112027Sjungma@eit.uni-kl.de const sc_out<bool>* m_out_p; // Port for which reset is needed. 9212027Sjungma@eit.uni-kl.de sc_process_b* m_target_p; // Process to reset. 9312027Sjungma@eit.uni-kl.de 9412027Sjungma@eit.uni-kl.de private: // disabled 9512027Sjungma@eit.uni-kl.de sc_reset_finder( const sc_reset_finder& ); 9612027Sjungma@eit.uni-kl.de const sc_reset_finder& operator = ( const sc_reset_finder& ); 9712027Sjungma@eit.uni-kl.de}; 9812027Sjungma@eit.uni-kl.de 9912027Sjungma@eit.uni-kl.deinline sc_reset_finder::sc_reset_finder( 10012027Sjungma@eit.uni-kl.de bool async, const sc_in<bool>* port_p, bool level, sc_process_b* target_p) : 10112027Sjungma@eit.uni-kl.de m_async(async), m_level(level), m_next_p(0), m_in_p(port_p), m_inout_p(0), 10212027Sjungma@eit.uni-kl.de m_out_p(0), m_target_p(target_p) 10312027Sjungma@eit.uni-kl.de{ 10412027Sjungma@eit.uni-kl.de m_next_p = reset_finder_q; 10512027Sjungma@eit.uni-kl.de reset_finder_q = this; 10612027Sjungma@eit.uni-kl.de} 10712027Sjungma@eit.uni-kl.de 10812027Sjungma@eit.uni-kl.deinline sc_reset_finder::sc_reset_finder( 10912027Sjungma@eit.uni-kl.de bool async, const sc_inout<bool>* port_p, bool level, sc_process_b* target_p 11012027Sjungma@eit.uni-kl.de) : 11112027Sjungma@eit.uni-kl.de m_async(async), m_level(level), m_next_p(0), m_in_p(0), m_inout_p(port_p), 11212027Sjungma@eit.uni-kl.de m_out_p(0), m_target_p(target_p) 11312027Sjungma@eit.uni-kl.de{ 11412027Sjungma@eit.uni-kl.de m_next_p = reset_finder_q; 11512027Sjungma@eit.uni-kl.de reset_finder_q = this; 11612027Sjungma@eit.uni-kl.de} 11712027Sjungma@eit.uni-kl.de 11812027Sjungma@eit.uni-kl.deinline sc_reset_finder::sc_reset_finder( 11912027Sjungma@eit.uni-kl.de bool async, const sc_out<bool>* port_p, bool level, sc_process_b* target_p 12012027Sjungma@eit.uni-kl.de) : 12112027Sjungma@eit.uni-kl.de m_async(async), m_level(level), m_next_p(0), m_in_p(0), m_inout_p(0), 12212027Sjungma@eit.uni-kl.de m_out_p(port_p), m_target_p(target_p) 12312027Sjungma@eit.uni-kl.de{ 12412027Sjungma@eit.uni-kl.de m_next_p = reset_finder_q; 12512027Sjungma@eit.uni-kl.de reset_finder_q = this; 12612027Sjungma@eit.uni-kl.de} 12712027Sjungma@eit.uni-kl.de 12812027Sjungma@eit.uni-kl.de 12912027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------ 13012027Sjungma@eit.uni-kl.de//"sc_reset::notify_processes" 13112027Sjungma@eit.uni-kl.de// 13212027Sjungma@eit.uni-kl.de// Notify processes that there is a change in the reset signal value. 13312027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------ 13412027Sjungma@eit.uni-kl.devoid sc_reset::notify_processes() 13512027Sjungma@eit.uni-kl.de{ 13612027Sjungma@eit.uni-kl.de bool active; // true if reset is active. 13712027Sjungma@eit.uni-kl.de sc_reset_target* entry_p; // reset entry processing. 13812027Sjungma@eit.uni-kl.de std::vector<sc_reset_target>::size_type process_i; // index of process resetting. 13912027Sjungma@eit.uni-kl.de std::vector<sc_reset_target>::size_type process_n; // # of processes to reset. 14012027Sjungma@eit.uni-kl.de bool value; // value of our signal. 14112027Sjungma@eit.uni-kl.de 14212027Sjungma@eit.uni-kl.de value = m_iface_p->read(); 14312027Sjungma@eit.uni-kl.de process_n = m_targets.size(); 14412027Sjungma@eit.uni-kl.de for ( process_i = 0; process_i < process_n; process_i++ ) 14512027Sjungma@eit.uni-kl.de { 14612027Sjungma@eit.uni-kl.de entry_p = &m_targets[process_i]; 14712027Sjungma@eit.uni-kl.de active = ( entry_p->m_level == value ); 14812027Sjungma@eit.uni-kl.de entry_p->m_process_p->reset_changed( entry_p->m_async, active ); 14912027Sjungma@eit.uni-kl.de } 15012027Sjungma@eit.uni-kl.de} 15112027Sjungma@eit.uni-kl.de 15212027Sjungma@eit.uni-kl.de 15312027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------ 15412027Sjungma@eit.uni-kl.de//"sc_reset::reconcile_resets" 15512027Sjungma@eit.uni-kl.de// 15612027Sjungma@eit.uni-kl.de// This static method processes the sc_reset_finders to establish the actual 15712027Sjungma@eit.uni-kl.de// reset connections. 15812027Sjungma@eit.uni-kl.de// 15912027Sjungma@eit.uni-kl.de// Notes: 16012027Sjungma@eit.uni-kl.de// (1) If reset is asserted we tell the process that it is in reset. 16112027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------ 16212027Sjungma@eit.uni-kl.devoid sc_reset::reconcile_resets() 16312027Sjungma@eit.uni-kl.de{ 16412027Sjungma@eit.uni-kl.de const sc_signal_in_if<bool>* iface_p; // Interface to reset signal. 16512027Sjungma@eit.uni-kl.de sc_reset_finder* next_p; // Next finder to process. 16612027Sjungma@eit.uni-kl.de sc_reset_finder* now_p; // Finder currently processing. 16712027Sjungma@eit.uni-kl.de sc_reset_target reset_target; // Target's reset entry. 16812027Sjungma@eit.uni-kl.de sc_reset* reset_p; // Reset object to use. 16912027Sjungma@eit.uni-kl.de 17012027Sjungma@eit.uni-kl.de for ( now_p = reset_finder_q; now_p; now_p = next_p ) 17112027Sjungma@eit.uni-kl.de { 17212027Sjungma@eit.uni-kl.de next_p = now_p->m_next_p; 17312027Sjungma@eit.uni-kl.de if ( now_p->m_in_p ) 17412027Sjungma@eit.uni-kl.de { 17512027Sjungma@eit.uni-kl.de iface_p = DCAST<const sc_signal_in_if<bool>*>( 17612027Sjungma@eit.uni-kl.de now_p->m_in_p->get_interface()); 17712027Sjungma@eit.uni-kl.de } 17812027Sjungma@eit.uni-kl.de else if ( now_p->m_inout_p ) 17912027Sjungma@eit.uni-kl.de { 18012027Sjungma@eit.uni-kl.de iface_p = DCAST<const sc_signal_in_if<bool>*>( 18112027Sjungma@eit.uni-kl.de now_p->m_inout_p->get_interface()); 18212027Sjungma@eit.uni-kl.de } 18312027Sjungma@eit.uni-kl.de else 18412027Sjungma@eit.uni-kl.de { 18512027Sjungma@eit.uni-kl.de iface_p = DCAST<const sc_signal_in_if<bool>*>( 18612027Sjungma@eit.uni-kl.de now_p->m_out_p->get_interface()); 18712027Sjungma@eit.uni-kl.de } 18812027Sjungma@eit.uni-kl.de assert( iface_p != 0 ); 18912027Sjungma@eit.uni-kl.de reset_p = iface_p->is_reset(); 19012027Sjungma@eit.uni-kl.de now_p->m_target_p->m_resets.push_back(reset_p); 19112027Sjungma@eit.uni-kl.de reset_target.m_async = now_p->m_async; 19212027Sjungma@eit.uni-kl.de reset_target.m_level = now_p->m_level; 19312027Sjungma@eit.uni-kl.de reset_target.m_process_p = now_p->m_target_p; 19412027Sjungma@eit.uni-kl.de reset_p->m_targets.push_back(reset_target); 19512027Sjungma@eit.uni-kl.de if ( iface_p->read() == now_p->m_level ) // see note 1 above 19612027Sjungma@eit.uni-kl.de now_p->m_target_p->initially_in_reset( now_p->m_async ); 19712027Sjungma@eit.uni-kl.de delete now_p; 19812027Sjungma@eit.uni-kl.de } 19912027Sjungma@eit.uni-kl.de} 20012027Sjungma@eit.uni-kl.de 20112027Sjungma@eit.uni-kl.de 20212027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------ 20312027Sjungma@eit.uni-kl.de//"sc_reset::remove_process" 20412027Sjungma@eit.uni-kl.de// 20512027Sjungma@eit.uni-kl.de// This method removes the supplied process from the list of processes that 20612027Sjungma@eit.uni-kl.de// should be notified when there is a change in the value of the reset signal. 20712027Sjungma@eit.uni-kl.de// 20812027Sjungma@eit.uni-kl.de// Arguments: 20912027Sjungma@eit.uni-kl.de// process_p -> process to be removed. 21012027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------ 21112027Sjungma@eit.uni-kl.devoid sc_reset::remove_process( sc_process_b* process_p ) 21212027Sjungma@eit.uni-kl.de{ 21312027Sjungma@eit.uni-kl.de int process_i; // Index of process resetting. 21412027Sjungma@eit.uni-kl.de int process_n; // # of processes to reset. 21512027Sjungma@eit.uni-kl.de 21612027Sjungma@eit.uni-kl.de process_n = m_targets.size(); 21712027Sjungma@eit.uni-kl.de for ( process_i = 0; process_i < process_n; ) 21812027Sjungma@eit.uni-kl.de { 21912027Sjungma@eit.uni-kl.de if ( m_targets[process_i].m_process_p == process_p ) 22012027Sjungma@eit.uni-kl.de { 22112027Sjungma@eit.uni-kl.de m_targets[process_i] = m_targets[process_n-1]; 22212027Sjungma@eit.uni-kl.de process_n--; 22312027Sjungma@eit.uni-kl.de m_targets.resize(process_n); 22412027Sjungma@eit.uni-kl.de } 22512027Sjungma@eit.uni-kl.de else 22612027Sjungma@eit.uni-kl.de { 22712027Sjungma@eit.uni-kl.de process_i++; 22812027Sjungma@eit.uni-kl.de } 22912027Sjungma@eit.uni-kl.de } 23012027Sjungma@eit.uni-kl.de} 23112027Sjungma@eit.uni-kl.de 23212027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------ 23312027Sjungma@eit.uni-kl.de//"sc_reset::reset_signal_is - ports" 23412027Sjungma@eit.uni-kl.de// 23512027Sjungma@eit.uni-kl.de// These overloads of the reset_signal_is() method will register the active 23612027Sjungma@eit.uni-kl.de// process with the sc_reset object instance associated with the supplied port. 23712027Sjungma@eit.uni-kl.de// If the port does not yet have a pointer to its sc_signal<bool> instance it 23812027Sjungma@eit.uni-kl.de// will create an sc_reset_finder class object instance that will be used 23912027Sjungma@eit.uni-kl.de// to set the process' reset information when the port has been bound. 24012027Sjungma@eit.uni-kl.de// 24112027Sjungma@eit.uni-kl.de// Arguments: 24212027Sjungma@eit.uni-kl.de// async = true if the reset signal is asynchronous, false if not. 24312027Sjungma@eit.uni-kl.de// port = port for sc_signal<bool> that will provide the reset signal. 24412027Sjungma@eit.uni-kl.de// level = level at which reset is active, either true or false. 24512027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------ 24612027Sjungma@eit.uni-kl.devoid sc_reset::reset_signal_is( bool async, const sc_in<bool>& port, bool level) 24712027Sjungma@eit.uni-kl.de{ 24812027Sjungma@eit.uni-kl.de const sc_signal_in_if<bool>* iface_p; 24912027Sjungma@eit.uni-kl.de sc_process_b* process_p; 25012027Sjungma@eit.uni-kl.de 25112027Sjungma@eit.uni-kl.de process_p = (sc_process_b*)sc_get_current_process_handle(); 25212027Sjungma@eit.uni-kl.de assert( process_p ); 25312027Sjungma@eit.uni-kl.de process_p->m_has_reset_signal = true; 25412027Sjungma@eit.uni-kl.de switch ( process_p->proc_kind() ) 25512027Sjungma@eit.uni-kl.de { 25612027Sjungma@eit.uni-kl.de case SC_THREAD_PROC_: 25712027Sjungma@eit.uni-kl.de case SC_METHOD_PROC_: 25812027Sjungma@eit.uni-kl.de case SC_CTHREAD_PROC_: 25912027Sjungma@eit.uni-kl.de iface_p = DCAST<const sc_signal_in_if<bool>*>(port.get_interface()); 26012027Sjungma@eit.uni-kl.de if ( iface_p ) 26112027Sjungma@eit.uni-kl.de reset_signal_is( async, *iface_p, level ); 26212027Sjungma@eit.uni-kl.de else 26312027Sjungma@eit.uni-kl.de new sc_reset_finder( async, &port, level, process_p ); 26412027Sjungma@eit.uni-kl.de break; 26512027Sjungma@eit.uni-kl.de default: 26612027Sjungma@eit.uni-kl.de SC_REPORT_ERROR(SC_ID_UNKNOWN_PROCESS_TYPE_, process_p->name()); 26712027Sjungma@eit.uni-kl.de break; 26812027Sjungma@eit.uni-kl.de } 26912027Sjungma@eit.uni-kl.de} 27012027Sjungma@eit.uni-kl.de 27112027Sjungma@eit.uni-kl.devoid sc_reset::reset_signal_is( 27212027Sjungma@eit.uni-kl.de bool async, const sc_inout<bool>& port, bool level ) 27312027Sjungma@eit.uni-kl.de{ 27412027Sjungma@eit.uni-kl.de const sc_signal_in_if<bool>* iface_p; 27512027Sjungma@eit.uni-kl.de sc_process_b* process_p; 27612027Sjungma@eit.uni-kl.de 27712027Sjungma@eit.uni-kl.de process_p = (sc_process_b*)sc_get_current_process_handle(); 27812027Sjungma@eit.uni-kl.de assert( process_p ); 27912027Sjungma@eit.uni-kl.de process_p->m_has_reset_signal = true; 28012027Sjungma@eit.uni-kl.de switch ( process_p->proc_kind() ) 28112027Sjungma@eit.uni-kl.de { 28212027Sjungma@eit.uni-kl.de case SC_THREAD_PROC_: 28312027Sjungma@eit.uni-kl.de case SC_METHOD_PROC_: 28412027Sjungma@eit.uni-kl.de case SC_CTHREAD_PROC_: 28512027Sjungma@eit.uni-kl.de iface_p = DCAST<const sc_signal_in_if<bool>*>(port.get_interface()); 28612027Sjungma@eit.uni-kl.de if ( iface_p ) 28712027Sjungma@eit.uni-kl.de reset_signal_is( async, *iface_p, level ); 28812027Sjungma@eit.uni-kl.de else 28912027Sjungma@eit.uni-kl.de new sc_reset_finder( async, &port, level, process_p ); 29012027Sjungma@eit.uni-kl.de break; 29112027Sjungma@eit.uni-kl.de default: 29212027Sjungma@eit.uni-kl.de SC_REPORT_ERROR(SC_ID_UNKNOWN_PROCESS_TYPE_, process_p->name()); 29312027Sjungma@eit.uni-kl.de break; 29412027Sjungma@eit.uni-kl.de } 29512027Sjungma@eit.uni-kl.de} 29612027Sjungma@eit.uni-kl.de 29712027Sjungma@eit.uni-kl.devoid sc_reset::reset_signal_is( 29812027Sjungma@eit.uni-kl.de bool async, const sc_out<bool>& port, bool level ) 29912027Sjungma@eit.uni-kl.de{ 30012027Sjungma@eit.uni-kl.de const sc_signal_in_if<bool>* iface_p; 30112027Sjungma@eit.uni-kl.de sc_process_b* process_p; 30212027Sjungma@eit.uni-kl.de 30312027Sjungma@eit.uni-kl.de process_p = (sc_process_b*)sc_get_current_process_handle(); 30412027Sjungma@eit.uni-kl.de assert( process_p ); 30512027Sjungma@eit.uni-kl.de process_p->m_has_reset_signal = true; 30612027Sjungma@eit.uni-kl.de switch ( process_p->proc_kind() ) 30712027Sjungma@eit.uni-kl.de { 30812027Sjungma@eit.uni-kl.de case SC_THREAD_PROC_: 30912027Sjungma@eit.uni-kl.de case SC_METHOD_PROC_: 31012027Sjungma@eit.uni-kl.de case SC_CTHREAD_PROC_: 31112027Sjungma@eit.uni-kl.de iface_p = DCAST<const sc_signal_in_if<bool>*>(port.get_interface()); 31212027Sjungma@eit.uni-kl.de if ( iface_p ) 31312027Sjungma@eit.uni-kl.de reset_signal_is( async, *iface_p, level ); 31412027Sjungma@eit.uni-kl.de else 31512027Sjungma@eit.uni-kl.de new sc_reset_finder( async, &port, level, process_p ); 31612027Sjungma@eit.uni-kl.de break; 31712027Sjungma@eit.uni-kl.de default: 31812027Sjungma@eit.uni-kl.de SC_REPORT_ERROR(SC_ID_UNKNOWN_PROCESS_TYPE_, process_p->name()); 31912027Sjungma@eit.uni-kl.de break; 32012027Sjungma@eit.uni-kl.de } 32112027Sjungma@eit.uni-kl.de} 32212027Sjungma@eit.uni-kl.de 32312027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------ 32412027Sjungma@eit.uni-kl.de//"sc_reset::reset_signal_is" 32512027Sjungma@eit.uni-kl.de// 32612027Sjungma@eit.uni-kl.de// This static method will register the active process instance as being 32712027Sjungma@eit.uni-kl.de// reset by the sc_signal<bool> whose interface has been supplied. If no 32812027Sjungma@eit.uni-kl.de// sc_reset object instance has been attached to the sc_signal<bool> yet, it 32912027Sjungma@eit.uni-kl.de// will be created and attached. The active process instance is pushed into 33012027Sjungma@eit.uni-kl.de// the list of processes that the sc_reset object instance should notify if 33112027Sjungma@eit.uni-kl.de// the value of the reset signal changes. 33212027Sjungma@eit.uni-kl.de// 33312027Sjungma@eit.uni-kl.de// Arguments: 33412027Sjungma@eit.uni-kl.de// async = true if the reset signal is asynchronous, false if not. 33512027Sjungma@eit.uni-kl.de// iface = interface for the reset signal. 33612027Sjungma@eit.uni-kl.de// level = is the level at which reset is active, either true or false. 33712027Sjungma@eit.uni-kl.de// Notes: 33812027Sjungma@eit.uni-kl.de// (1) If reset is asserted we tell the process that it is in reset 33912027Sjungma@eit.uni-kl.de// initially. 34012027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------ 34112027Sjungma@eit.uni-kl.devoid sc_reset::reset_signal_is( 34212027Sjungma@eit.uni-kl.de bool async, const sc_signal_in_if<bool>& iface, bool level ) 34312027Sjungma@eit.uni-kl.de{ 34412027Sjungma@eit.uni-kl.de sc_process_b* process_p; // process adding reset for. 34512027Sjungma@eit.uni-kl.de sc_reset_target reset_target; // entry to build for the process. 34612027Sjungma@eit.uni-kl.de sc_reset* reset_p; // reset object. 34712027Sjungma@eit.uni-kl.de 34812027Sjungma@eit.uni-kl.de process_p = sc_process_b::last_created_process_base(); 34912027Sjungma@eit.uni-kl.de assert( process_p ); 35012027Sjungma@eit.uni-kl.de process_p->m_has_reset_signal = true; 35112027Sjungma@eit.uni-kl.de switch ( process_p->proc_kind() ) 35212027Sjungma@eit.uni-kl.de { 35312027Sjungma@eit.uni-kl.de case SC_METHOD_PROC_: 35412027Sjungma@eit.uni-kl.de case SC_CTHREAD_PROC_: 35512027Sjungma@eit.uni-kl.de case SC_THREAD_PROC_: 35612027Sjungma@eit.uni-kl.de reset_p = iface.is_reset(); 35712027Sjungma@eit.uni-kl.de process_p->m_resets.push_back(reset_p); 35812027Sjungma@eit.uni-kl.de reset_target.m_async = async; 35912027Sjungma@eit.uni-kl.de reset_target.m_level = level; 36012027Sjungma@eit.uni-kl.de reset_target.m_process_p = process_p; 36112027Sjungma@eit.uni-kl.de reset_p->m_targets.push_back(reset_target); 36212027Sjungma@eit.uni-kl.de if ( iface.read() == level ) process_p->initially_in_reset( async ); 36312027Sjungma@eit.uni-kl.de break; 36412027Sjungma@eit.uni-kl.de default: 36512027Sjungma@eit.uni-kl.de SC_REPORT_ERROR(SC_ID_UNKNOWN_PROCESS_TYPE_, process_p->name()); 36612027Sjungma@eit.uni-kl.de break; 36712027Sjungma@eit.uni-kl.de } 36812027Sjungma@eit.uni-kl.de} 36912027Sjungma@eit.uni-kl.de 37012027Sjungma@eit.uni-kl.de} // namespace sc_core 37112027Sjungma@eit.uni-kl.de 37212027Sjungma@eit.uni-kl.de// $Log: sc_reset.cpp,v $ 37312027Sjungma@eit.uni-kl.de// Revision 1.16 2011/08/26 20:46:10 acg 37412027Sjungma@eit.uni-kl.de// Andy Goodrich: moved the modification log to the end of the file to 37512027Sjungma@eit.uni-kl.de// eliminate source line number skew when check-ins are done. 37612027Sjungma@eit.uni-kl.de// 37712027Sjungma@eit.uni-kl.de// Revision 1.15 2011/08/24 22:05:51 acg 37812027Sjungma@eit.uni-kl.de// Torsten Maehne: initialization changes to remove warnings. 37912027Sjungma@eit.uni-kl.de// 38012027Sjungma@eit.uni-kl.de// Revision 1.14 2011/04/08 22:37:34 acg 38112027Sjungma@eit.uni-kl.de// Andy Goodrich: documentation of the reset mechanism and additional 38212027Sjungma@eit.uni-kl.de// documentation of methods. Removal of check for SC_METHODs in 38312027Sjungma@eit.uni-kl.de// sc_reset_signal_is() that should not have been there. 38412027Sjungma@eit.uni-kl.de// 38512027Sjungma@eit.uni-kl.de// Revision 1.13 2011/03/20 15:13:01 acg 38612027Sjungma@eit.uni-kl.de// Andy Goodrich: set the reset flag for async_reset_signal_is to catch 38712027Sjungma@eit.uni-kl.de// the suspend() corner case. 38812027Sjungma@eit.uni-kl.de// 38912027Sjungma@eit.uni-kl.de// Revision 1.12 2011/03/20 13:43:23 acg 39012027Sjungma@eit.uni-kl.de// Andy Goodrich: added async_signal_is() plus suspend() as a corner case. 39112027Sjungma@eit.uni-kl.de// 39212027Sjungma@eit.uni-kl.de// Revision 1.11 2011/03/06 19:57:11 acg 39312027Sjungma@eit.uni-kl.de// Andy Goodrich: refinements for the illegal suspend - synchronous reset 39412027Sjungma@eit.uni-kl.de// interaction. 39512027Sjungma@eit.uni-kl.de// 39612027Sjungma@eit.uni-kl.de// Revision 1.10 2011/02/18 20:27:14 acg 39712027Sjungma@eit.uni-kl.de// Andy Goodrich: Updated Copyrights. 39812027Sjungma@eit.uni-kl.de// 39912027Sjungma@eit.uni-kl.de// Revision 1.9 2011/02/13 21:47:37 acg 40012027Sjungma@eit.uni-kl.de// Andy Goodrich: update copyright notice. 40112027Sjungma@eit.uni-kl.de// 40212027Sjungma@eit.uni-kl.de// Revision 1.8 2011/02/01 21:08:26 acg 40312027Sjungma@eit.uni-kl.de// Andy Goodrich: new multiple reset support. 40412027Sjungma@eit.uni-kl.de// 40512027Sjungma@eit.uni-kl.de// Revision 1.7 2011/01/06 18:04:38 acg 40612027Sjungma@eit.uni-kl.de// Andy Goodrich: removed commented out code. 40712027Sjungma@eit.uni-kl.de// 40812027Sjungma@eit.uni-kl.de// Revision 1.6 2010/12/07 20:09:13 acg 40912027Sjungma@eit.uni-kl.de// Andy Goodrich: removed sc_signal overloads since already have sc_signal_in_if overloads. 41012027Sjungma@eit.uni-kl.de// 41112027Sjungma@eit.uni-kl.de// Revision 1.5 2010/11/20 17:10:56 acg 41212027Sjungma@eit.uni-kl.de// Andy Goodrich: reset processing changes for new IEEE 1666 standard. 41312027Sjungma@eit.uni-kl.de// 41412027Sjungma@eit.uni-kl.de// Revision 1.4 2009/05/22 16:06:29 acg 41512027Sjungma@eit.uni-kl.de// Andy Goodrich: process control updates. 41612027Sjungma@eit.uni-kl.de// 41712027Sjungma@eit.uni-kl.de// Revision 1.3 2009/03/12 22:59:58 acg 41812027Sjungma@eit.uni-kl.de// Andy Goodrich: updates for 2.4 stuff. 41912027Sjungma@eit.uni-kl.de// 42012027Sjungma@eit.uni-kl.de// Revision 1.2 2008/05/22 17:06:26 acg 42112027Sjungma@eit.uni-kl.de// Andy Goodrich: updated copyright notice to include 2008. 42212027Sjungma@eit.uni-kl.de// 42312027Sjungma@eit.uni-kl.de// Revision 1.1.1.1 2006/12/15 20:20:05 acg 42412027Sjungma@eit.uni-kl.de// SystemC 2.3 42512027Sjungma@eit.uni-kl.de// 42612027Sjungma@eit.uni-kl.de// Revision 1.7 2006/12/02 20:58:19 acg 42712027Sjungma@eit.uni-kl.de// Andy Goodrich: updates from 2.2 for IEEE 1666 support. 42812027Sjungma@eit.uni-kl.de// 42912027Sjungma@eit.uni-kl.de// Revision 1.5 2006/04/11 23:13:21 acg 43012027Sjungma@eit.uni-kl.de// Andy Goodrich: Changes for reduced reset support that only includes 43112027Sjungma@eit.uni-kl.de// sc_cthread, but has preliminary hooks for expanding to method and thread 43212027Sjungma@eit.uni-kl.de// processes also. 43312027Sjungma@eit.uni-kl.de// 43412027Sjungma@eit.uni-kl.de// Revision 1.4 2006/01/24 20:49:05 acg 43512027Sjungma@eit.uni-kl.de// Andy Goodrich: changes to remove the use of deprecated features within the 43612027Sjungma@eit.uni-kl.de// simulator, and to issue warning messages when deprecated features are used. 43712027Sjungma@eit.uni-kl.de// 43812027Sjungma@eit.uni-kl.de// Revision 1.3 2006/01/13 18:44:30 acg 43912027Sjungma@eit.uni-kl.de// Added $Log to record CVS changes into the source. 44012027Sjungma@eit.uni-kl.de// 441