17#include "reordering_target.h"
19axi::pe::tx_reorderer::tx_reorderer(
const sc_core::sc_module_name& nm)
20: sc_core::sc_module(nm) {
21 add_attribute(min_latency);
22 add_attribute(max_latency);
23 add_attribute(prioritize_by_latency);
24 add_attribute(prioritize_by_qos);
25#if SYSTEMC_VERSION < 20250221
26 SC_HAS_PROCESS(tx_reorderer);
30 sensitive << clk_i.pos();
36 auto id = ext->get_id();
37 reorder_buffer[payload.get_command()][id].emplace_back(payload);
39 SCCFATAL(SCMOD) <<
"Transaction is not a AXI4 transaction";
42void axi::pe::tx_reorderer::clock_cb() {
43 for(
unsigned cmd = tlm::TLM_READ_COMMAND; cmd < tlm::TLM_IGNORE_COMMAND; ++cmd) {
44 if(!reorder_buffer[cmd].empty()) {
45 std::vector<unsigned> r1{}, r2{};
46 r1.reserve(reorder_buffer[cmd].size());
47 r2.reserve(reorder_buffer[cmd].size());
50 for(
auto& e : reorder_buffer[cmd]) {
52 e.second.front().age++;
53 if(e.second.front().age > max_latency.value) {
54 r1.push_back(e.first);
55 }
else if(e.second.front().age > min_latency.value) {
56 r2.push_back(e.first);
57 lat_sum += e.second.front().age;
58 max_qos = std::max<unsigned>(max_qos, e.second.front().trans->get_extension<axi::axi4_extension>()->get_qos());
64 for(
auto i = r1.begin() + 1; i != r1.end(); ++i) {
71 auto& deq = reorder_buffer[cmd][e];
72 auto notok = bw_o->transport(*deq.front().trans);
76 }
else if(r2.size() > window_size.value) {
77 if(prioritize_by_qos.value) {
78 std::vector<unsigned> res;
79 auto& buf = reorder_buffer[cmd];
80 std::copy_if(std::begin(r2), std::end(r2), std::back_inserter(res), [max_qos, &buf](
unsigned e) {
81 return buf[e].front().trans->get_extension<axi::axi4_extension>()->get_qos() >= max_qos;
84 auto& deq = reorder_buffer[cmd][res.front()];
85 auto notok = bw_o->transport(*deq.front().trans);
93 if(prioritize_by_latency.value) {
97 auto& deq = reorder_buffer[cmd][e];
98 part_sum += deq.front().age;
100 auto notok = bw_o->transport(*deq.front().trans);
108 auto& deq = reorder_buffer[cmd][r2[rnd]];
109 auto notok = bw_o->transport(*deq.front().trans);
void transport(tlm::tlm_generic_payload &payload, bool lt_transport=false) override
static uint64_t uniform()