Vivado HLS会自动决定函数内部操作的流水级数,但用户也可以通过其他方法控制流水程度。
方法1:在RESOURCE中修改Latency
RESOURCE是HLS中的一种Directive,用于指定操作需要用什么资源实现,例如,可以将数组映射为RAM_1P_BRAM,即单端口RAM,且该RAM采用Block RAM实现;类似的还有RAM_2P_LUTRAM、RAM_2P_URAM等。再例如,可以将加法操作映射为AddSub_DSP,这样加法就会用DSP48实现。在RESOURCE的界面中,有一个选项Latency,如下图所示。一旦设定Latency的具体数值,Vivado HLS会遵循该值以确定流水程度。
方法2:直接使用pragma HLS Latency
Vivado HLS提供了一个pragma HLSLatency,可作用于函数、循环或区域(由花括弧界定)。可设定Latency的最小值或最大值或者两者同时设定,该值对应时钟周期数。当作用于函数时,该值决定了计算所有输出所需要的时钟周期个数;当作用于循环时,循环完成所有迭代所需要的时钟周期个数(不是单次循环所需要的时钟周期个数)。如下图所示,可定义期望Latency的最小值(min)和最大值(max)。Vivado HLS总是尽可能地将设计的Latency降到最低。如果实际的Latency正好大于min而小于max,那么综合结果就满足了这个约束的要求;如果实际的Latency比min还要小,那么Vivado HLS会增加Latency以满足约束规定的min的要求;如果实际的Latency比max还要大,那么Vivado HLS会尝试达到max,但如果未能满足max的要求,则会发出警告。
方法3:通过config_core在全局设置
可以在Solution Settings添加命令config_core来设定core的Latency,如下图所示。这里的core可以是DSP48或Block RAM。当作用于Block RAM时,要求对应的数组使用了RESOURCE以明确指定Block RAM的配置方式。换言之,该命令不支持VivadoHLS自动推断的Block RAM(未使用RESOURCE)。