fixes quantum and quantum break handling
This commit is contained in:
@ -391,7 +391,10 @@ bool core_complex::read_mem(uint64_t addr, unsigned length, uint8_t *const data,
|
||||
if (lut_entry.get_granted_access() != tlm::tlm_dmi::DMI_ACCESS_NONE && addr + length <= lut_entry.get_end_address() + 1) {
|
||||
auto offset = addr - lut_entry.get_start_address();
|
||||
std::copy(lut_entry.get_dmi_ptr() + offset, lut_entry.get_dmi_ptr() + offset + length, data);
|
||||
quantum_keeper.inc(lut_entry.get_read_latency());
|
||||
if(is_fetch)
|
||||
ibus_inc+=lut_entry.get_read_latency()/curr_clk;
|
||||
else
|
||||
dbus_inc+=lut_entry.get_read_latency()/curr_clk;
|
||||
return true;
|
||||
} else {
|
||||
auto& sckt = is_fetch? ibus : dbus;
|
||||
@ -409,12 +412,17 @@ bool core_complex::read_mem(uint64_t addr, unsigned length, uint8_t *const data,
|
||||
auto preExt = new tlm::scc::scv::tlm_recording_extension(trc->tr_handle, this);
|
||||
gp.set_extension(preExt);
|
||||
}
|
||||
sckt->b_transport(gp, delay);
|
||||
auto incr = delay-quantum_keeper.get_local_time();
|
||||
if(is_fetch)
|
||||
ibus_inc+=incr;
|
||||
else
|
||||
dbus_inc+=incr;
|
||||
auto pre_delay = delay;
|
||||
dbus->b_transport(gp, delay);
|
||||
if(pre_delay>delay) {
|
||||
quantum_keeper.reset();
|
||||
} else {
|
||||
auto incr = (delay-quantum_keeper.get_local_time())/curr_clk;
|
||||
if(is_fetch)
|
||||
ibus_inc+=incr;
|
||||
else
|
||||
dbus_inc+=incr;
|
||||
}
|
||||
SCCTRACE(this->name()) << "[local time: "<<delay<<"]: finish read_mem(0x" << std::hex << addr << ") : 0x" << (length==4?*(uint32_t*)data:length==2?*(uint16_t*)data:(unsigned)*data);
|
||||
if (gp.get_response_status() != tlm::TLM_OK_RESPONSE) {
|
||||
return false;
|
||||
@ -439,7 +447,7 @@ bool core_complex::write_mem(uint64_t addr, unsigned length, const uint8_t *cons
|
||||
addr + length <= lut_entry.get_end_address() + 1) {
|
||||
auto offset = addr - lut_entry.get_start_address();
|
||||
std::copy(data, data + length, lut_entry.get_dmi_ptr() + offset);
|
||||
quantum_keeper.inc(lut_entry.get_read_latency());
|
||||
dbus_inc+=lut_entry.get_write_latency()/curr_clk;
|
||||
return true;
|
||||
} else {
|
||||
write_buf.resize(length);
|
||||
@ -455,8 +463,12 @@ bool core_complex::write_mem(uint64_t addr, unsigned length, const uint8_t *cons
|
||||
auto preExt = new tlm::scc::scv::tlm_recording_extension(trc->tr_handle, this);
|
||||
gp.set_extension(preExt);
|
||||
}
|
||||
auto pre_delay = delay;
|
||||
dbus->b_transport(gp, delay);
|
||||
dbus_inc+=delay-quantum_keeper.get_local_time();
|
||||
if(pre_delay>delay)
|
||||
quantum_keeper.reset();
|
||||
else
|
||||
dbus_inc+=(delay-quantum_keeper.get_local_time())/curr_clk;
|
||||
SCCTRACE() << "[local time: "<<delay<<"]: finish write_mem(0x" << std::hex << addr << ") : 0x" << (length==4?*(uint32_t*)data:length==2?*(uint16_t*)data:(unsigned)*data);
|
||||
if (gp.get_response_status() != tlm::TLM_OK_RESPONSE) {
|
||||
return false;
|
||||
|
Reference in New Issue
Block a user