for 循环并行操作
当不满足合并的时候,采用allocation,内部加上pipeline
2个单独的for
这时可以将循环包装成函数,然后用不同的数据做参数进行调用,在上述函数化的代码的基础上,对 loop_sequential 函数用 ALLOCATION指令优化, 里面的参数 instances 就是指定操作哪个函数,limit=2 意思就是把 instances指定的函数复制两份,**这样就实现了函数的并行执行。
pipeline rewind
对于一个循环,多次调用时:在没有选择 rewind 时,在执行完一次 for 循环后有一个时钟周期的空挡然后才执行下一次循环。
使用 rewind 之后,两次 for 循环之间是没有空挡的,这样就降低了整个函数的 latency。
N=4
对于上述结果可以看出,在默认情况下,共循环 4 次,每次两个周期,共 8 个周期,再加一个进入循环消耗周期,共 9 个周期。
pipeline 之后,四次循环重叠了 3 个周期,所以减少到 6 个周期。
选中 rewind 选项后,减少了进入循环的时间,并且和前面的一次循环重叠了一个周期,所以又减少了两个时钟周期,一共 4 个周期。
多个循环,不能rewind
对于文首2个单独的for 循环示例代码 的两个循环来说,对其中的循环 pipeline 选中 rewind 的话会出现警告,因为函数包含了多个循环,所以不能执行 rewind。
自动添加pipeline
可以在 solution settings 中添加 config_compile 来达到自动添加 pipeline 的目的,其中的 pipeline_loops 选项的数字是一个阈值,当某个循环的循环次数小于这个数字的时候就会被自动添加 pipeline。
Q:是添加在哪一层?
for循环的循环边界是变量时处理方法
当循环边界是变量
时会引发一些问题。首先 Vivado HLS 无法确定 loop latency 是多少,进而就无法确定函数的 latency,此时相应的 latency 会用问号作为标记。
对于这种情况有 3 种处理方式:
- 用Tripcount指令
- 将循环边界的数据类型声明为ap_int(也可以使用ap_uint,但是当循环变量是i—的时候会出问题,当减到负数后仍然会被识别为正数)
- 在C代码中可以使用assert宏
Tripcount
Tripcount 指令会指定循环边界的最值,这样就把循环边界确定在一个范围内了,在综合报告中各项参数就会以相应的范围来表示而不会出现问号了。Tripcount 指令只会影响到综合报告的显示而不会影响到综合的 RTL 代码的结果。
循环边界声明为 ap_int
(3)使用 assert 宏
== 从三种方法的结果比较中可以发现,采用 assert 方式时 latency 是最小的,同时相应的资源消耗也是最少的。 ==
来源:CSDN
作者:rrr2
链接:https://blog.csdn.net/qq_35608277/article/details/104650513