静态变量用于在循环迭代间保留数据,这通常在导致最终实现时生成寄存器。如果在以流水打拍方式执行的函数中遇到此变量,Vitis HLS 可能无法对设计进行充分最优化,这可能导致启动时间间隔超过所需的时间。
以下是此状况的典型示例:
function_foo()
{
static bool change = 0
if (condition_xyz){
change = x; // store
}
y = change; // load
}
如果 Vitis HLS 无法最优化此代码,则存储操作需要 1 个周期,加载操作也需要 1 个周期。如果此函数包含在流水线中,那么流水线必须以最小启动时间间隔 2 来实现,因为静态变更变量会创建循环附带的依赖关系。
您可通过重写代码来避免此问题,如下例所示。它可确保在循环的每次迭代中仅存在读操作或写操作,这样即可以 II=1 来调度设计。
function_readstream()
{
static bool change = 0
bool change_temp = 0;
if (condition_xyz)
{
change = x; // store
change_temp = x;
}
else
{
change_temp = change; // load
}
y = change_temp;
}