87 auto lut_entry = read_lut.getEntry(addr);
88 if(lut_entry.get_granted_access() != tlm::tlm_dmi::DMI_ACCESS_NONE && addr + length <= lut_entry.get_end_address() + 1) {
89 auto offset = addr - lut_entry.get_start_address();
90 std::copy(lut_entry.get_dmi_ptr() + offset, lut_entry.get_dmi_ptr() + offset + length, data);
91 bus_clk_sycles += lut_entry.get_read_latency() /
clk_period.get_value();
94 tlm::tlm_generic_payload gp;
95 gp.set_command(tlm::TLM_READ_COMMAND);
97 gp.set_data_ptr(data);
98 gp.set_data_length(length);
99 gp.set_streaming_width(length);
100 sc_core::sc_time delay = quantum_keeper.get_local_time();
101 auto pre_delay = delay;
102 fw_if->b_transport(gp, delay);
103 if(pre_delay > delay) {
104 quantum_keeper.reset();
106 auto incr = (delay - quantum_keeper.get_local_time()) /
clk_period.get_value();
107 bus_clk_sycles += incr;
109 SCCTRACE(this->name()) <<
"[local time: " << delay <<
"]: finish read(0x" << std::hex << addr <<
") : 0x"
110 << (length == 4 ? *(uint32_t*)data
111 : length == 2 ? *(uint16_t*)data
113 if(gp.get_response_status() != tlm::TLM_OK_RESPONSE) {
116 if(gp.is_dmi_allowed() && !
disable_dmi.get_value()) {
117 gp.set_command(tlm::TLM_READ_COMMAND);
118 gp.set_address(addr);
119 tlm::tlm_dmi dmi_data;
120 if(fw_if->get_direct_mem_ptr(gp, dmi_data)) {
122 if(dmi_data.is_read_allowed()) {
123 read_lut.addEntry(dmi_data, dmi_data.get_start_address(),
124 dmi_data.get_end_address() - dmi_data.get_start_address() + 1);
127 if(dmi_data.is_write_allowed()) {
128 write_lut.addEntry(dmi_data, dmi_data.get_start_address(),
129 dmi_data.get_end_address() - dmi_data.get_start_address() + 1);
148 auto lut_entry = write_lut.getEntry(addr);
149 if(lut_entry.get_granted_access() != tlm::tlm_dmi::DMI_ACCESS_NONE && addr + length <= lut_entry.get_end_address() + 1) {
150 auto offset = addr - lut_entry.get_start_address();
151 std::copy(data, data + length, lut_entry.get_dmi_ptr() + offset);
152 bus_clk_sycles += lut_entry.get_write_latency() /
clk_period.get_value();
155 write_buf.resize(length);
156 std::copy(data, data + length, write_buf.begin());
157 tlm::tlm_generic_payload gp;
158 gp.set_command(tlm::TLM_WRITE_COMMAND);
159 gp.set_address(addr);
160 gp.set_data_ptr(write_buf.data());
161 gp.set_data_length(length);
162 gp.set_streaming_width(length);
163 sc_core::sc_time delay = quantum_keeper.get_local_time();
164 auto pre_delay = delay;
165 fw_if->b_transport(gp, delay);
166 if(pre_delay > delay)
167 quantum_keeper.reset();
169 bus_clk_sycles += (delay - quantum_keeper.get_local_time()) /
clk_period.get_value();
170 SCCTRACE() <<
"[local time: " << delay <<
"]: finish write(0x" << std::hex << addr <<
") : 0x"
171 << (length == 4 ? *(uint32_t*)data
172 : length == 2 ? *(uint16_t*)data
174 if(gp.get_response_status() != tlm::TLM_OK_RESPONSE) {
177 if(gp.is_dmi_allowed() && !
disable_dmi.get_value()) {
178 gp.set_command(tlm::TLM_WRITE_COMMAND);
179 gp.set_address(addr);
180 tlm::tlm_dmi dmi_data;
181 if(fw_if->get_direct_mem_ptr(gp, dmi_data)) {
183 if(dmi_data.is_write_allowed()) {
184 write_lut.addEntry(dmi_data, dmi_data.get_start_address(),
185 dmi_data.get_end_address() - dmi_data.get_start_address() + 1);
188 if(dmi_data.is_read_allowed()) {
189 read_lut.addEntry(dmi_data, dmi_data.get_start_address(),
190 dmi_data.get_end_address() - dmi_data.get_start_address() + 1);