描述
通过创建循环主体的多个副本来变换循环。
循环感应变量用于指定循环执行的迭代次数。循环主体内的逻辑(例如,对任意循环出口变量进行中断或修改)也会影响迭代次数。代表循环主体的逻辑块会在 RTL 中实现此循环。该逻辑会执行相同次数的迭代。
syn.directive.unroll 命令允许将此循环部分或全部展开。完全展开循环会在 RTL 中创建循环主体副本,副本数量与其中的循环迭代次数相同。按因子 N 部分展开循环会创建 N 份循环主体副本并对循环迭代进行相应调整。
如果用于部分展开的因数 N 并非原始循环迭代计数的整数倍,那么在循环主体的每个展开片段后请检查原始退出条件。
要完全展开循环,在编译时循环边界必须已知。对于部分展开则无需满足此条件。
语法
syn.directive.unroll=[OPTIONS] <location>
-
<location>表示要展开的循环位置(格式为format function[/label])。
选项
-
factor=<integer> - 指定非零整数,表示已请求部分展开。
循环主体会重复整数次。迭代信息会进行相应的调整。
-
skip_exit_check - 仅当指定因数时才有效(部分展开)。
- 固定边界
如果迭代计数为因数的倍数,则不执行出口条件检查。
如果迭代计数并非因数的整数倍,则该工具将执行以下操作:
- 阻止展开。
- 发出警告,称必须执行出口检查后才能继续。
- 变量边界
移除出口条件检查。您必须确保:
- 变量边界为因数的整数倍。
- 无需出口检查。
- 固定边界
-
off=true - 为指定循环禁用展开。
示例
展开 foo 函数内的 L1 循环。将编译指示置于 L1 循环的主体内。
syn.directive.unroll=foo/L1
在 foo 函数的 L2 循环上指定展开因数 4。移除出口检查。将编译指示置于 L2 循环的主体内。
syn.directive.unroll=skip_exit_check factor=4 foo/L2