21 #include <nvhls_int.h> 22 #include <nvhls_types.h> 23 #include <hls_globals.h> 24 #include <nvhls_connections.h> 83 #include <Scratchpad/ScratchpadTypes.h> 84 #include <mem_array.h> 86 template <
typename T,
int N,
int CAPACITY_IN_BYTES>
89 static const int ADDR_WIDTH =
nvhls::nbits<CAPACITY_IN_BYTES - 1>::val;
92 Connections::In<cli_req_t<T, ADDR_WIDTH, N> > cli_req;
93 Connections::Out<cli_rsp_t<T, N> > cli_rsp;
100 typedef NVUINTW(NBANKS_LOG2) bank_sel_t;
101 typedef NVUINTW(ADDR_WIDTH - NBANKS_LOG2) bank_addr_t;
110 bool input_reqs_valid[N];
112 bool bank_reqs_valid[N];
114 bool bank_rsps_valid[N];
115 bool load_rsps_valid[N];
118 bank_sel_t bank_src_lane[N];
119 bank_sel_t bank_dst_lane[N];
125 Scratchpad(sc_module_name name_) : sc_module(name_) {
127 sensitive << clk.pos();
140 #pragma hls_pipeline_init_interval 1 141 #pragma pipeline_stall_mode flush 150 curr_cli_req = cli_req.Pop();
151 is_load = (curr_cli_req.opcode == LOAD);
154 #pragma hls_unroll yes 155 for (
int i = 0; i < N; i++) {
159 bank_sel = nvhls::get_slc<NBANKS_LOG2>(curr_cli_req.addr[i], 0);
160 bank_src_lane[bank_sel] = i;
163 bank_dst_lane[i] = bank_sel;
166 input_reqs_valid[i] = (curr_cli_req.valids[i] ==
true);
168 curr_cli_req.addr[i], NBANKS_LOG2);
170 input_reqs[i].wdata = curr_cli_req.data[i];
174 crossbar<bank_req_t, N, N>(input_reqs, input_reqs_valid, bank_src_lane,
175 bank_reqs, bank_reqs_valid);
178 #pragma hls_unroll yes 179 for (
int i = 0; i < N; i++) {
180 if ((bank_reqs_valid[i] ==
true) && is_load) {
181 bank_rsps_valid[i] =
true;
182 bank_rsps_data[i] = banks.read(bank_reqs[i].addr, i);
183 }
else if ((bank_reqs_valid[i] ==
true) && !is_load) {
184 banks.write(bank_reqs[i].addr, i, bank_reqs[i].wdata);
185 bank_rsps_valid[i] =
false;
187 bank_rsps_valid[i] =
false;
192 crossbar<T, N, N>(bank_rsps_data, bank_rsps_valid, bank_dst_lane,
193 load_rsp.data, load_rsps_valid);
194 #pragma hls_unroll yes 195 for (
int i = 0; i < N; i++) {
196 load_rsp.valids[i] = load_rsps_valid[i];
200 cli_rsp.Push(load_rsp);
Parameterized banked scratchpad memory.
nvhls_t< W >::nvuint_t get_slc(type X, const unsigned int i)
Function that returns slice of bits.
Compute number of bits to represent a constant.
#define NVHLS_NEG_RESET_SIGNAL_IS(port)
ENABLE_SYNC_RESET define: Select synchronous or asynchronous reset.Matchlib uses asynchronous, active-low reset by default. Defining ENABLE_SYNC_RESET will use synchronous, active-low reset instead. The macros NVHLS_NEG_RESET_SIGNAL_IS() and NVHLS_POS_RESET_SIGNAL_IS() can be used in place of SystemC's reset_signal_is() and async_reset_signal_is() so that ENABLE_SYNC_RESET can select type.