Intel®高层次综合编译器专业版: 最佳实践指南

ID 683152
日期 12/04/2023
Public
文档目录

5.1. 在循环中调用硬件以重复使用

循环是重复使用硬件的有用方法。如果您的组件函数调用另一函数,则被调用的函数将作为顶层组件。多次调用某函数会导致硬件重复。

例如,以下代码实例会导致组件myComponent中的函数foo有多个硬件副本,因为函数foo为内联函数:
int foo(int a)
{
    return 4 + sqrt(a) /
}

component
void myComponent()
{
  ...
  int x =
  x += foo(0);
  x += foo(1);
  x += foo(2);
  ...
}
如果将函数foo至于循环中,则用于foo的硬件在每次函数调用时被重复使用。函数仍为内联,但仅内联一次。
component
void myComponent()
{
  ...
  int x = 0;
#pragma unroll 1
  for (int i = 0; i < 3; i++)
  {
    x += foo(i);
  }
  ...
}
如果您需要向可重复使用函数传递与循环归纳变量i无关的其它值,则还可使用switch/case块:
component
void myComponent()
{
  ...
  int x = 0;
#pragma unroll 1
  for (int i = 0; i < 3; i++)
  {
     int val = 0;
     switch(i)
     {
     case 0:
         val = 3;
         break;
     case 1:
         val = 6;
         break;
     case 2:
         val = 1;
         break;
     }
     x += foo(val);
  }
  ...
}

可参阅 <quartus_installdir>/hls/examples/tutorials/best_practices/resource_sharing_filter中的资源共享教程了解有关重复使用硬件以及最小化内联的更多信息。