合并顺序循环以减少时延 - 2022.1 Chinese

Vitis 高层次综合用户指南 (UG1399)

Document ID
UG1399
Release Date
2022-06-07
Version
2022.1 简体中文

所有收起的循环都在设计 FSM 中指明并创建至少一种状态。当存在多个顺序循环时,它可能会创建其它不必要的时钟周期,并阻止进一步的最优化。

下图显示了一个简单的示例,其中看似直观的编码样式对 RTL 设计的性能产生了负面影响。

图 1. 循环指令

在上图中,(A) 显示了默认情况下设计中的每个收起的循环如何在 FSM 中创建至少一种状态。在这些状态之间移动需耗费多个时钟周期:假设每个循环迭代需要 1 个时钟周期,则执行两个循环总共需要 11 个周期:

  • 需要 1 个时钟周期进入 ADD 循环。
  • 需要 4 个时钟周期执行加法循环。
  • 需要 1 个时钟周期退出 ADD 并进入 SUB。
  • 需要 4 个时钟周期执行 SUB 循环。
  • 需要 1 个时钟周期退出 SUB 循环。
  • 总共 11 个时钟周期。

在这个简单的示例中,很明显,ADD 循环中的 else 分支也可以解决该问题,但是在更复杂的示例中,它可能不那么明显,更直观的编码样式可能具有更大的优势。

LOOP_MERGE 最优化指令用于自动合并循环。LOOP_MERGE 指令将尝试合并应用范围内的所有循环。在上面的示例中,合并循环将创建类似于上图 (B) 所示的控制结构,完成它只需要 6 个时钟周期。

合并循环允许将循环内的逻辑组合在一起进行最优化。在上面的示例中,使用双端口块 RAM 可以并行执行加减运算。

当前在 Vitis HLS 中合并循环具有以下限制:

  • 如果循环边界都是变量,则它们必须具有相同的值。
  • 如果循环边界为常量,那么最大常量值用作为合并循环的边界。
  • 具有变量边界和常量边界的循环无法合并。
  • 要合并的循环之间的代码不得产生不同结果:多次执行此代码应生成相同的结果(允许使用 a = b,不允许使用 a = a + 1)。
  • 包含 FIFO 访问的循环无法合并:合并将更改 FIFO 上的读写顺序:这些循环必须始终按顺序进行。