diff --git a/src/systemc/channel/sc_signal.cc b/src/systemc/channel/sc_signal.cc index e3a3cf575b..4829dad307 100644 --- a/src/systemc/channel/sc_signal.cc +++ b/src/systemc/channel/sc_signal.cc @@ -69,6 +69,20 @@ ScSignalBase::_signalChange() _valueChangedEvent.notify(sc_core::SC_ZERO_TIME); } +void +ScSignalBaseBinary::_signalPosedge() +{ + _posStamp = getChangeStamp(); + _posedgeEvent.notify(sc_core::SC_ZERO_TIME); +} + +void +ScSignalBaseBinary::_signalNegedge() +{ + _negStamp = getChangeStamp(); + _negedgeEvent.notify(sc_core::SC_ZERO_TIME); +} + namespace { diff --git a/src/systemc/ext/channel/sc_signal.hh b/src/systemc/ext/channel/sc_signal.hh index 522638dde5..a2cb55397a 100644 --- a/src/systemc/ext/channel/sc_signal.hh +++ b/src/systemc/ext/channel/sc_signal.hh @@ -96,6 +96,9 @@ class ScSignalBaseBinary : public ScSignalBase uint64_t _posStamp; uint64_t _negStamp; + + void _signalPosedge(); + void _signalNegedge(); }; template @@ -357,15 +360,18 @@ class sc_signal : return; this->m_cur_val = this->m_new_val; - this->_signalReset(); this->_signalChange(); - if (this->m_cur_val) { - this->_posStamp = ::sc_gem5::getChangeStamp(); - this->_posedgeEvent.notify(SC_ZERO_TIME); - } else { - this->_negStamp = ::sc_gem5::getChangeStamp(); - this->_negedgeEvent.notify(SC_ZERO_TIME); - } + } + + void + _signalChange() + { + sc_gem5::ScSignalBinary::_signalChange(); + this->_signalReset(); + if (this->m_cur_val) + this->_signalPosedge(); + else + this->_signalNegedge(); } private: @@ -421,13 +427,17 @@ class sc_signal : this->m_cur_val = this->m_new_val; this->_signalChange(); - if (this->m_cur_val == sc_dt::SC_LOGIC_1) { - this->_posStamp = ::sc_gem5::getChangeStamp(); - this->_posedgeEvent.notify(SC_ZERO_TIME); - } else if (this->m_cur_val == sc_dt::SC_LOGIC_0) { - this->_negStamp = ::sc_gem5::getChangeStamp(); - this->_negedgeEvent.notify(SC_ZERO_TIME); - } + } + + void + _signalChange() + { + sc_gem5::ScSignalBinary:: + _signalChange(); + if (this->m_cur_val == sc_dt::SC_LOGIC_1) + this->_signalPosedge(); + else if (this->m_cur_val == sc_dt::SC_LOGIC_0) + this->_signalNegedge(); } private: