|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
FPGA ------- Vivado HLS 程序优化(基础实例)(高级综合) % ?1 e' G: r# o( o
$ D, g z3 q& l+ y& o
前言(本文基于赛灵思官方HLS文档UG871中的7.1节):
5 i" c6 Q, _/ c( n/ u( t/ G
' I; Q7 W0 |* I 在使用高层次综合,创造高质量的RTL设计时,一个重要部分就是对C代码进行优化。1 x" d j O+ O9 R5 C* f
. ]/ E( h/ [! D% K9 E; G! G
Vivado HLS拥有自动优化的功能,试图最小化loop和function的latency,为了实现这一点,软件会在loop和function上并行执行尽可能多的操作(比如说,在function级别上,高级综合总是试图并行执行function)。4 e. i# m% L/ d
' o; n3 |) L6 {# x; M/ h
除了这些自动优化,我们可以手动进行程序优化,即用在不同的solution中添加不同的directive的方法,进行优化和性能对比。其中,对同一个工程,可以建立多个不同的solution(解决方案),为不同的solution添加directive可以达到如下目的:
4 z7 t9 y' y! C0 Y3 d
5 X- m* y) r$ Q6 z' c- v" v: P1、并行执行多个tasks,例如,同一个function的多次执行或同一loop的多次迭代。这是流水线结构。1 Q+ a& K$ v' k) c
$ ^& B1 {. D# A5 {
2、调整数组的物理实现((block RAM),函数,循环和端口(I/O),以提高数据的可用性,并帮助数据流更快地通过设计。
3 m6 G5 \; D( |; [4 h
: s$ {$ Y4 G. g0 i/ s" h5 b8 C2 j1 E3、提供关于数据dependency的信息,或者缺乏数据dependency,允许执行更多的优化。最终的优化是修改C源代码,以消除在代码中意外的dependency,但是这可能会限制硬件的性能。8 o0 D- d1 t8 h9 w* b
/ S/ m5 `( i2 L* B 本文使用的例子是设计一个矩阵相乘函数。目标是在每一个时钟周期处理一个新的sample,并实现数据流接口。
9 n) n6 z7 a* k+ h
0 J/ r; Q) F. B' [8 G/ v. D一、优化matrix multiplier。
9 Z' b. C t2 Q, O! P, E5 `
1 t8 s3 Y* l! ^2 e4 O; b1、solution1(无优化)
0 x. D1 u* t0 ?; S
5 G' Q- H& ^1 [. a8 i (1)矩阵乘法器设计,来显示如何优化基于loop的设计。设计目标是在每个时钟周期读取一个使用FIFO接口的sample, 同时最大限度地减少面积。此分析包括在loop级优化和在function级优化的方法。
S9 k2 R3 j+ V# ?) }
: m/ U8 x8 I6 g( x' D' a6 {7 h9 K: M' q7 v }, ?. z p# }
& c& {* |4 a* | |
|