17 #ifndef __AXISUBORDINATETOMEM_H__
18 #define __AXISUBORDINATETOMEM_H__
21 #include <ac_reset_signal_is.h>
22 #include <hls_globals.h>
24 #include <mem_array.h>
56 template <
typename axiCfg,
int capacity,
int fifoDepth = 8>
59 static const int capacity_in_bytes = capacity;
60 static const int banks = 1;
62 typedef NVUINTW(axiCfg::dataWidth) Data;
68 static const int kDebugLevel = 2;
71 static const int bytesPerWord = axiCfg::dataWidth >> 3;
73 typename axi4_::read::template subordinate<> if_rd;
74 typename axi4_::write::template subordinate<> if_wr;
76 sc_in<bool> reset_bar;
85 : if_rd(
"if_rd"), if_wr(
"if_wr"), reset_bar(
"reset_bar"), clk(
"clk") {
87 sensitive << clk.pos();
88 async_reset_signal_is(reset_bar,
false);
101 sc_uint<axi4_::ALEN_WIDTH> rd_beat_cnt = 0;
102 sc_uint<axi4_::ALEN_WIDTH> wr_beat_cnt = 0;
104 #pragma hls_pipeline_init_interval 2
105 #pragma pipeline_stall_mode flush
109 bool rd_resp_full = rd_resp.isFull();
111 if (!rd_resp.isEmpty()) {
113 data_pld = rd_resp.peek();
114 if (if_rd.nb_rwrite(data_pld)) {
119 if (!rd_resp_full && !rd_addr.isEmpty()) {
121 rd_addr_pld = rd_addr.peek();
123 CDCOUT(sc_time_stamp() <<
" " << name() <<
" Received read request: "
125 << endl, kDebugLevel);
128 data_pld.data = memarray.read(rd_addr_pld.addr + bytesPerWord*rd_beat_cnt);
129 data_pld.resp = axi4_::Enc::XRESP::OKAY;
130 data_pld.id = rd_addr_pld.id;
132 auto rd_beat_cnt_local = rd_beat_cnt;
134 if (rd_beat_cnt_local == rd_addr_pld.len) {
135 rd_beat_cnt_local = 0;
143 rd_beat_cnt = rd_beat_cnt_local;
144 rd_resp.push(data_pld);
147 if (!rd_addr.isFull()) {
149 if (if_rd.nb_aread(rd_addr_pld)) {
150 rd_addr.push(rd_addr_pld);
154 bool wr_resp_full = wr_resp.isFull();
155 bool wr_addr_full = wr_addr.isFull();
157 if (!wr_resp.isEmpty()) {
159 resp_pld = wr_resp.peek();
160 if (if_wr.nb_bwrite(resp_pld)) {
165 if (!wr_resp_full && !wr_addr.isEmpty()) {
167 wr_addr_pld = wr_addr.peek();
171 if (if_wr.w.PopNB(write_pld)) {
172 auto wr_beat_cnt_local = wr_beat_cnt;
173 memarray.write(
static_cast<typename Memarray::LocalIndex
>(
static_cast<sc_uint<axi4_::ADDR_WIDTH>
>
174 (wr_addr_pld.addr) + bytesPerWord*wr_beat_cnt_local), 0, write_pld.data);
175 CDCOUT(sc_time_stamp() <<
" " << name() <<
" Received write request:"
176 <<
" addr=[" << wr_addr_pld <<
"]"
177 <<
" data=[" << write_pld <<
"]"
178 <<
" beat=" << dec << wr_beat_cnt_local
179 << endl, kDebugLevel);
181 if (wr_beat_cnt_local == wr_addr_pld.len) {
182 wr_beat_cnt_local = 0;
183 NVHLS_ASSERT_MSG(write_pld.last ==
true,
"WRLEN indicates that this should be the last beat, but WRLAST is not set");
188 resp_pld.resp = axi4_::Enc::XRESP::OKAY;
189 resp_pld.id = wr_addr_pld.id;
190 wr_resp.push(resp_pld);
192 NVHLS_ASSERT_MSG(write_pld.last ==
false,
"WRLEN indicates that this should not be the last beat, but WRLAST is set");
196 wr_beat_cnt = wr_beat_cnt_local;
202 if (if_wr.aw.PopNB(wr_addr_pld)) {
203 wr_addr.push(wr_addr_pld);
The base axi4 class parameterized according a valid config.
#define NVHLS_ASSERT_MSG(X, MSG)
A struct composed of the signals associated with AXI read and write requests.
A struct composed of the signals associated with an AXI read response.
A struct composed of the signals associated with an AXI write response.
A struct composed of the signals associated with AXI write data.