logo资料库

Vivado HLS 视频课程总结.pdf

第1页 / 共80页
第2页 / 共80页
第3页 / 共80页
第4页 / 共80页
第5页 / 共80页
第6页 / 共80页
第7页 / 共80页
第8页 / 共80页
资料共80页,剩余部分请下载后查看
Vivado HLS 视频课程总结 (视频来源:http://xilinx.eetop.cn/category-83) Darcy 2019-1-11
目录 1 从软件工程师的角度来看 FPGA 架构 ...................................................................................................... 3 2 Vivado HLS 的工作机制 .................................................................................................................................. 5 3-4 HLS 设计流程基本概念 ............................................................................................................................... 9 5 任意精度数据类型 ......................................................................................................................................... 15 5.1 C 语言支持的数据类型 .................................................................................................................... 15 5.2 sizeof()函数使用 ............................................................................................................................... 16 5.3 设置 Visual Studio 支持任意精度数据类型 ............................................................................ 17 6 数组类型转换 ................................................................................................................................................. 17 6.1 变量的定义和初始化 ........................................................................................................................ 17 6.2 定点数据类型 ................................................................................................................................... 18 6.3 浮点数据类型的定义和初始化 ................................................................................................... 19 6.4 隐式数据类型转换 .......................................................................................................................... 19 6.5 显示数据类型转换 .......................................................................................................................... 19 7 Vivado HLS 中的复合数据类型 ................................................................................................................... 20 7.1 结构体 ................................................................................................................................................. 20 7.2 枚举类型 ............................................................................................................................................ 22 8 Vivado HLS 中的 C++基本运算 .................................................................................................................. 23 9 测试平台的基本架构 .................................................................................................................................... 25 9.1 Test Bench ........................................................................................................................................ 25 9.2 C Test Bench .................................................................................................................................... 26 10 测试激励 ........................................................................................................................................................ 28 11 测试输出检测与格式控制 ......................................................................................................................... 28 11.1 Scoreboard ...................................................................................................................................... 28 11.2 输出格式控制 .................................................................................................................................. 30 12 接口综合基本介绍 ...................................................................................................................................... 33 12.1 接口综合概述 .................................................................................................................................. 33 12.2 block-level interface protocol 和 port-level interface protocol ..................... 34 13 接口综合之数组 ........................................................................................................................................... 35 14 接口综合案例演示 ...................................................................................................................................... 37 14.1 添加寄存器 ...................................................................................................................................... 37 14.2 添加时钟使能信号 ......................................................................................................................... 38 14.3 指令优化 ........................................................................................................................................... 38 15 for 循环优化-基本性能指标 ...................................................................................................................... 40 15.1 基本衡量指标 .................................................................................................................................. 40 15.2 for 循环 pipeline ......................................................................................................................... 41 15.3 for 循环 UNROLL 展开 .................................................................................................................... 41 15.4 for 循环变量 i ................................................................................................................................ 42 16 for 循环优化-循环合并 ............................................................................................................................... 42 17 for 循环优化-数据流 ................................................................................................................................... 46 18 for 循环优化-嵌套的 for 循环优化 .......................................................................................................... 54 18.1 循环嵌套类型 .................................................................................................................................. 54 18.2 Perfect loop nest 示例 ............................................................................................................. 55
18.3 Imperfect loop nest 示例 ......................................................................................................... 56 19 for 循环优化-其他优化方法 ...................................................................................................................... 59 19.1 for 循环的并行性 .......................................................................................................................... 59 19.2 for 循环 pipeline 时的 rewind 选项 ....................................................................................... 61 19.3 for 循环的循环边界是变量时处理方法 ................................................................................... 64 20 数组优化-数组分割 .................................................................................................................................... 67 20.1 数组接口 ........................................................................................................................................... 67 20.2 数组分割 ........................................................................................................................................... 67 21 数组优化-数组映射和重组 ....................................................................................................................... 69 21.1 数组的映射 ...................................................................................................................................... 69 21.2 数组的重组 ...................................................................................................................................... 72 21.3 综合对比 ........................................................................................................................................... 72 22 数组优化-其他优化方法 ........................................................................................................................... 72 22.1 定义 ROM ............................................................................................................................................ 72 22.2 数组的初始化 .................................................................................................................................. 74 23 函数层面优化 ............................................................................................................................................... 75 23.1 代码风格 ........................................................................................................................................... 75 23.2 Inline ............................................................................................................................................... 75 23.3 Allocation ...................................................................................................................................... 75 23.3 Dataflow........................................................................................................................................... 75 24 总结分析 ........................................................................................................................................................ 77 24.1 改善吞吐率(Throughput) .................................................................................................... 77 24.2 改善时延(Latency) ................................................................................................................. 78 24.3 改善资源(Area) ....................................................................................................................... 79
1 从软件工程师的角度来看 FPGA 架构 FPGA 属于可编程的 ASIC,这里的可编程是指硬件可编程(相对应的有软件可编程) FPGA 可分为传统 FPGA,SOC(也就是嵌入 ARM 的 FPGA),由于其硬件可编程特性,所 以称之为“液体硬件”,而 CPU、DSP、GPU 属于软件可编程,CPU 适用于管理和调度(数 据的访问,文件的管理,人机交互),DSP 在管理方面有所减弱,但是在算法方面有所加 强,适合做一些递归的算法,而 GPU 则可以同时执行多个进程,所以特别适用于对大块 数据的流处理。为了加速处理,面对大的运算量,我们常见的手段有提高主频、增加处理 核的数量,但是这样带来的直接问题就是功耗的攀升,再一个局限性就是主频的提升空间 毕竟是有限的。而 FPGA 本身存在大量的乘法单元,所以在执行算法方面可以有很高的并 行度。此外 SOC 的出现即实现了把 ARM 嵌入 FPGA 中也使得 FPGA 在管理方面得到了加 强,相比 GPU 而言功耗更低,并且软件工程师们已经可以采用纯 C/C++来对 FPGA 进行 编程,相比以往采用 VHDL 或 Verilog 进行编程的方式来说更加容易上手,降低学习门槛 的同时也大大提升了编程的效率。 常规的 FPGA 架构主要包括以下三个方面:可编程逻辑单元、可编程 I/O 和布线资 源。随着工艺的发展,现如今的 FPGA 资源已经得到了极大的拓展,如下所示: 图 1-1 常规 FPGA 架构 而算法工程师主要关注三个方面:逻辑单元(Logic Unit)、存储单元(Memory Unit) 和算数逻辑单元(Arithmetic-logic Unit)。逻辑单元主要指查找表(LUT)、乘法器(MUX)、 进位链(carry chain),如下图所示:
图 1-2 逻辑单元 查找表去实现逻辑发生器的时候,本质上是基于真值表的方式实现的。而加法运算 实际上也是属于逻辑运算,因为我们可以把加法运算分解成异或、或、与这样的运算, 所以我们在运行加法运算的时候是会用到查找表的,当然我们也可以用算术逻辑单元中 的 DSP48 来实现,如下所示为 DSP48 简化得到的架构: 图 1-3 DSP48 简化架构 里面包括了预加器、乘法器还有算术逻辑单元,可以实现的功能还包括乘法、乘加、 乘累加,诸如数字滤波、快速傅立叶变换等算法方面都有会用到这些基本的运算。
存储单元可以分为 Block RAM 和分布式 RAM(即 SLICEM 中的 LUT)两大类,前者 适用于较大的数据量存储,后者适用存储小于 1kb 的小数据量。Block RAM 的工作模式 有多种选择,可以是单端口 RAM、双端口 RAM、单端口 ROM、双端口 ROM 和 FIFO。 图 X 7 系列 Blocke RAM 由 2 块 18KbRAM 组成,四种配置方式 在 HLS 中实现数组时可以选择使用 BRAM 形式还是分布式 RAM 的形式。 算法工程师需要了解每个单元的功能,具体的算法操作和这些功能的对应关系,算 法模型的资源利用率,以及对算法进行优化的方法。这里我们需要特别关注的问题就是 怎么让我们通过 HLS 生成的 HDL 代码可以很高效的运行。 2 Vivado HLS的工作机制 现如今电子系统级的设计方法发展主要经历三个阶段:计算机辅助设计(CAD)--> 计算机辅助工程(CAE)-->电子设计自动化(EDA),在电子设计自动化阶段开始使用硬 件描述语言,如常见的 VHDL 和 Verilog,在如今这个电子系统级的设计阶段我们希望采 用具有更高抽象度的方式去描述系统行为,所以在这个阶段会有两个最显著的特征:一 个是采用高级语言去描述系统行为即用 C/C++来实现系统建模——Vivado HLS,再一个
就是采用基于模型的方法—— System Generator。 图 2-1 采用 Vivado HLS 实现也就是高层次综合的方法的有以下优势: 提高硬件工程师的生产率:硬件工程师使用 VHDL 或 Verilog 这些硬件描述语言来编 程时需要关注的是时序和并行性,并行性是体现在与硬件电路的直接挂钩,如同时指定 多个输入输出端口进行赋值运算,而时序是需要人为去设计的,这对复杂的实现来讲是 比较费力的,而我们在使用 C/C++去编程实现系统建模的时候更多是关注在算法本身, 如何用 C/C++将算法高效地描述出来是我们关注的核心,把从高级语言到硬件描述语言 的转换交给 Vivado HLS 去帮我们实现。 软件工程师可以借此提高系统性能:也就是说之前可能需要 CPU/DSP/GPU 实现的 一些算法,我们都可以借助 Vivado HLS 直接通过 C/C++编程来用 FPGA 实现,一方面提 高了并行性,也就是提高了系统的吞吐率,另一方面还可以降低系统的功耗。有了高层 次综合工具之后就可以在 C/C++层面进行算法的开发,算法的验证。可以通过一些优化 指导,也就是指导综合工具如何把 C/C++描述的算法更高效地转化成相应的 HDL 代码。 在用 C/C++描述完算法之后,还需要相应的测试程序来测试算法的正确性。同时 生成的 HDL 代码在验证时也会用的 C/C++编写的测试激励。从这个角度而言,Vivado HLS 生成的 HDL 代码并不是要求我们看懂的,因为生成的 HDL 代码命名本身并没有什 么可读性,所以我们需要做的就是在 C/C++层面把算法做更多的优化,以及对综合工具 采用相应的指导(directives)。 Vividao HLS 在将 C/C++代码转换成 HDL 代码时所经历的阶段如图 2-2 所示:
图 2-2 调度(Scheduling):实现控制逻辑的提取,确定每个时钟周期应该执行的操作,计 算操作所需要的时钟周期和可以并行执行的操作,会生成相应的状态机, 绑定(Binding):实现资源的映射即将每个操作映射到所需要的资源上去。 举例说明:以下代码实现了简单的等式 y=x*a+b+c: 图 2-3
分享到:
收藏