systemc: define atomic extension
Gem5 defines several types of memory access including normal read, normal write, atomic operations. For now we only support normal read and normal write converting from SystemC via TLM2. To support atomic operations from SystemC, we add an atomic extension. A SystemC model can fire a atomic request with the extension. The extension mainly has two attributes. One is a AtomicOpFunctor which is the implementation of the atomic operation. The other one is bool which indicates the gem5 request flag should be ATOMIC_RETURN_OP or ATOMIC_NO_RETURN_OP. Change-Id: I817727dd4b2d357667f928063210c58a44c81afb Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/44525 Tested-by: kokoro <noreply+kokoro@google.com> Reviewed-by: Gabe Black <gabe.black@gmail.com> Maintainer: Gabe Black <gabe.black@gmail.com>
This commit is contained in:
@@ -77,4 +77,50 @@ Gem5Extension::copy_from(const tlm::tlm_extension_base &ext)
|
||||
packet = cpyFrom.packet;
|
||||
}
|
||||
|
||||
AtomicExtension::AtomicExtension(
|
||||
std::shared_ptr<AtomicOpFunctor> amo_op, bool need_return)
|
||||
: _op(amo_op), _needReturn(need_return)
|
||||
{
|
||||
}
|
||||
|
||||
tlm::tlm_extension_base *
|
||||
AtomicExtension::clone() const
|
||||
{
|
||||
return new AtomicExtension(*this);
|
||||
}
|
||||
|
||||
void
|
||||
AtomicExtension::copy_from(const tlm::tlm_extension_base &ext)
|
||||
{
|
||||
const AtomicExtension &from = static_cast<const AtomicExtension &>(ext);
|
||||
*this = from;
|
||||
}
|
||||
|
||||
AtomicExtension &
|
||||
AtomicExtension::getExtension(const tlm::tlm_generic_payload &payload)
|
||||
{
|
||||
return AtomicExtension::getExtension(&payload);
|
||||
}
|
||||
|
||||
AtomicExtension &
|
||||
AtomicExtension::getExtension(const tlm::tlm_generic_payload *payload)
|
||||
{
|
||||
AtomicExtension *result = nullptr;
|
||||
payload->get_extension(result);
|
||||
sc_assert(result);
|
||||
return *result;
|
||||
}
|
||||
|
||||
bool
|
||||
AtomicExtension::needReturn() const
|
||||
{
|
||||
return _needReturn;
|
||||
}
|
||||
|
||||
AtomicOpFunctor*
|
||||
AtomicExtension::getAtomicOpFunctor() const
|
||||
{
|
||||
return _op.get();
|
||||
}
|
||||
|
||||
} // namespace Gem5SystemC
|
||||
|
||||
@@ -34,6 +34,9 @@
|
||||
#ifndef __SYSTEMC_TLM_BRIDGE_SC_EXT_HH__
|
||||
#define __SYSTEMC_TLM_BRIDGE_SC_EXT_HH__
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include "base/amo.hh"
|
||||
#include "mem/packet.hh"
|
||||
#include "systemc/ext/tlm_core/2/generic_payload/gp.hh"
|
||||
|
||||
@@ -58,6 +61,28 @@ class Gem5Extension: public tlm::tlm_extension<Gem5Extension>
|
||||
PacketPtr packet;
|
||||
};
|
||||
|
||||
class AtomicExtension: public tlm::tlm_extension<AtomicExtension>
|
||||
{
|
||||
public:
|
||||
AtomicExtension(
|
||||
std::shared_ptr<AtomicOpFunctor> amo_op, bool need_return);
|
||||
|
||||
virtual tlm_extension_base *clone() const;
|
||||
virtual void copy_from(const tlm_extension_base &ext);
|
||||
|
||||
static AtomicExtension &getExtension(
|
||||
const tlm::tlm_generic_payload *payload);
|
||||
static AtomicExtension &getExtension(
|
||||
const tlm::tlm_generic_payload &payload);
|
||||
|
||||
bool needReturn() const;
|
||||
AtomicOpFunctor* getAtomicOpFunctor() const;
|
||||
|
||||
private:
|
||||
std::shared_ptr<AtomicOpFunctor> _op;
|
||||
bool _needReturn;
|
||||
};
|
||||
|
||||
} // namespace Gem5SystemC
|
||||
|
||||
#endif // __SYSTEMC_TLM_BRIDGE_SC_EXT_HH__
|
||||
|
||||
Reference in New Issue
Block a user