Vivado Hls 设计优化

本文详细探讨了使用Vivado HLS优化矩阵乘法设计的过程,包括pipeline loop和function、调整数组形状、应用FIFO接口等策略。通过逐步分析和优化,实现了在每个时钟周期处理一个样本的目标,同时揭示了优化中遇到的限制和解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在使用高层次综合,创造高质量的RTL设计时,一个重要部分就是对C代码进行优化。Vivado Hls总是试图最小化loop和function的latency,为了实现这一点,它在loop和function上并行执行尽可能多的操作。比如说,在function级别上,高级综合总是试图并行执行function。
除了这些自动优化,directive是用来:
(1) 并行执行多个tasks,例如,同一个function的多次执行或同一loop的多次迭代。这是流水线结构。
(2) 调整数组的物理实现((block RAM),函数,循环和端口,以提高数据的可用性,并帮助数据流更快地通过设计。
(3) 提供关于数据dependency的信息,或者缺乏数据dependency,允许执行更多的优化。最终的优化是修改C源代码,以消除在代码中意外的dependency,但是这可能会限制硬件的性能。
本文使用的sample设计是一个matrix multiplier函数。目标是在每一个时钟周期处理一个新的sample,并实现数据流接口。

优化matrix multiplier

solution1

这里使用矩阵乘法器设计,来显示如何可以完全优化基于loop的设计。设计目标是在每个时钟周期读取一个使用FIFO接口的sample,同时最大限度地减少了面积。此分析包括一个比较在loop级优化和在function级优化的方法。
对比loops和function pipeline的使用,创建一个可以处理采样时钟的设计。分析设计不符合性能要求的两个最常见的原因:loops dependency和数据流的限制(或瓶颈)。

Step 1:创建并打开Project
找到Design_Optimization lab1文件夹,依次在Command Prompt 窗口输入vivado_hls –f run_hls.tcl和vivado_hls –p matrixmul_prj

Step 2:综合分析设计
综合后的结果:
这里写图片描述
(1)图中,总的interval为80个时钟周期。因为每个输入数组中都有九个元素,所以设计每输入读取需要约九个周期。
(2)interval比latency多一个时钟周期,所以没有在硬件上并行执行。
(3)interval/latency是由于嵌套loops
I.Product inner loop:
-有一个2个时钟周期的延迟。
-总的迭代有6个时钟周期。
II.COL loop:
-它需要1个时钟输入和1个时钟退出。
-它需要8个时钟周期为每个迭代(1 + 6 + 1)。
-总的有24个周期完成所有迭代。
III.顶层loops每次迭代需要26个时钟周期,总的loops迭代共78时钟周期。

为了改善initiation interval,则需要:pipeline loops或pipeline整个function,并比较这两种结果。当pipelining loops时,loops的initiation interval是监控的重要度量指标。即使设计达到loop可以在每个时钟周期处理一个sample,函数的initiation interval仍然需要包含函数内的loops来完成所有数据的处理。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值