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:
Yu-hsin Wang
2021-03-30 14:56:54 +08:00
parent 729ab6d4d8
commit aa33b5746b
2 changed files with 71 additions and 0 deletions

View File

@@ -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

View File

@@ -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__