【问题标题】:HLS - Array parameter interfaces are different when using a loopHLS - 使用循环时数组参数接口不同
【发布时间】:2020-04-06 10:47:06
【问题描述】:

我在 Vivado HLS 中使用指令 set_directive_interface -mode axis -register -register_mode both "FIR" Result 具有以下功能:

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;
}

此函数将生成以下报告:

我有两个带有地址、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;
}

这将产生以下输出:

那么为什么第二个函数会产生一个带有两个 RAM 端口的接口呢?

【问题讨论】:

    标签: c++ c vivado-hls


    【解决方案1】:

    实际上,您正在手动进行循环展开。等于

    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 阵列接口部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-24
      • 1970-01-01
      • 1970-01-01
      • 2015-08-30
      • 2021-10-26
      • 1970-01-01
      • 2014-12-05
      • 1970-01-01
      相关资源
      最近更新 更多