// Copyright (2019-2023) Paul Scherrer Institute // SPDX-License-Identifier: GPL-3.0-or-later #include "hls_jfjoch.h" void transfer_hbm(ap_uint<256> *d_hbm_p0, ap_uint<256> *uram, uint32_t hbm_offset, bool hbm_to_uram, uint8_t stride, uint8_t uram_offset) { #pragma HLS INTERFACE m_axi port=d_hbm_p0 bundle=d_hbm_p0 depth=512 offset=off \ max_read_burst_length=16 max_write_burst_length=16 latency=120 num_write_outstanding=8 num_read_outstanding=9 #pragma HLS INTERFACE m_axi port=uram bundle=uram depth=512 offset=off \ max_read_burst_length=16 max_write_burst_length=16 latency=8 num_write_outstanding=2 num_read_outstanding=2 #pragma HLS interface s_axilite port=hbm_offset #pragma HLS interface s_axilite port=hbm_to_uram #pragma HLS interface s_axilite port=stride #pragma HLS interface s_axilite port=uram_offset #pragma HLS INTERFACE s_axilite port=return if ((stride != 1) && (stride != 2) && (stride != 4)) return; if (uram_offset >= stride) return; if (stride == 2) { if (hbm_to_uram) { for (int i = 0; i < RAW_MODULE_SIZE * sizeof(uint16_t) / 32 / 2; i++) { #pragma HLS PIPELINE II=1 uram[2 * i + uram_offset] = d_hbm_p0[hbm_offset + i]; } } else { for (int i = 0; i < RAW_MODULE_SIZE * sizeof(uint16_t) / 32 / 2; i++) { #pragma HLS PIPELINE II=1 d_hbm_p0[hbm_offset + i] = uram[2 * i + uram_offset]; } } } else if (stride == 4) { if (hbm_to_uram) { for (int i = 0; i < RAW_MODULE_SIZE * sizeof(uint16_t) / 32 / 4; i++) { #pragma HLS PIPELINE II=1 uram[4 * i + uram_offset] = d_hbm_p0[hbm_offset + i]; } } else { for (int i = 0; i < RAW_MODULE_SIZE * sizeof(uint16_t) / 32 / 4; i++) { #pragma HLS PIPELINE II=1 d_hbm_p0[hbm_offset + i] = uram[4 * i + uram_offset]; } } } else { if (hbm_to_uram) { for (int i = 0; i < RAW_MODULE_SIZE * sizeof(uint16_t) / 32; i++) { #pragma HLS PIPELINE II=1 uram[i + uram_offset] = d_hbm_p0[hbm_offset + i]; } } else { for (int i = 0; i < RAW_MODULE_SIZE * sizeof(uint16_t) / 32; i++) { #pragma HLS PIPELINE II=1 d_hbm_p0[hbm_offset + i] = uram[i + uram_offset]; } } } }