systemc: Implement sc_buffer.
This required a small change to sc_signal so that the value change event and the change stamp for it were accessible. Change-Id: Ife0545d84f3b25e98da079786c30ffa51025cce7 Reviewed-on: https://gem5-review.googlesource.com/c/12804 Reviewed-by: Gabe Black <gabeblack@google.com> Maintainer: Gabe Black <gabeblack@google.com>
This commit is contained in:
@@ -32,7 +32,6 @@
|
||||
|
||||
#include "../core/sc_module.hh" // for sc_gen_unique_name
|
||||
#include "sc_signal.hh"
|
||||
#include "warn_unimpl.hh" // for warn_unimpl
|
||||
|
||||
namespace sc_core
|
||||
{
|
||||
@@ -49,27 +48,28 @@ class sc_buffer : public sc_signal<T, WRITER_POLICY>
|
||||
{}
|
||||
|
||||
virtual void
|
||||
write(const T&)
|
||||
write(const T &t)
|
||||
{
|
||||
sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
|
||||
this->m_new_val = t;
|
||||
this->request_update();
|
||||
}
|
||||
|
||||
sc_buffer<T, WRITER_POLICY> &
|
||||
operator = (const T &)
|
||||
operator = (const T &arg)
|
||||
{
|
||||
sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
|
||||
write(arg);
|
||||
return *this;
|
||||
}
|
||||
sc_buffer<T, WRITER_POLICY> &
|
||||
operator = (const sc_signal<T, WRITER_POLICY> &)
|
||||
operator = (const sc_signal<T, WRITER_POLICY> &arg)
|
||||
{
|
||||
sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
|
||||
write(arg.read());
|
||||
return *this;
|
||||
}
|
||||
sc_buffer<T, WRITER_POLICY> &
|
||||
operator = (const sc_buffer<T, WRITER_POLICY> &)
|
||||
operator = (const sc_buffer<T, WRITER_POLICY> &arg)
|
||||
{
|
||||
sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
|
||||
write(arg.read());
|
||||
return *this;
|
||||
}
|
||||
|
||||
@@ -79,7 +79,8 @@ class sc_buffer : public sc_signal<T, WRITER_POLICY>
|
||||
virtual void
|
||||
update()
|
||||
{
|
||||
sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
|
||||
this->m_cur_val = this->m_new_val;
|
||||
this->_signalChange();
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
@@ -151,6 +151,14 @@ class sc_signal : public sc_signal_inout_if<T>,
|
||||
return;
|
||||
|
||||
m_cur_val = m_new_val;
|
||||
_signalChange();
|
||||
_changeStamp = ::sc_gem5::getChangeStamp();
|
||||
_valueChangedEvent.notify(SC_ZERO_TIME);
|
||||
}
|
||||
|
||||
void
|
||||
_signalChange()
|
||||
{
|
||||
_changeStamp = ::sc_gem5::getChangeStamp();
|
||||
_valueChangedEvent.notify(SC_ZERO_TIME);
|
||||
}
|
||||
@@ -293,18 +301,23 @@ class sc_signal<bool, WRITER_POLICY> :
|
||||
return;
|
||||
|
||||
m_cur_val = m_new_val;
|
||||
uint64_t change_stamp = ::sc_gem5::getChangeStamp();
|
||||
_changeStamp = change_stamp;
|
||||
_valueChangedEvent.notify(SC_ZERO_TIME);
|
||||
_signalChange();
|
||||
if (m_cur_val) {
|
||||
_posStamp = change_stamp;
|
||||
_posStamp = ::sc_gem5::getChangeStamp();
|
||||
_posedgeEvent.notify(SC_ZERO_TIME);
|
||||
} else {
|
||||
_negStamp = change_stamp;
|
||||
_negStamp = ::sc_gem5::getChangeStamp();
|
||||
_negedgeEvent.notify(SC_ZERO_TIME);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
_signalChange()
|
||||
{
|
||||
_changeStamp = ::sc_gem5::getChangeStamp();
|
||||
_valueChangedEvent.notify(SC_ZERO_TIME);
|
||||
}
|
||||
|
||||
bool m_cur_val;
|
||||
bool m_new_val;
|
||||
|
||||
@@ -438,11 +451,21 @@ class sc_signal<sc_dt::sc_logic, WRITER_POLICY> :
|
||||
return;
|
||||
|
||||
m_cur_val = m_new_val;
|
||||
_valueChangedEvent.notify(SC_ZERO_TIME);
|
||||
if (m_cur_val == sc_dt::SC_LOGIC_1)
|
||||
_signalChange();
|
||||
if (m_cur_val == sc_dt::SC_LOGIC_1) {
|
||||
_posStamp = ::sc_gem5::getChangeStamp();
|
||||
_posedgeEvent.notify(SC_ZERO_TIME);
|
||||
else if (m_cur_val == sc_dt::SC_LOGIC_0)
|
||||
} else if (m_cur_val == sc_dt::SC_LOGIC_0) {
|
||||
_negStamp = ::sc_gem5::getChangeStamp();
|
||||
_negedgeEvent.notify(SC_ZERO_TIME);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
_signalChange()
|
||||
{
|
||||
_changeStamp = ::sc_gem5::getChangeStamp();
|
||||
_valueChangedEvent.notify(SC_ZERO_TIME);
|
||||
}
|
||||
|
||||
sc_dt::sc_logic m_cur_val;
|
||||
|
||||
Reference in New Issue
Block a user