Что не так со следующим кодом в vivado hls?

Следующий код должен считывать значение из DDR, уменьшать его, записывать результат обратно по тому же адресу и считывать следующее значение, повторяя 256 раз.

Вместо этого при первом запуске он уменьшает первые 2 значения (axi_ddr[0] и [1]), а при последующих запусках уменьшает только первое значение (axi_ddr[0]).

#include "ap_cint.h"
#include <stdio.h>
#include "string.h"

void hls_test(volatile int256 axi_ddr[256], uint32 *axi_lite_status_control){
    #pragma HLS INTERFACE s_axilite port=axi_lite_status_control register bundle=BUS_A
    #pragma HLS INTERFACE s_axilite port=return bundle=BUS_A
    #pragma HLS INTERFACE m_axi depth=256 port=axi_ddr bundle=DDR

    int256 axi_ddr_reg;
    int256 diff = 1;
    uint9 i = 0;

    if (*axi_lite_status_control == 1){
            for(i = 0; i < 256; i++){
                axi_ddr_reg = axi_ddr[i];
                axi_ddr[i] = axi_ddr_reg -diff;
            }
            *axi_lite_status_control = 2;
        }
}

И симуляция, и косимуляция проходят, как предполагалось, и не могут понять, что вызывает проблему.

Также пробовал С++, но это закончилось тем же поведением. Единственный раз было иначе, когда я забыл указать начальное значение переменной diff, и тогда значение во всех 256 ячейках DDR стало 0x0.

Может ли кто-нибудь указать, что мне не хватает?


person user3761419    schedule 03.01.2021    source источник


Ответы (1)


Код выглядит хорошо для меня, и он должен работать плавно. Однако, если вы говорите, что и симуляция, и косимуляция проходят успешно, то что-то может быть не так либо с вашим тестовым кодом, либо с вашей аппаратной реализацией. Кроме того, для версии кода C++ вы должны использовать типы ap_uint<N>, определенные в ap_int.h, вместо ap_cint.h.

person Stefano Ribes    schedule 09.03.2021