in hdk/common/ip/cl_ip/cl_ip.ip_user_files/sim_scripts/cl_axi_sc_2x2/modelsim/smartconnect_xtlm.cxx [770:1045]
void smartconnect_xtlm::create_burst_transaction(std::list<xtlm::aximm_payload*> &saxi_vec, std::list<xtlm::aximm_payload*> &maxi_vec,
std::list<unsigned int> &numsi_vec, int m_burst_length, unsigned int m_burst_size, int &req_cnt, unsigned int numsi,
unsigned int nummi, unsigned long long si_sep_route) {
print_header("create_burst_transaction()");
xtlm::aximm_payload* trans_ptr = saxi_vec.back();
unsigned int s_axi_id = trans_ptr->get_axi_id();
int s_burst_length = trans_ptr->get_burst_length();
int s_burst_cnt = s_burst_length;
int s_burst_size = trans_ptr->get_burst_size();
int s_num_burst = s_burst_size;
int s_data_size = trans_ptr->get_data_length();
//This is absolute s_data_size buffer
int s_data_size_abs = trans_ptr->get_data_length();
unsigned char* s_data_ptr = trans_ptr->get_data_ptr();
unsigned char* s_data_en_ptr = trans_ptr->get_byte_enable_ptr();
int s_data_ptr_indx = 0;
int s_data_ptr_indx_high = s_data_size_abs - 1;
if (m_report_handler->get_verbosity_level()
== xsc::common_cpp::VERBOSITY::DEBUG) {
m_ss.str("");
m_ss << this->name() << "BEGIN Incoming Paylod information" << 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 << "END Incoming Payload information\n\n";
XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
DEBUG);
payload_msg = "";
}
// int m_num_burst = decode_burst_size(m_burst_size);
int m_burst_cnt = m_burst_length;
int m_num_burst = m_burst_size;
int m_data_size = m_burst_cnt * m_num_burst;
bool mi_cascaded = (MI_m_properties[nummi].getInt("IS_CASCADED") == 1);
unsigned long long address = trans_ptr->get_address();
if(m_burst_size > s_burst_size) {
int si_size = encode_burst_size(s_burst_size);
int mi_size = encode_burst_size(m_burst_size);
int valid_byte = address & ((int) (std::pow(2, mi_size)) - 1);
int mask = 0xFFFFFFFF << si_size;
//Modify s_data_size buffer since the address on MI is unaligned
s_data_size += (valid_byte & mask);
if (m_report_handler->get_verbosity_level()
== xsc::common_cpp::VERBOSITY::DEBUG) {
m_ss.str("");
m_ss << this->name() << std::dec << "s_data_size buffer modified to:" << s_data_size << std::endl;
XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
DEBUG);
}
}
//Total new MI transactions generate
int num_mi_transaction = 1;
if (s_data_size > m_data_size) {
num_mi_transaction = ( s_data_size % m_data_size ) ? (s_data_size / m_data_size) + 1 :
(s_data_size / m_data_size);
}
if(!mi_cascaded) {
if (trans_ptr->get_command() == xtlm::XTLM_WRITE_COMMAND) {
map_wr_si_to_nummi[trans_ptr] = num_mi_transaction; //Maps number of mi_trans generated for given si_trans
if (m_report_handler->get_verbosity_level()
== xsc::common_cpp::VERBOSITY::DEBUG) {
m_ss.str("");
m_ss << this->name() << "Filled: map_wr_si_to_nummi[" << trans_ptr << "]: " << map_wr_si_to_nummi[trans_ptr] << std::endl;
XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
DEBUG);
}
map_wr_si_to_numsi[trans_ptr] = numsi; //Maps si_trans to corresponding SI port
if (m_report_handler->get_verbosity_level()
== xsc::common_cpp::VERBOSITY::DEBUG) {
m_ss.str("");
m_ss << this->name() << "Filled: map_wr_si_to_numsi[" << trans_ptr << "]: " << map_wr_si_to_numsi[trans_ptr] << std::endl;
XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
DEBUG);
}
} else if (trans_ptr->get_command() == xtlm::XTLM_READ_COMMAND) {
map_rd_si_to_nummi[trans_ptr] = num_mi_transaction; //Maps number of mi_trans generated for given si_trans
if (m_report_handler->get_verbosity_level()
== xsc::common_cpp::VERBOSITY::DEBUG) {
m_ss.str("");
m_ss << this->name() << "Filled: map_rd_si_to_nummi[" << trans_ptr << "]: " << map_rd_si_to_nummi[trans_ptr] << std::endl;
XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
DEBUG);
}
map_rd_si_to_numsi[trans_ptr] = numsi; //Maps si_trans to corresponding SI port
if (m_report_handler->get_verbosity_level()
== xsc::common_cpp::VERBOSITY::DEBUG) {
m_ss.str("");
m_ss << this->name() << "Filled: map_rd_si_to_numsi[" << trans_ptr << "]: " << map_rd_si_to_numsi[trans_ptr] << std::endl;
XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
DEBUG);
}
}
}
for (int num_trans = 0; num_trans < num_mi_transaction; num_trans++) {
m_trans = mem_manager->get_payload();
m_trans->acquire();
m_trans->set_command(trans_ptr->get_command());
m_trans->set_axi_id(static_cast<unsigned int>(0));
m_trans->set_burst_type(trans_ptr->get_burst_type());
numsi_vec.push_back(numsi);
int burst_cnt = 1;
int num_burst = 1;
int fill_null_bytes = 0;
if (m_report_handler->get_verbosity_level()
== xsc::common_cpp::VERBOSITY::DEBUG) {
m_ss.str("");
m_ss << this->name() << "Round: " << num_trans << "\n"
<< std::dec << "s_data_size: " << s_data_size << "\n"
<< std::dec << "m_data_size: " << m_data_size << "\n"
<< std::dec << "m_num_burst: " << m_num_burst << "\n";
XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
DEBUG);
}
if (s_data_size >= m_data_size) {
burst_cnt = m_burst_cnt;
num_burst = m_num_burst;
} else if (s_data_size >= m_num_burst) {
burst_cnt = (s_data_size % m_num_burst) ? (s_data_size/m_num_burst) + 1 : (s_data_size/m_num_burst);
num_burst = m_num_burst;
fill_null_bytes = (m_num_burst*burst_cnt) - s_data_size;
} else {
burst_cnt = 1;
num_burst = m_num_burst;
fill_null_bytes = m_num_burst - s_data_size;
}
if (m_report_handler->get_verbosity_level()
== xsc::common_cpp::VERBOSITY::DEBUG) {
m_ss.str("");
m_ss << this->name() << std::dec << "burst_cnt: " << burst_cnt << "\n"
<< std::dec << "num_burst: " << num_burst << "\n"
<< std::dec << "fill_null_bytes: " << fill_null_bytes << "\n";
XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
DEBUG);
}
m_trans->set_burst_size(m_num_burst);
m_trans->set_burst_length(burst_cnt);
unsigned int data_size = num_burst * burst_cnt;
m_trans->set_address(address);
address = address + data_size;
m_trans->create_and_get_data_ptr(data_size);
if(trans_ptr->get_byte_enable_ptr() == nullptr){
m_trans->set_byte_enable_ptr(nullptr, 0);
}else{
m_trans->create_and_get_byte_enable_ptr(data_size);
}
unsigned char* data_ptr = m_trans->get_data_ptr();
//Fill in data when it is xtlm::XTLM_WRITE_COMMAND
if (trans_ptr->get_command() == xtlm::XTLM_WRITE_COMMAND) {
unsigned char* data_en_ptr = m_trans->get_byte_enable_ptr();
for (int i = 0; i < burst_cnt; i++) {
for (int j = 0; j < num_burst; j++) {
if (s_data_size_abs > 0) {
data_ptr[i * num_burst + j] = s_data_ptr[s_data_ptr_indx + (i * num_burst) + j];
data_en_ptr[i * num_burst + j] = s_data_en_ptr[s_data_ptr_indx + (i * num_burst) + j];
if (m_report_handler->get_verbosity_level()
== xsc::common_cpp::VERBOSITY::DEBUG) {
m_ss.str("");
m_ss << this->name() << "Wrote data_ptr[" << i * num_burst + j << "] = s_data_ptr[" << s_data_ptr_indx + (i * num_burst) + j << "] : " << std::hex << static_cast<int>(s_data_ptr[s_data_ptr_indx + (i * num_burst) + j]) << std::endl;
XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
DEBUG);
}
} else {
data_ptr[i * num_burst + j] = 0x0;
data_en_ptr[i * num_burst + j] = 0x0;
if (m_report_handler->get_verbosity_level()
== xsc::common_cpp::VERBOSITY::DEBUG) {
m_ss.str("");
m_ss << this->name() << "Wrote data_ptr[" << i * num_burst + j << "] = 0x0\n" << std::endl;
XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
DEBUG);
}
}
s_data_size_abs--;
s_data_size--;
}
}
if (fill_null_bytes) {
//fill null bytes
}
s_data_ptr_indx += data_size;
} else {
s_data_size = s_data_size - (burst_cnt * num_burst);
}
if (m_report_handler->get_verbosity_level()
== xsc::common_cpp::VERBOSITY::DEBUG) {
m_ss.str("");
m_ss << this->name() << "BEGIN Outgoing " << num_trans << " Paylod information" << 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_trans->get_log(payload_msg, 3);
m_ss.str("");
m_ss << this->name() << payload_msg << std::endl;
m_ss << "END Outgoing " << num_trans << " Payload information\n";
XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
DEBUG);
payload_msg = "";
}
if (!mi_cascaded) {
if (trans_ptr->get_command() == xtlm::XTLM_WRITE_COMMAND) {
map_wr_mi_to_si[m_trans] = trans_ptr; //Map si_trans corresponding to each mi_trans
if (m_report_handler->get_verbosity_level()
== xsc::common_cpp::VERBOSITY::DEBUG) {
m_ss.str("");
m_ss << this->name() << "Filled: map_wr_mi_to_si[" << m_trans << "]: " << map_wr_mi_to_si[m_trans] << std::endl;
XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
DEBUG);
}
mmap_wr_si_to_mi.insert(std::make_pair(trans_ptr, m_trans)); //Maps si_trans to each generated mi_trans
if (m_report_handler->get_verbosity_level()
== xsc::common_cpp::VERBOSITY::DEBUG) {
m_ss.str("");
m_ss << this->name() << "Filled: mmap_wr_si_to_mi[" << trans_ptr << "]: " << m_trans << std::endl;
XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
DEBUG);
}
} else if (trans_ptr->get_command() == xtlm::XTLM_READ_COMMAND) {
map_rd_mi_to_si[m_trans] = trans_ptr; //Map si_trans corresponding to each mi_trans
if (m_report_handler->get_verbosity_level()
== xsc::common_cpp::VERBOSITY::DEBUG) {
m_ss.str("");
m_ss << this->name() << "Filled: map_rd_mi_to_si[" << m_trans << "]: " << map_rd_mi_to_si[m_trans] << std::endl;
XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
DEBUG);
}
mmap_rd_si_to_mi.insert(std::make_pair(trans_ptr, m_trans)); //Maps si_trans to each generated mi_trans
if (m_report_handler->get_verbosity_level()
== xsc::common_cpp::VERBOSITY::DEBUG) {
m_ss.str("");
m_ss << this->name() << "Filled: mmap_rd_si_to_mi[" << trans_ptr << "]: " << m_trans << std::endl;
XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
DEBUG);
}
}
}
maxi_vec.push_back(m_trans);
req_cnt++;
}
m_trans = NULL;
print_footer("create_burst_transaction()");
}