合并循环 - 2023.2 简体中文

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

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 简体中文

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

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

图 1. 循环指令

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

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

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

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

合并循环允许将循环内的逻辑组合在一起进行最优化。循环合并变换存在一些限制,并非总能成功。但仍可以同构重构代码来手动合并循环。在上面的示例中,使用双端口块 RAM 可以并行执行加减运算。