66 lines
2.4 KiB
C++
66 lines
2.4 KiB
C++
// 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];
|
|
}
|
|
}
|
|
}
|
|
}
|