Skip to content

Commit d4659ec

Browse files
committed
corrects DMI wrt spaces
1 parent a9257ea commit d4659ec

File tree

2 files changed

+42
-16
lines changed

2 files changed

+42
-16
lines changed

src/sysc/core_complex.cpp

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
#include "iss_factory.h"
4242
#include "tlm/scc/quantum_keeper.h"
4343
#include "sysc/memspace_extension.h"
44+
#include "util/range_lut.h"
4445
#include <memory>
4546
#include <sstream>
4647
#include <sysc/kernel/sc_simcontext.h>
@@ -179,10 +180,7 @@ void core_complex<BUSWIDTH, QK>::create_cpu(std::string const& type, std::string
179180
#ifndef CWR_SYSTEMC
180181
template <unsigned int BUSWIDTH, typename QK>
181182
core_complex<BUSWIDTH, QK>::core_complex(sc_module_name const& name)
182-
: sc_module(name)
183-
, fetch_lut(tlm_dmi_ext())
184-
, read_lut(tlm_dmi_ext())
185-
, write_lut(tlm_dmi_ext()) {
183+
: sc_module(name) {
186184
init();
187185
}
188186
#endif
@@ -195,13 +193,17 @@ template <unsigned int BUSWIDTH, typename QK> void core_complex<BUSWIDTH, QK>::i
195193
}
196194
});
197195
dbus.register_invalidate_direct_mem_ptr([this](uint64_t start, uint64_t end) -> void {
198-
auto lut_entry = read_lut.getEntry(start);
199-
if(lut_entry.get_granted_access() != tlm::tlm_dmi::DMI_ACCESS_NONE && end <= lut_entry.get_end_address() + 1) {
200-
read_lut.removeEntry(lut_entry);
196+
for(auto& read_lut : dmi_read_luts) {
197+
auto lut_entry = read_lut.getEntry(start);
198+
if(lut_entry.get_granted_access() != tlm::tlm_dmi::DMI_ACCESS_NONE && end <= lut_entry.get_end_address() + 1) {
199+
read_lut.removeEntry(lut_entry);
200+
}
201201
}
202-
lut_entry = write_lut.getEntry(start);
203-
if(lut_entry.get_granted_access() != tlm::tlm_dmi::DMI_ACCESS_NONE && end <= lut_entry.get_end_address() + 1) {
204-
write_lut.removeEntry(lut_entry);
202+
for(auto& write_lut : dmi_write_luts) {
203+
auto lut_entry = write_lut.getEntry(start);
204+
if(lut_entry.get_granted_access() != tlm::tlm_dmi::DMI_ACCESS_NONE && end <= lut_entry.get_end_address() + 1) {
205+
write_lut.removeEntry(lut_entry);
206+
}
205207
}
206208
});
207209

@@ -401,9 +403,8 @@ template <unsigned int BUSWIDTH, typename QK> void core_complex<BUSWIDTH, QK>::r
401403
template <unsigned int BUSWIDTH, typename QK>
402404
bool core_complex<BUSWIDTH, QK>::read_mem(const addr_t& addr, unsigned length, uint8_t* const data) {
403405
// basically checking for mem_type_e in CORENAME.h
404-
405406
bool is_fetch = addr.space == std::numeric_limits<decltype(addr.space)>::max() ? true : false;
406-
auto& dmi_lut = is_fetch ? fetch_lut : read_lut;
407+
auto& dmi_lut = is_fetch ? fetch_lut : get_read_lut(addr.space);
407408
auto lut_entry = dmi_lut.getEntry(addr.val);
408409
if(lut_entry.get_granted_access() != tlm::tlm_dmi::DMI_ACCESS_NONE && (addr.val + length) <= (lut_entry.get_end_address() + 1)) {
409410
auto offset = addr.val - lut_entry.get_start_address();
@@ -463,7 +464,7 @@ bool core_complex<BUSWIDTH, QK>::read_mem(const addr_t& addr, unsigned length, u
463464

464465
template <unsigned int BUSWIDTH, typename QK>
465466
bool core_complex<BUSWIDTH, QK>::write_mem(const addr_t& addr, unsigned length, const uint8_t* const data) {
466-
auto lut_entry = write_lut.getEntry(addr.val);
467+
auto lut_entry = get_write_lut(addr.space).getEntry(addr.val);
467468
if(lut_entry.get_granted_access() != tlm::tlm_dmi::DMI_ACCESS_NONE && (addr.val + length) <= (lut_entry.get_end_address() + 1)) {
468469
auto offset = addr.val - lut_entry.get_start_address();
469470
std::copy(data, data + length, lut_entry.get_dmi_ptr() + offset);
@@ -506,8 +507,8 @@ bool core_complex<BUSWIDTH, QK>::write_mem(const addr_t& addr, unsigned length,
506507
tlm_dmi_ext dmi_data;
507508
if(exec_get_direct_mem_ptr(gp, dmi_data)) {
508509
if(dmi_data.is_write_allowed() && (addr.val + length - 1) <= dmi_data.get_end_address())
509-
write_lut.addEntry(dmi_data, dmi_data.get_start_address(),
510-
dmi_data.get_end_address() - dmi_data.get_start_address() + 1);
510+
get_write_lut(addr.space)
511+
.addEntry(dmi_data, dmi_data.get_start_address(), dmi_data.get_end_address() - dmi_data.get_start_address() + 1);
511512
}
512513
}
513514
return true;
@@ -539,6 +540,22 @@ bool core_complex<BUSWIDTH, QK>::write_mem_dbg(const addr_t& addr, unsigned leng
539540
gp.set_extension(new sysc::memspace::tlm_memspace_extension<>(static_cast<memspace::common>(addr.space)));
540541
return dbus->transport_dbg(gp) == length;
541542
}
543+
template <unsigned int BUSWIDTH, typename QK> util::range_lut<tlm_dmi_ext>& core_complex<BUSWIDTH, QK>::get_read_lut(unsigned space) {
544+
return get_lut(dmi_read_luts, space);
545+
};
546+
template <unsigned int BUSWIDTH, typename QK> util::range_lut<tlm_dmi_ext>& core_complex<BUSWIDTH, QK>::get_write_lut(unsigned space) {
547+
return get_lut(dmi_write_luts, space);
548+
};
549+
template <unsigned int BUSWIDTH, typename QK>
550+
util::range_lut<tlm_dmi_ext>& core_complex<BUSWIDTH, QK>::get_lut(lut_vec_t& luts, unsigned space) {
551+
if(space >= luts.size()) {
552+
luts.reserve(space + 1);
553+
// cannot use resize as assignment and move assignment operator are not supported by range_luts with tlm_dmi_ext as defaults
554+
while(space >= luts.size())
555+
luts.emplace_back(tlm_dmi_ext());
556+
}
557+
return luts[space];
558+
};
542559

543560
template class core_complex<scc::LT>;
544561
template class core_complex<32>;

src/sysc/core_complex.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
#include <tlm/scc/initiator_mixin.h>
4848
#include <tlm/scc/quantum_keeper.h>
4949
#include <tlm/scc/scv/tlm_rec_initiator_socket.h>
50+
#include <vector>
5051
#ifdef CWR_SYSTEMC
5152
#include <scmlinc/scml_property.h>
5253
#else
@@ -285,7 +286,10 @@ class core_complex : public sc_core::sc_module, public scc::traceable, public co
285286
//
286287
///////////////////////////////////////////////////////////////////////////////
287288
uint64_t last_sync_cycle = 0;
288-
util::range_lut<tlm_dmi_ext> fetch_lut, read_lut, write_lut;
289+
util::range_lut<tlm_dmi_ext> fetch_lut{tlm_dmi_ext()};
290+
inline util::range_lut<tlm_dmi_ext>& get_read_lut(unsigned space);
291+
inline util::range_lut<tlm_dmi_ext>& get_write_lut(unsigned space);
292+
289293
QK quantum_keeper;
290294
std::vector<uint8_t> write_buf;
291295
sc_core::sc_signal<sc_core::sc_time> curr_clk;
@@ -300,6 +304,11 @@ class core_complex : public sc_core::sc_module, public scc::traceable, public co
300304

301305
private:
302306
void init();
307+
// we reserve for 8 memory spaces
308+
using lut_vec_t = std::vector<util::range_lut<tlm_dmi_ext>>;
309+
lut_vec_t dmi_read_luts{8, util::range_lut<tlm_dmi_ext>(tlm_dmi_ext())};
310+
lut_vec_t dmi_write_luts{8, util::range_lut<tlm_dmi_ext>(tlm_dmi_ext())};
311+
util::range_lut<tlm_dmi_ext>& get_lut(lut_vec_t& luts, unsigned space);
303312
std::vector<iss::vm_plugin*> plugin_list;
304313
};
305314
} // namespace riscv

0 commit comments

Comments
 (0)