HLS - интерфейсы параметров массива отличаются при использовании цикла - PullRequest
2 голосов
/ 06 апреля 2020

У меня есть следующая функция с директивой set_directive_interface -mode axis -register -register_mode both "FIR" Result в Vivado HLS:

void Func(int A[2], int B[2], int* Result)
{
    int Temp = 0x00;

    Loop: for(int i = 0x00; i < 0x02; i++)
    {
        Temp += A[i] * B[i];
    }

    *Result = Temp;
}

Эта функция выдаст следующий отчет:

enter image description here

Я получил два интерфейса памяти с адресом, CE и входом данных. Все как и ожидалось.

Теперь я использую следующую функцию:

void Func(int A[2], int B[2], int* Result)
{
    int Temp = 0x00;

    Temp = A[1] * B[1] + A[0] * B[0];

    *Result = Temp;
}

Это даст следующий вывод:

enter image description here

Так почему вторая функция создает интерфейс с двумя портами RAM?

1 Ответ

2 голосов
/ 08 апреля 2020

На самом деле вы делаете l oop раскатывание вручную. Это равно

void Func(int A[2], int B[2], int* Result)
{
    int Temp = 0x00;

    Loop: for(int i = 0x00; i < 0x02; i++)
    {
#pragma HLS UNROLL
        Temp += A[i] * B[i];
    }

    *Result = Temp;
}

Когда вы делаете это, вы получаете доступ ко всем 4 элементам ваших массивов одновременно, поэтому Vivado HLS применяет разбиение к вашим массивам и преобразует их в несколько меньших массивов, каждый из которых реализован со своим собственный интерфейс. Это включает в себя возможность разбивать каждый элемент массива на его собственный скалярный элемент. В интерфейсе функции это дает уникальный порт для каждого элемента в массиве. Это обеспечивает максимальный параллельный доступ. Это позволяет одновременно считывать несколько элементов и улучшает интервал инициализации. Обратитесь к разделу xilinx UG902 «Интерфейсы массива» для получения дополнительной информации.

...