已展开的嵌套循环之间的移动需要额外的时钟周期,这与前述章节中所述的连续循环间移动方式相似。从外层循环移至内层循环需要一个时钟周期,从内层循环移至外层循环同样如此。
在此处所示小型示例中,这暗示执行 Outer
循环需 200 个额外时钟周期。
void foo_top { a, b, c, d} {
...
Outer: while(j<100)
Inner: while(i<6) // 1 cycle to enter inner
...
LOOP_BODY
...
} // 1 cycle to exit inner
}
...
}
Vitis HLS 提供的 set_directive_loop_flatten
命令允许将已标记为完美和半完美的嵌套循环平铺,这样就无需通过重新编码来最优化硬件性能,并且还可减少执行循环中的运算所需的周期数。
- 完美循环嵌套
- 仅限最内层的循环才有循环主体内容,逻辑语句之间未指定任何逻辑,所有循环边界均为常量。
- 半完美循环嵌套
- 仅限最内层的循环才有循环主体内容,逻辑语句之间未指定任何逻辑,所有循环边界均为常量。
对于非完美循环嵌套,即内层循环具有变量边界或者循环主体未完全包含在内层循环内,设计人员应尝试重构代码或者将循环主体中的循环展开以创建完美循环嵌套。
将该指令应用于一组嵌套循环时,应将其应用于包含循环主体的最内层循环。
set_directive_loop_flatten top/Inner
循环平铺还可使用 IDE 中的“Vivado HLS Directive Editor”选项卡执行,可将其单独应用于各循环,或者通过在函数级别应用该指令来将其应用于函数中的所有循环。