HLS - 使用循环时数组参数接口不同
HLS - Array parameter interfaces are different when using a loop
我在 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 端口的接口?
实际上你是在手动展开循环。等于
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 部分阵列接口。
我在 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 端口的接口?
实际上你是在手动展开循环。等于
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 部分阵列接口。