in hdk/common/ip/cl_ip/cl_ip.ip_user_files/sim_scripts/cl_axi_sc_1x1/activehdl/smartconnect_xtlm.cxx [1786:2101]
void smartconnect_xtlm::process_saxi_rd_resp() {
print_header("process_saxi_rd_resp()");
while (!slave_rd_resp.empty()) {
xtlm::aximm_payload* m_req_trans_ptr = NULL;
xtlm::aximm_payload* m_resp_trans_ptr = NULL;
xtlm::aximm_payload* trans_ptr = slave_rd_resp.front();
unsigned int num_si = map_rd_si_to_numsi[trans_ptr];
if (m_report_handler->get_verbosity_level()
== xsc::common_cpp::VERBOSITY::DEBUG) {
m_ss.str("");
m_ss << this->name() << "num_si is: " << num_si << std::endl;
m_ss << "SI trans is is: " << trans_ptr<< "\n\n";
XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
DEBUG);
}
unsigned int num_mi = slave_rd_resp_nummi.front();
bool si_cascaded = (SI_m_properties[num_si].getInt("IS_CASCADED") == 1);
bool mi_cascaded = (MI_m_properties[num_mi].getInt("IS_CASCADED") == 1);
trans_ptr->set_response_status(xtlm::XTLM_OK_RESPONSE);
if (m_report_handler->get_verbosity_level()
== xsc::common_cpp::VERBOSITY::DEBUG) {
m_ss.str("");
m_ss << this->name() << "saxi_rd_resp_vec[" << num_si << "] size: " << saxi_rd_resp_vec[num_si].size() << "\n"
<< "Processing process_saxi_rd_resp on num_si: " << num_si << "\n"
<< "BEGIN Response information\n";
XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
DEBUG);
}
if (m_report_handler->get_verbosity_level()
== xsc::common_cpp::VERBOSITY::DEBUG) {
trans_ptr->get_log(payload_msg, 3);
m_ss.str("");
m_ss << this->name() << payload_msg << std::endl;
m_ss << "RESPONSE: " << trans_ptr->get_response_string()
<< "END Response information\n\n";
XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
DEBUG);
payload_msg = "";
}
if (saxi_rd_util[num_si]->is_master_ready() == false) {
if (m_report_handler->get_verbosity_level()
== xsc::common_cpp::VERBOSITY::DEBUG) {
m_ss.str("");
m_ss << this->name() << "Processing process_saxi_rd_resp on num_si: " << num_si << " master not ready\n" << std::endl;
XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
DEBUG);
}
next_trigger(saxi_rd_util[num_si]->data_sampled);
return;
}
slave_rd_resp.pop_front();
slave_rd_resp_nummi.pop_front();
saxi_rd_resp_vec[num_si].pop_front();
if (si_cascaded) { //If SI is cascaded, clear the pointers and send response to upstream
mmap_rd_si_to_mi_itr = mmap_rd_si_to_mi.find(trans_ptr);
while (mmap_rd_si_to_mi_itr != mmap_rd_si_to_mi.end()) {
m_req_trans_ptr = mmap_rd_si_to_mi_itr->second;
mmap_rd_si_to_mi.erase(mmap_rd_si_to_mi_itr);
map_rd_mi_to_si.erase(m_req_trans_ptr);
mmap_rd_si_to_mi_itr = mmap_rd_si_to_mi.find(trans_ptr);
m_req_trans_ptr = NULL;
}
} else { //Else, extract read data from response
int s_burst_length = trans_ptr->get_burst_length();
int s_burst_size = trans_ptr->get_burst_size();
int s_burst_cnt = trans_ptr->get_burst_length();
int s_num_burst = s_burst_size;
// int s_data_size = s_burst_cnt * s_num_burst;
int s_data_size = trans_ptr->get_data_length();
uint64_t s_addr = trans_ptr->get_address();
unsigned char* s_data_ptr = trans_ptr->get_data_ptr();
int s_data_ptr_indx = 0;
int s_data_ptr_indx_high = s_data_size - 1;
if (m_report_handler->get_verbosity_level()
== xsc::common_cpp::VERBOSITY::DEBUG) {
m_ss.str("");
m_ss << this->name() << "saxi burst_length is: " << s_burst_length << "\n"
<< "saxi burst_size is: " << s_burst_size << "\n"
<< "saxi start addr is: " << std::hex << s_addr << "\n"
<< "saxi end addr is: " << std::hex << s_data_ptr_indx_high << "\n"
<< "saxi data_ptr is: " << std::hex << s_data_ptr << "\n\n";
XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
DEBUG);
}
mmap_rd_si_to_mi_itr = mmap_rd_si_to_mi.find(trans_ptr);
//Loop through all MI trans mapped to this SI trans
while (mmap_rd_si_to_mi_itr != mmap_rd_si_to_mi.end()) {
m_req_trans_ptr = mmap_rd_si_to_mi_itr->second;
m_resp_trans_ptr = mmap_rd_si_to_mi_itr->second;
if (m_report_handler->get_verbosity_level()
== xsc::common_cpp::VERBOSITY::DEBUG) {
m_ss.str("");
m_ss << this->name() << "maxi transaction is: " << m_req_trans_ptr << std::endl;
XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
DEBUG);
}
if (!mi_cascaded) { //MI not cascaded so these are orinigal trans responses so extract read data here
int m_burst_length = m_req_trans_ptr->get_burst_length();
int m_burst_size = m_req_trans_ptr->get_burst_size();
unsigned char* m_data_ptr = m_resp_trans_ptr->get_data_ptr();
int m_burst_cnt = m_burst_length;
int m_num_burst = m_burst_size;
int m_data_size = m_req_trans_ptr->get_data_length();
if (m_report_handler->get_verbosity_level()
== xsc::common_cpp::VERBOSITY::DEBUG) {
m_ss.str("");
m_ss << this->name() << "BEGIN Regslice vector pop out READ information\n" << std::endl;
XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
DEBUG);
}
if (m_report_handler->get_verbosity_level()
== xsc::common_cpp::VERBOSITY::DEBUG) {
m_resp_trans_ptr->get_log(payload_msg, 3);
m_ss.str("");
m_ss << this->name() << payload_msg << std::endl;
m_ss << "END Regslice vector pop out READ information\n\n";
XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
DEBUG);
payload_msg = "";
}
if (m_resp_trans_ptr->is_response_error()) {
trans_ptr->set_response_status(m_resp_trans_ptr->get_response_status());
// maxi_rd_resp_vec[slave_rd_resp].clear();
// break;
} else {
for (int i = 0; i < m_burst_cnt; i++) {
for (int j = 0; j < m_num_burst; j++) {
s_data_ptr[s_data_ptr_indx] = (unsigned int) m_data_ptr[(i*m_num_burst) + j];
if (m_report_handler->get_verbosity_level()
== xsc::common_cpp::VERBOSITY::DEBUG) {
m_ss.str("");
m_ss << this->name() << "Read s_data_ptr[" << s_data_ptr_indx << "] = m_data_ptr["
<< (i*m_num_burst) + j << "]: "<< std::hex
<< static_cast<int>(m_data_ptr[(i*m_num_burst) + j]) << "\n" << std::endl;
XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
DEBUG);
}
s_data_ptr_indx++;
if (s_data_ptr_indx > s_data_ptr_indx_high) {
if (m_report_handler->get_verbosity_level()
== xsc::common_cpp::VERBOSITY::DEBUG) {
m_ss.str("");
m_ss << this->name() << "breaking loop \n" << std::endl;
XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
DEBUG);
}
break;
}
} //for int j
if (s_data_ptr_indx > s_data_ptr_indx_high) {
if (m_report_handler->get_verbosity_level()
== xsc::common_cpp::VERBOSITY::DEBUG) {
m_ss.str("");
m_ss << this->name() << "breaking loop \n" << std::endl;
XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
DEBUG);
}
break;
}
} //for i
} //else
} else { //MI is cascaded so extract original MI trans from extension object
smartconnect_extension* exten = m_req_trans_ptr->get_extension<smartconnect_extension>();
xtlm::aximm_payload* mi_trans_ptr = NULL;
while ( !((exten->get_mi_trans_vec()).empty()) ) {
mi_trans_ptr = (exten->get_mi_trans_vec()).front();
(exten->get_mi_trans_vec()).pop_front();
if (mi_trans_ptr->is_response_error()) {
trans_ptr->set_response_status(mi_trans_ptr->get_response_status());
} else {
int m_burst_length = mi_trans_ptr->get_burst_length();
int m_burst_size = mi_trans_ptr->get_burst_size();
unsigned char* m_data_ptr = mi_trans_ptr->get_data_ptr();
int m_burst_cnt = m_burst_length;
int m_num_burst = m_burst_size;
int m_data_size = mi_trans_ptr->get_data_length();
if (m_report_handler->get_verbosity_level()
== xsc::common_cpp::VERBOSITY::DEBUG) {
m_ss.str("");
m_ss << this->name() << "BEGIN Regslice vector pop out READ information\n" << std::endl;
XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
DEBUG);
}
if (m_report_handler->get_verbosity_level()
== xsc::common_cpp::VERBOSITY::DEBUG) {
mi_trans_ptr->get_log(payload_msg, 3);
m_ss.str("");
m_ss << this->name() << payload_msg << std::endl;
m_ss << "END Regslice vector pop out READ information\n\n";
XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
DEBUG);
payload_msg = "";
}
for (int i = 0; i < m_burst_cnt; i++) {
for (int j = 0; j < m_num_burst; j++) {
s_data_ptr[s_data_ptr_indx] = (unsigned int) m_data_ptr[(i*m_num_burst) + j];
if (m_report_handler->get_verbosity_level()
== xsc::common_cpp::VERBOSITY::DEBUG) {
m_ss.str("");
m_ss << this->name() << "Read s_data_ptr[" << s_data_ptr_indx << "] = m_data_ptr["
<< (i*m_num_burst) + j << "]: "<< std::hex
<< static_cast<int>(m_data_ptr[(i*m_num_burst) + j]) << "\n" << std::endl;
XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
DEBUG);
}
s_data_ptr_indx++;
if (s_data_ptr_indx > s_data_ptr_indx_high) {
if (m_report_handler->get_verbosity_level()
== xsc::common_cpp::VERBOSITY::DEBUG) {
m_ss.str("");
m_ss << this->name() << "breaking loop \n" << std::endl;
XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
DEBUG);
}
break;
}
} //for int j
if (s_data_ptr_indx > s_data_ptr_indx_high) {
if (m_report_handler->get_verbosity_level()
== xsc::common_cpp::VERBOSITY::DEBUG) {
m_ss.str("");
m_ss << this->name() << "breaking loop \n" << std::endl;
XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
DEBUG);
}
break;
}
} //for i
}
mi_trans_ptr->release();
}
}
mmap_rd_si_to_mi.erase(mmap_rd_si_to_mi_itr);
map_rd_mi_to_si.erase(m_req_trans_ptr);
mmap_rd_si_to_mi_itr = mmap_rd_si_to_mi.find(trans_ptr);
m_req_trans_ptr->release();
m_req_trans_ptr = NULL;
m_resp_trans_ptr = NULL;
} //while
}
if (trans_ptr->get_response_status() == NULL) {
trans_ptr->set_response_status(xtlm::XTLM_GENERIC_ERROR_RESPONSE);
}
sc_time delay = SC_ZERO_TIME;
if (trans_ptr != NULL) {
if (m_report_handler->get_verbosity_level()
== xsc::common_cpp::VERBOSITY::DEBUG) {
m_ss.str("");
m_ss << this->name() << "BEGIN sending Read Response information on num_si " << num_si << "\n" << std::endl;
XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
DEBUG);
}
if (m_report_handler->get_verbosity_level()
== xsc::common_cpp::VERBOSITY::DEBUG) {
trans_ptr->get_log(payload_msg, 3);
m_ss.str("");
m_ss << this->name() << payload_msg << std::endl;
m_ss << "RESPONSE: " << trans_ptr->get_response_string() << "\n"
<< "END sending Read Response information on num_si " << num_si << "\n\n";
XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
DEBUG);
payload_msg = "";
}
print_log("SI", num_si, "READ", "Response sent", trans_ptr);
saxi_rd_util[num_si]->send_data(*trans_ptr, delay);
map_rd_si_to_nummi.erase(trans_ptr);
map_rd_si_to_numsi.erase(trans_ptr);
// trans_ptr->release();
}
} //end of while loop
//Check for pending incoming rd trans
check_saxi_rd_req.notify(sc_core::SC_ZERO_TIME);
print_footer("process_saxi_rd_resp()");
}