└── Xilinx ├── README.md ├── UG871 ├── CH01.md ├── CH02.md ├── CH03.md ├── CH04.md ├── CH05.md ├── CH06.md ├── CH07.md ├── CH08.md ├── CH09.md ├── CH10.md ├── CH11.md ├── clock-analysis.md └── images │ ├── 6-21.png │ ├── 6-22.png │ ├── 6-23.png │ ├── 6-24.png │ ├── 6-27.png │ ├── 6-30.png │ ├── 6-31.png │ ├── 7-10.png │ ├── 7-11.png │ ├── 7-13.png │ ├── 7-15.png │ ├── 7-16.png │ ├── 7-19.png │ ├── 7-20.png │ ├── 7-4.png │ ├── 7-6.png │ ├── 7-7.png │ ├── 7-8.png │ ├── c2-l123.png │ ├── c4-l1-1.png │ ├── c4-l1-2.png │ ├── c4-l1-3.png │ ├── c4-l2-1.png │ ├── c4-l2-2.png │ ├── c4-l2-3.png │ ├── c4-l3-1.png │ ├── c4-l3-10.png │ ├── c4-l3-11.png │ ├── c4-l3-2.png │ ├── c4-l3-3.png │ ├── c4-l3-4.png │ ├── c4-l3-5.png │ ├── c4-l3-6.png │ ├── c4-l3-7.png │ ├── c4-l3-8.png │ ├── c4-l3-9.png │ ├── c4-l4-1.png │ ├── c4-l4-2.png │ ├── c4-l4-3.png │ ├── c4-l4-4.png │ ├── c4-l4-5.png │ ├── c5-l1-1.png │ ├── c5-l1-2.png │ ├── c5-l2-1.png │ ├── c5-l2-2.png │ ├── c6-l1-1.png │ ├── c6-l1-10.png │ ├── c6-l1-11.png │ ├── c6-l1-12.png │ ├── c6-l1-13.png │ ├── c6-l1-14.png │ ├── c6-l1-15.png │ ├── c6-l1-16.png │ ├── c6-l1-17.png │ ├── c6-l1-18.png │ ├── c6-l1-19.png │ ├── c6-l1-2.png │ ├── c6-l1-3.png │ ├── c6-l1-4.png │ ├── c6-l1-5.png │ ├── c6-l1-6.png │ ├── c6-l1-7.png │ ├── c6-l1-8.png │ ├── c6-l1-9.png │ ├── c6-s6-0.png │ ├── c6-s6-1.png │ ├── c6-s6-2.png │ ├── c6-s6-3.png │ ├── c6-s7-0.png │ ├── c6-s7-1.png │ ├── c6-s7-2.png │ ├── c6-s7-3.png │ ├── c6-s7-4.png │ ├── c6-s7-5.png │ ├── c6-s7-6.png │ ├── c6-s7-7.png │ ├── c6-s8-1.png │ ├── c6-s8-2.png │ ├── c6-s9-1.png │ ├── c6-s9-2.png │ ├── c6-s9-3.png │ ├── c7-l2-1.png │ ├── c7-l2-2.png │ ├── c7-l2-3.png │ ├── c7-s2-1.png │ ├── c7-s3-1.png │ ├── c7-s3-2.png │ ├── c7-s3-3.png │ ├── c7-s4-1.png │ ├── c7-s4-2.png │ ├── c7-s4-3.png │ ├── c7-s5-1.png │ ├── c7-s5-2.png │ ├── c7-s5-3.png │ ├── c7-s5-4.png │ ├── c7-s5-5.png │ ├── c7-s6-1.png │ ├── c7-s7-1.png │ ├── c7-s7-2.png │ ├── c7-s7-3.png │ ├── c7-s7-4.png │ ├── c7-s7-5.png │ ├── l3-1.png │ ├── l3-s2-1.png │ ├── l3-s2-2.png │ ├── l3-s2-3.png │ ├── l3-s2-4.png │ ├── l3-s3-1.png │ ├── l3-s3-2.png │ ├── l3-s3-3.png │ ├── solution4.svg │ └── u871-C6-S9.svg ├── UG902 ├── Chapter-1-High-Level-Synthesis │ ├── CH1-High-Level-Synthesis.md │ ├── CH1.1-High-Level-Synthesis-Benefits.md │ ├── CH1.2-High-Level-Synthesis-Basics.md │ ├── CH1.3-Understanding-Vivado-HLS.md │ ├── CH1.5-Data-Types-for-Efficient-Hardware.md │ ├── CH1.6-Managing-Interfaces.md │ ├── CH1.7-Optimizing-the-Design.md │ ├── CH1.8-Verifying-the-RTL.md │ └── CH1.9-Exporting-the-RTL-Design.md ├── Chapter-2-High-Level-Synthesis-C-Libraries │ ├── CH2-High-Level-Synthesis-C-Libraries.md │ ├── CH2.1-Arbitrary-Precision-Data-Types-Library.md │ ├── CH2.2-HLS-Stream-Library.md │ ├── CH2.3-HLS-Math-Library.md │ ├── CH2.4-HLS-Video-Library.md │ ├── CH2.5-HLS-IP-Libraries.md │ ├── CH2.6-HLS-Linear-Algebra-Library.md │ ├── CH2.7-HLS-DSP-Library.md │ └── CH2.8-HLS-SQL-Library.md ├── Chapter-3-High-Level-Synthesis-Coding-Styles │ ├── CH3-High-Level-Synthesis-Coding-Styles.md │ ├── CH3.1-Unsupported-C-Constructs.md │ ├── CH3.10-C++-Classes-and-Templates.md │ ├── CH3.11-Assertions.md │ ├── CH3.12-SystemC-Synthesis.md │ ├── CH3.2-C-Test-Bench.md │ ├── CH3.3-Functions.md │ ├── CH3.4-RTL-Blackbox.md │ ├── CH3.5-Loops.md │ ├── CH3.6-Arrays.md │ ├── CH3.7-Data-Types.md │ ├── CH3.8-C-Builtin-Functions.md │ └── CH3.9-Hardware-Efficient-C-Code.md ├── FAQ.md └── images │ ├── 1.png │ ├── 2-3-1.png │ ├── 2-3-2.png │ ├── 2-6-1.png │ ├── 2.png │ ├── 3.png │ ├── 39.png │ ├── 4.png │ ├── 40.png │ ├── 41.png │ ├── 42.png │ ├── 43.png │ ├── 44.png │ ├── 45.png │ ├── 46.png │ ├── 47.png │ ├── 48.png │ ├── 49.png │ ├── 5.png │ ├── 50.png │ ├── 51.png │ ├── 52.png │ ├── 53.png │ ├── 54.png │ ├── 55.png │ ├── 56.png │ ├── 57.png │ ├── 58.png │ ├── 59.png │ ├── 60.png │ ├── 61.png │ ├── 62.png │ ├── 63.png │ ├── 64.png │ ├── 65.png │ ├── 66.png │ ├── 67.png │ ├── 68.png │ ├── 69.png │ ├── 70.png │ ├── 71.png │ ├── 72.png │ ├── 73.png │ ├── 74.png │ ├── 75.png │ ├── 76.png │ ├── 77.png │ ├── 78.png │ ├── 80.png │ ├── 81.png │ ├── 82.png │ ├── 83.png │ ├── 84.png │ ├── 86.png │ ├── 87.png │ ├── 88.png │ ├── 89.png │ ├── 90.png │ ├── 91.png │ ├── 92.png │ ├── 93.png │ ├── t10.png │ ├── t11.png │ ├── t12.png │ ├── t14.png │ ├── t15.png │ ├── t16.png │ ├── t17.png │ ├── t18.png │ ├── t19.png │ ├── t20.png │ ├── t21.png │ ├── t22.png │ ├── t23.png │ ├── t24.png │ ├── t25.png │ ├── t26.png │ ├── t34.png │ ├── t40.png │ ├── t41.png │ ├── t42.png │ ├── t43.png │ ├── t44.png │ ├── t45.png │ ├── t7.png │ ├── t8.png │ └── t9.png └── UG998 ├── CH1.md ├── CH2.md ├── CH3.md ├── CH4.md ├── CH5.md ├── CH6.md ├── CH7.md ├── CH8.md ├── CH9.md └── images ├── 1-1.png ├── 1-2.png ├── 2-1.png ├── 2-10.png ├── 2-2.png ├── 2-3.png ├── 2-4.png ├── 2-5.png ├── 2-6.png ├── 2-7.png ├── 2-8.png ├── 2-9.png ├── 3-1.png ├── 3-2.png ├── 3-3.png ├── 3-4.png ├── 3-5.png ├── 3-6.png ├── 4-1.png ├── 4-10.png ├── 4-11.png ├── 4-12.png ├── 4-2.png ├── 4-3.png ├── 4-4.png ├── 4-5.png ├── 4-6.png ├── 4-7.png ├── 4-8.png ├── 4-9.png ├── 5-2.png ├── 5-3.png ├── 5-4.png ├── 5-5.png ├── 5-6.png ├── 5-7.png ├── 5-8.png ├── 5-9.png ├── 6-1.png ├── 6-2.png ├── 6-3.png ├── 6-4.png ├── 6-6.png ├── 6-7.png ├── 6-8.png ├── 6-9.png ├── 7-1.png ├── 7-2.png ├── 7-3.png ├── 7-4.png ├── 7-5.png ├── 7-6.png ├── 8-1.png ├── 8-10.png ├── 8-11.png ├── 8-12.png ├── 8-13.png ├── 8-14.png ├── 8-15.png ├── 8-2.png ├── 8-3.png ├── 8-4.png ├── 8-5.png ├── 8-6.png ├── 8-7.png ├── 8-8.png ├── 8-9.png ├── 9-1.png ├── t3-1.png ├── t3-2.png ├── t3-3.png ├── t4-1.png ├── t4-2.png ├── t6-1.png └── t7-1.png /Xilinx/README.md: -------------------------------------------------------------------------------- 1 | # Overview 2 | 3 | 这里是个人在学习Xilinx HLS相关技术的一个笔记,包括主要文档的翻译,实验教程的详细分析,相关大学课程的学习资料等等。 4 | 5 | - UG902: Vivado Design Suite User Guide: High-Level Synthesis 6 | - UG998: Introduction to FPGA Design with Vivado High-Level Synthesis 7 | - UG871: Vivado Design Suite Tutorial High-Level Synthesis -------------------------------------------------------------------------------- /Xilinx/UG871/CH01.md: -------------------------------------------------------------------------------- 1 | # Ch1 Tutorial Description 2 | ## Overview 3 | 该Vivado®教程是一些较小的教程的集合,它们解释和演示了使用高级综合将C,C++和SystemC代码转换为RTL实现的过程中的所有步骤。本教程介绍了如何创建初始RTL实现,然后在不更改C代码的情况下**使用优化指令将其转换为低面积和高吞吐量的实现**。以下各节描述了每个教程的摘要。 4 | ### High-Level Synthesis Introduction 5 | 本教程介绍了Vivado高级综合(HLS)。您可以使用图形用户界面(GUI)和Tcl环境学习执行高级综合的主要任务。 6 | ### C Validation 7 | 本教程回顾了良好的C测试平台的各个方面,并演示了Vivado高级综合C调试环境的基本操作。本教程还显示了如何调试任意精度的数据类型。 8 | ### Interface Synthesis 9 | 该接口综合教程回顾了为RTL设计创建端口的所有方面。您可以学习如何控制块级I/O端口协议和端口I/O协议,如何将C函数中的数组实现为多个端口和接口协议类型(RAM,FIFO,AXI4-Stream),以及如何实现了AXI4总线接口。 10 | 11 | 为了创建最佳的设计实现,本教程以一个设计示例结束,在该示例中,I/O访问和逻辑都得到了优化。 12 | ### Arbitrary Precision Types 13 | 本教程中的实验练习将用本机C类型编写的C设计与用Vivado高级综合任意精度类型编写的相同设计进行了对比,显示了后者如何在不牺牲准确性的情况下提高了硬件结果的质量。 14 | ### Design Analysis 15 | 本教程使用DCT函数来解释Vivado高级综合中交互式设计分析功能的功能。初始设计将带您经历多个分析和优化阶段,这些阶段突出了分析透视图的所有功能,并为设计优化方法提供了基础。 16 | ### Design Optimization 17 | 本教程使用矩阵乘法器示例,回顾了两种设计的优化技术。设计优化实验解释了如何对设计进行流水线化,并对循环流水线化与函数流水化的方法进行了对比。 18 | 19 | 本教程向您展示如何利用从分析中学到的见解来更新初始C代码并创建更优化的设计实现。 20 | ### RTL Verification 21 | 本教程说明如何使用RTL协同仿真功能自动验证通过综合创建的RTL。本教程演示了C测试平台的重要性,并向您展示了如何使用RTL验证的输出在Vivado和Mentor Graphics ModelSim仿真器中查看波形图。 22 | ### Using HLS IP in IP Integrator 23 | 本教程说明了如何将由高级综合创建的RTL设计打包为IP,添加到Vivado IP目录中以及如何在Vivado Design Suite中使用。 24 | ### Using HLS IP in a Zynq SoC Design 25 | 除了在Zynq®-7000SoC设计中使用HLS IP模块之外,本教程还介绍了如何将由高级综合创建的C驱动程序文件合并到Zynq处理系统(PS)的软件中。 26 | ### Using HLS IP in System Generator for DSP 27 | 本教程说明如何将由高级综合创建的RTL设计打包为IP并在System Generator for DSP中使用。 28 | 29 | ## Software Requirements 30 | 本教程要求安装Vivado Design Suite 2017.1发行版或更高版本。 31 | 32 | ## Hardware Requirements 33 | Xilinx建议使用Vivado工具时至少要有2 GB的RAM。 34 | 35 | ## Locating the Tutorial Design Files 36 | 教程设计文件以压缩文件的形式位于Xilinx网站上。接受许可协议后,将自动下载[zip文件](https://www.xilinx.com/cgi-bin/docs/ctdoc?cid=026f56e2-0a0f-4986-aeb7-e92917398939;d=ug871-design-files.zip)。 37 | 38 | ## Preparing the Tutorial Design Files 39 | 将zip文件内容提取到任何可写访问的位置。 40 | 41 | 本教程假定您已将解压缩的设计文件放置在C:\Vivado_HLS_Tutorial位置。 42 | 43 | > 重要说明:如果将Vivado_HLS_Tutorial目录解压缩到其他位置,或者如果它位于Linux上,则将路径名调整为放置Vivado_HLS_Tutorial目录的位置。 44 | 45 | -------------------------------------------------------------------------------- /Xilinx/UG871/CH08.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/CH08.md -------------------------------------------------------------------------------- /Xilinx/UG871/CH09.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/CH09.md -------------------------------------------------------------------------------- /Xilinx/UG871/CH10.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/CH10.md -------------------------------------------------------------------------------- /Xilinx/UG871/CH11.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/CH11.md -------------------------------------------------------------------------------- /Xilinx/UG871/clock-analysis.md: -------------------------------------------------------------------------------- 1 | 2 | ```mermaid 3 | 4 | graph LR 5 | subgraph L1-dct 6 | L1-1[ap_start: 124] 7 | L1-Enter-L2-1(C1: Enter dct->Read_data) 8 | L1-1-->L1-Enter-L2-1 9 | 10 | subgraph Inst: L2-1-Read_data 11 | L2-1-1[ap_start: 132] 12 | L2-1-C1[528] 13 | L2-1-C1-1[C66] 14 | L2-1-1-->L1-Enter-L2-1 15 | L2-1-1-->L2-1-C1 16 | L2-1-2[ap_done: 660] 17 | L2-1-2-->L2-1-C1-->L2-1-C1-1 18 | L2-1-2-->L2-1-C2 19 | L2-1-3[ap_idle: 668] 20 | L2-1-C2[8] 21 | L2-1-C2-1[C1: Exit Read_data->dct] 22 | L2-1-3-->L2-1-C2-->L2-1-C2-1 23 | L2-1-3-->L1-Enter-L2-2 24 | end 25 | 26 | 27 | L1-Enter-L2-2[C1: Enter dct->dct_2d] 28 | 29 | subgraph Inst: L2-2-dct_2d 30 | L2-2-1[ap_start: 676] 31 | L2-2-1-->L1-Enter-L2-2 32 | L2-2-Enter-L3-1(C1: Enter dct_2d->Row_DCT_Loop) 33 | L2-2-1-->L2-2-Enter-L3-1 34 | subgraph Inst: L3-1-Row_DCT_Loop 35 | L3-1-1[before_dct_1d_loop1_ap_start: 684] 36 | L3-1-1-->L2-2-Enter-L3-1 37 | L3-1-Enter-L4-1-Loop1-1(C1: Enter Row_DCT_Loop->loop1/dct_1d) 38 | L3-1-1-->L3-1-Enter-L4-1-Loop1-1 39 | subgraph Inst: L4-1-Loop1-dct_1d 40 | L4-1-Loop1-1[loop1/ap_start: 692] 41 | L4-1-Loop1-C1[88]-->L4-1-Loop1-C1-1[C11] 42 | L4-1-Loop1-1-->L3-1-Enter-L4-1-Loop1-1 43 | L4-1-Loop1-1-->L4-1-Loop1-C1 44 | L4-1-Loop1-2[loop1/ap_done: 780] 45 | L4-1-Loop1-2-->L4-1-Loop1-C1 46 | L4-1-Loop1-2-->L4-1-Loop1-C2 47 | L4-1-Loop1-3[loop1/ap_idle: 788] 48 | L4-1-Loop1-C2[8]-->L4-1-Loop1-C2-1[C1: Exit loop1/dct_1d->Row_DCT_Loop] 49 | L4-1-Loop1-3-->L4-1-Loop1-C2 50 | L4-1-Loop1-3-->L3-1-Enter-L4-1-Loop2-1 51 | end 52 | 53 | L3-1-Enter-L4-1-Loop2-1(C1: Enter Row_DCT_Loop->loop2/dct_1d) 54 | 55 | subgraph Inst: L4-1-Loop2-dct_1d 56 | L4-1-Loop2-1[loop2/ap_start: 796] 57 | L4-1-Loop2-C1[88]-->L4-1-Loop2-C1-1[C11] 58 | L4-1-Loop2-1-->L3-1-Enter-L4-1-Loop2-1 59 | L4-1-Loop2-1-->L4-1-Loop2-C1 60 | L4-1-Loop2-2[loop2/ap_done: 884] 61 | L4-1-Loop2-2-->L4-1-Loop2-C1 62 | L4-1-Loop2-2-->L4-1-Loop2-C2 63 | L4-1-Loop2-3[loop2/ap_idle: 892] 64 | L4-1-Loop2-C2[8]-->L4-1-Loop2-C2-1[C1: Exit loop2/dct_1d->Row_DCT_Loop] 65 | L4-1-Loop2-3-->L4-1-Loop2-C2 66 | L4-1-Loop2-3-->L3-1-Enter-L4-1-Loop3-1 67 | end 68 | 69 | end 70 | L2-2-2[ap_done: 3412] 71 | L2-2-3[ap_idle: 3420] 72 | end 73 | 74 | L1-2[ap_done: 3940] 75 | end 76 | 77 | ``` -------------------------------------------------------------------------------- /Xilinx/UG871/images/6-21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/6-21.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/6-22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/6-22.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/6-23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/6-23.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/6-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/6-24.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/6-27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/6-27.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/6-30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/6-30.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/6-31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/6-31.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/7-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/7-10.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/7-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/7-11.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/7-13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/7-13.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/7-15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/7-15.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/7-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/7-16.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/7-19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/7-19.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/7-20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/7-20.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/7-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/7-4.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/7-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/7-6.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/7-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/7-7.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/7-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/7-8.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c2-l123.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c2-l123.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c4-l1-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c4-l1-1.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c4-l1-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c4-l1-2.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c4-l1-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c4-l1-3.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c4-l2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c4-l2-1.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c4-l2-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c4-l2-2.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c4-l2-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c4-l2-3.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c4-l3-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c4-l3-1.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c4-l3-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c4-l3-10.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c4-l3-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c4-l3-11.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c4-l3-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c4-l3-2.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c4-l3-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c4-l3-3.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c4-l3-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c4-l3-4.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c4-l3-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c4-l3-5.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c4-l3-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c4-l3-6.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c4-l3-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c4-l3-7.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c4-l3-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c4-l3-8.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c4-l3-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c4-l3-9.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c4-l4-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c4-l4-1.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c4-l4-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c4-l4-2.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c4-l4-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c4-l4-3.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c4-l4-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c4-l4-4.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c4-l4-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c4-l4-5.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c5-l1-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c5-l1-1.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c5-l1-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c5-l1-2.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c5-l2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c5-l2-1.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c5-l2-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c5-l2-2.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c6-l1-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c6-l1-1.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c6-l1-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c6-l1-10.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c6-l1-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c6-l1-11.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c6-l1-12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c6-l1-12.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c6-l1-13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c6-l1-13.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c6-l1-14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c6-l1-14.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c6-l1-15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c6-l1-15.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c6-l1-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c6-l1-16.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c6-l1-17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c6-l1-17.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c6-l1-18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c6-l1-18.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c6-l1-19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c6-l1-19.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c6-l1-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c6-l1-2.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c6-l1-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c6-l1-3.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c6-l1-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c6-l1-4.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c6-l1-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c6-l1-5.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c6-l1-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c6-l1-6.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c6-l1-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c6-l1-7.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c6-l1-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c6-l1-8.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c6-l1-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c6-l1-9.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c6-s6-0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c6-s6-0.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c6-s6-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c6-s6-1.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c6-s6-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c6-s6-2.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c6-s6-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c6-s6-3.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c6-s7-0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c6-s7-0.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c6-s7-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c6-s7-1.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c6-s7-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c6-s7-2.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c6-s7-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c6-s7-3.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c6-s7-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c6-s7-4.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c6-s7-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c6-s7-5.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c6-s7-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c6-s7-6.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c6-s7-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c6-s7-7.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c6-s8-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c6-s8-1.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c6-s8-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c6-s8-2.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c6-s9-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c6-s9-1.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c6-s9-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c6-s9-2.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c6-s9-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c6-s9-3.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c7-l2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c7-l2-1.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c7-l2-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c7-l2-2.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c7-l2-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c7-l2-3.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c7-s2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c7-s2-1.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c7-s3-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c7-s3-1.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c7-s3-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c7-s3-2.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c7-s3-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c7-s3-3.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c7-s4-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c7-s4-1.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c7-s4-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c7-s4-2.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c7-s4-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c7-s4-3.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c7-s5-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c7-s5-1.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c7-s5-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c7-s5-2.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c7-s5-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c7-s5-3.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c7-s5-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c7-s5-4.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c7-s5-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c7-s5-5.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c7-s6-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c7-s6-1.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c7-s7-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c7-s7-1.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c7-s7-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c7-s7-2.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c7-s7-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c7-s7-3.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c7-s7-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c7-s7-4.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/c7-s7-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/c7-s7-5.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/l3-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/l3-1.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/l3-s2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/l3-s2-1.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/l3-s2-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/l3-s2-2.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/l3-s2-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/l3-s2-3.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/l3-s2-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/l3-s2-4.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/l3-s3-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/l3-s3-1.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/l3-s3-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/l3-s3-2.png -------------------------------------------------------------------------------- /Xilinx/UG871/images/l3-s3-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG871/images/l3-s3-3.png -------------------------------------------------------------------------------- /Xilinx/UG902/Chapter-1-High-Level-Synthesis/CH1-High-Level-Synthesis.md: -------------------------------------------------------------------------------- 1 | # Chapter 1 High-Level Synthesis 2 | Xilinx® Vivado® 高级综合(HLS)工具将C规范转换为寄存器传输级(RTL)实施方案,您可以将其综合为Xilinx现场可编程门阵列(FPGA)。您可以用C,C ++或SystemC编写C规范,而FPGA提供了大规模并行架构,具有性能,成本和传统处理器功耗的优势。本章概述了高级综合。 3 | 4 | 注:有关FPGA架构和Vivado HLS基本概念的更多信息,请参见 _Introducti on to FPGA Design Using High-Level Synthesis_ (UG998)。 5 | 6 | -------------------------------------------------------------------------------- /Xilinx/UG902/Chapter-1-High-Level-Synthesis/CH1.1-High-Level-Synthesis-Benefits.md: -------------------------------------------------------------------------------- 1 | ## 1.1 High-Level Synthesis Benefits 2 | 高级综合桥接硬件和软件,具有以下主要优点: 3 | - 提高了硬件设计师的生产力 4 | 5 | 硬件设计人员可以在创建高性能硬件的同时,在更高的抽象层次上工作。 6 | 7 | - 为软件设计师改善系统性能 8 | 9 | 软件开发人员可以在新的目标FPGA上加速算法的计算密集型部分。 10 | 11 | 使用高级综合设计方法,您可以: 12 | - 在C代码级开发算法 13 | 14 | 在消耗开发时间的实现细节中抽象出来的级别上工作 15 | 16 | - 在C级别上进行验证 17 | 18 | 与使用传统的语言硬件描述相比,更快地验证设计的功能正确性。 19 | - 通过优化伪指令控制C综合过程 20 | 21 | 创建特定的高性能硬件实现。 22 | - 使用优化指令从C源代码创建多个实现 23 | 24 | 探索设计空间,这增加了找到最佳实现的可能性。 25 | 26 | - 创建可读且可移植的C源代码 27 | 28 | 将C源重新定位到不同的设备中,并将C源合并到新项目中。 29 | 30 | -------------------------------------------------------------------------------- /Xilinx/UG902/Chapter-1-High-Level-Synthesis/CH1.2-High-Level-Synthesis-Basics.md: -------------------------------------------------------------------------------- 1 | # 1.2 High-Level Synthesis Basics 2 | **高级综合包括以下阶段**: 3 | - Scheduling 4 | 5 | 根据以下信息确定在每个时钟周期内发生哪些操作: 6 | - 时钟周期或时钟频率的长度 7 | - 根据目标设备的定义,完成操作所需的时间 8 | - 用户指定的优化指令 9 | 10 | 如果时钟周期更长或以更快的FPGA为目标,则更多的操作将在一个时钟周期内完成,所有操作可能会在一个时钟周期内完成。相反,如果时钟周期较短或以较慢的FPGA为目标,则高级综合自动在更多时钟周期内调度操作,并且某些操作可能需要实现为多周期资源。 11 | - Binding 12 | 13 | 确定哪个硬件资源实现哪个计划的操作。为了实现最佳解决方案,高级综合使用有关目标设备的信息。 14 | - Control logic extraction 15 | 16 | 提取控制逻辑以创建有限状态机(FSM),以在RTL设计中对操作进行排序。 17 | 18 | **高级综合按如下方式合成C代码**: 19 | - 关于参数的**Top-level function**综合到**RTL I/O Port**中 20 | - 将**C函数**综合为RTL层次结构中的**Block** 21 | 22 | 如果C代码包括sub-functions的层次结构,则最终的RTL设计将包括与原始C函数在层次结构上一一对应的modules或entities的层次结构。函数的所有实例都使用相同的RTL实现或Block。 23 | - 默认情况下,C函数中的循环保持rolled状态 24 | 25 | 当循环是rolled时,综合会为循环的一个迭代创建逻辑,并且RTL设计会按顺序为循环的每个迭代执行此逻辑。使用优化指令,您可以unroll循环,从而允许所有迭代并行发生。循环也可以通过有**限状态机的细粒度实现(loop pipelining)或更粗略的基于握手的实现(dataflow)** 来流水线化。 26 | 27 | - 在最终的FPGA设计中,C代码中的数组将综合成为Block RAM或UltraRAM 28 | 29 | 如果该数组位于顶层函数接口中,则高级综合会将数组实现为设计之外访问Block RAM的端口。 30 | 31 | 高层综合基于默认行为,约束和您指定的任何优化指令来创建优化的实现。您可以使用优化指令来修改和控制内部逻辑和I/O端口的默认行为。这使您可以从相同的C代码生成硬件实现的变体。 32 | 33 | :star:要确定设计是否满足您的要求,您可以在由高级综合生成的综合报告中查看性能指标。在分析报告之后,您可以使用优化指令来确定实施方案。综合报告包含有关以下性能指标的信息: 34 | - 区域(Area):根据FPGA中可用的资源,包括查找表(LUT)、寄存器、Block RAMs和DSP48s,来实现设计所需的硬件资源数量。 35 | - 延迟(Lateny):**函数**计算**得到所有输出**值所需的时钟周期数。 36 | - 启动间隔(Initiation interval)(II):**函数**可以**接受新输入数据之前**的时钟周期数。 37 | - 循环迭代延迟(Loop iteration latency):完成**一个循环迭代**所需的时钟周期数。 38 | - 循环启动间隔(Loop initiation interval):**下一个循环迭代开始处理数据之前**的时钟周期数。 39 | - 循环延迟(Loop latency):执行**循环所有迭代**的时钟周期数。 40 | 41 | ### Scheduling and Binding Example 42 | 下面的图显示了此代码示例的调度和绑定阶段的示例: 43 | ```c 44 | int foo(char x, char a, char b, char c) { 45 | char y; 46 | y = x*a+b+c; 47 | return y; 48 | } 49 | ``` 50 | 51 | ![](../images/1.png) 52 | 53 | 在此示例的调度阶段,在每个时钟周期期间,高级综合调度以下操作: 54 | - 第一个时钟周期:乘法和第一次加法 55 | - 第二个时钟周期:第二次加法和输出生成 56 | 57 | 在最终的硬件实现中,高级综合将顶层函数的**参数**作为**输入和输出(I/O)端口**实现。在此示例中,参数是简单数据端口。因为每个输入变量都是char类型,所以输入数据端口均为8位宽。函数的返回值是32位int数据类型,所以输出数据端口是32位宽。 58 | 59 | ___ 60 | :star:重要!在硬件中实现C代码的优势在于,所有操作都可以在较短的时钟周期内完成。在该示例中,操作仅在两个时钟周期内完成。在中央处理器(CPU)中,即使这个简单的代码示例也需要花费更多的时钟周期才能完成。 61 | ___ 62 | 63 | 在此示例的初始绑定阶段,高级综合使用组合乘法器(Mul)来实现乘法器操作,并使用组合加法器/减法器(AddSub)来实现这两个加法操作。 64 | 65 | 在目标绑定阶段,高级综合使用DSP48资源同时实现乘法器和其中一个加法操作。DSP48资源是FPGA架构中可用的计算模块,可在高性能和高效实现之间实现理想的平衡。 66 | ### Extracting Control Logic and Implementing I/O Ports Example 67 | 下图显示了此代码示例的控制逻辑的提取和I/O端口的实现: 68 | ```c 69 | void foo(int in[3], char a, char b, char c, int out[3]) { 70 | int x,y; 71 | for(int i = 0; i < 3; i++) { 72 | x = in[i]; 73 | y = a*x + b + c; 74 | out[i] = y; 75 | } 76 | } 77 | ``` 78 | 79 | 此代码示例执行与上一个示例相同的操作。但是,它在for循环内执行操作,并且函数中的两个参数是数组。当调度代码时,设计结果将执行三次for循环内的逻辑。高级综合自动从C代码中提取控制逻辑,并在RTL设计中创建FSM以对这些操作进行排序。高层综合在最终RTL设计中将顶层函数参数实现为端口。char类型的标量变量映射到标准的8位数据总线端口。数组参数(例如in和out)包含整个收集的数据。 80 | 81 | 在高级综合中,默认情况下将数组综合到Block RAM中,但也可以进行其他优化,例如FIFO,分布式RAM和单个寄存器。在顶层函数中使用数组作为参数时,高级综合假设Block RAM在顶层函数之外,并且自动创建端口以访问函数设计之外的Block RAM,例如数据端口,地址端口,以及任何所需的芯片使能或写使能信号。 82 | 83 | FSM控制寄存器何时存储数据与控制任何I/O控制信号的状态。FSM在状态C0中启动。在下一个时钟,它进入状态C1,然后进入状态C2,然后进入状态C3。在返回状态C0之前,它总共返回到状态C1(以及C2,C3)三次。 84 | 85 | :star: 注意:这非常类似于C代码for循环中的控制结构。状态的完整序列为:C0,{C1,C2,C3},{C1,C2,C3},{C1,C2,C3},然后返回到C0。 86 | 87 | 设计只需要一次b和c的加法。高级综合将操作移到for循环之外并进入状态C0。每次设计进入状态C3,就重复使用加法的结果。 88 | 89 | 设计从in读取数据并将数据存储在x中。FSM在状态C1中生成第一个元素的地址。此外,在状态C1中,加法器递增,以跟踪设计必须在状态C1,C2和C3周围迭代的次数。在状态C2中,block RAM返回in的数据并将其存储为变量x。 90 | 91 | 高级综合从端口a读取具有其他值的数据以执行计算并生成第一个y输出。FSM确保生成正确的地址和控制信号以将该值存储在块外。然后,设计返回到状态C1,以从数组/Block RAM中读取下一个值。该过程继续进行,直到所有输出都被写完为止。然后设计返回到状态C0以读取b和c的下一个值,以再次开始该过程。 92 | 93 | ![](../images/2.png) 94 | ### Performance Metrics Example 95 | 96 | 下图显示了上一个示例中代码的完整逐周期执行,包括每个时钟周期的状态,读取操作,计算操作和写入操作。 97 | 98 | ![](../images/3.png) 99 | 以下是此示例的性能指标: 100 | - 延迟:需要9个时钟周期的函数才能输出所有值。 101 | 102 | 注意:当输出是数组时,延迟将测量到最后一个数组值输出。 103 | - II:II为10,这意味着该函数需要10个时钟周期才能启动一组新的输入读取并开始处理下一组输入数据。 104 | 105 | 注意:执行一个功能的一个完整执行的时间称为一个事务。在此示例中,函数需要11个时钟周期才能接收下一个事务的数据。 106 | - 循环迭代的延迟:每个循环迭代的延迟为3个时钟周期。 107 | - 循环II:间隔为3。 108 | - 循环延迟:延迟为9个时钟周期。 -------------------------------------------------------------------------------- /Xilinx/UG902/Chapter-1-High-Level-Synthesis/CH1.3-Understanding-Vivado-HLS.md: -------------------------------------------------------------------------------- 1 | ## 1.3 Understanding Vivado HLS 2 | Xilinx Vivado HLS工具将C函数综合成IP块中,您可以将其集成到硬件系统中。它与Xilinx的其余设计工具完全集成,并提供了全面的语言支持和功能,可为您的C算法创建最佳实现。 3 | 4 | 以下是Vivado HLS设计流程: 5 | 1. 编译,执行(仿真)和调试C算法。 6 | 2. 使用用户优化指令将C算法综合到RTL实现中。 7 | 3. 生成综合报告并分析设计。 8 | 4. 使用pushbutton流程对RTL实施进行验证。 9 | 5. 将RTL实现打包为选择的IP格式。 10 | 11 | :star: 注意:在高级综合中,运行已编译的C程序称为C Simulation。执行C算法可对函数进行仿真,以验证算法是否正确。 12 | 13 | ### Inputs and Outputs 14 | 以下是Vivado® HLS输入: 15 | - 使用C,C ++或SystemC编写的C函数。 16 | 17 | 这是Vivado HLS的主要输入。该函数可以包含子函数的层次结构。 18 | 19 | - 约束条件 20 | 21 | 约束条件是必需的,包括时钟周期,时钟不确定性和FPGA目标。如果未指定,则时钟不确定度默认为时钟周期的12.5%。 22 | 23 | - 指令 24 | 25 | 指令是最佳的,可以指导综合过程以实现特定的行为或最佳化。 26 | 27 | - C测试台和任何关联的文件 28 | 29 | Vivado HLS在综合之前使用C测试台来模拟C函数,并使用C/RTL Cosimulation来验证RTL输出。 30 | 31 | 您可以使用Vivado HLS图形用户界面(GUI)或在命令提示符下使用Tcl命令,将C输入文件,方向和约束,交互地添加到Vivado HLS项目中。您也可以创建Tcl文件并以批处理模式执行命令。 32 | 33 | 以下是Vivado HLS的输出: 34 | - 以**硬件描述语言(HDL)格式的RTL实现文件**(注意是Verilog或VHDL,不是门级电路之类的) 35 | 36 | 这是Vivado HLS的主要输出。使用Vivado综合,您可以将RTL综合为门级实现和FPGA位流文件。RTL具有以下行业标准格式: 37 | - VHDL(IEEE 1076-2000) 38 | - Verilog(IEEE 1364-2001) 39 | 40 | Vivado HLS将实现文件打包为IP块,以与Xilinx®设计文件中的其他工具一起使用。使用逻辑综合,您可以将打包的IP综合到FPGA比特流中。 41 | 42 | - 报告文件 43 | 44 | 此输出是综合,C/RTL协同仿真和IP打包的结果。 45 | 46 | 下图概述了Vivado HLS输入和输出文件。 47 | 48 | ![](../images/4.png) 49 | 50 | ### Test Bench, Language Support, and C Libraries 51 | 在任何C程序中,顶层函数都称为main()。在Vivado® HLS设计流程中,您可以将main()下的任何子函数指定为用于综合的顶层函数。您不能把main()作为顶层函数。以下是其他规则: 52 | - 仅允许一个函数用作综合的顶层函数。 53 | - 层次结构中用于综合的顶层函数下的所有子功能也被综合。 54 | - 如果要综合不在顶层函数下的层次结构中的函数,则必须将函数合并到单个顶层函数中以进行综合。 55 | 56 | #### Test Bench 57 | 使用Vivado® HLS设计流程时,综合一个功能不正确的C函数,然后分析实现细节以确定函数为何无法按预期执行,这是很麻烦的。为了提高生产率,在综合之前,请使用Test bench来验证C函数是否正确。 58 | 59 | C测试平台包括main()函数以及不在待综合顶层函数层次结构下的任何子函数。这些函数通过为综合函数提供刺激并消耗其输出,来验证用于综合的顶层函数是否正确。 60 | 61 | Vivado HLS使用测试平台来编译和执行C仿真。在编译过程中,您可以选择“启动调试器”选项以打开完整的C调试环境,从而可以分析C仿真。 62 | 63 | :star: 推荐:由于Vivado HLS使用测试平台在综合之前验证C函数并自动验证RTL输出,因此强烈建议使用测试平台。 64 | 65 | #### Language Support 66 | Vivado HLS支持以下C编译/仿真标准: 67 | - ANSI-C(GCC 4.6) 68 | - C ++(G ++ 4.6) 69 | - SystemC(IEEE 1666-2006,版本2.2) 70 | 71 | ##### C, C++, and SystemC Language Constructs 72 | Vivado HLS支持许多C,C ++和System C语言构件以及每种语言的所有自然数据类型,包括浮点和双精度类型。但是,综合不支持某些构件,包括: 73 | - Dynamic memory allocation 74 | 75 | FPGA具有一组固定的资源,并且不支持动态创建和释放内存资源。 76 | - Operating system(OS) operations 77 | 78 | 必须将所有往返于FPGA的数据从输入端口读取,或者将其写入输出端口。OS操作,例如文件读/写或OS查询(如日期和日期)不支持。相反,C Test bench可以执行这些操作,并将数据作为参数传递到待综合函数中。 79 | 80 | 有关受支持和不受支持的C构造的详细信息以及每个主要构造的示例,请参见第3章:High-Level Synthesis Coding Styles。 81 | 82 | #### C Libraries 83 | C库包含为在FPGA中实现而进行了优化的函数和构造。使用这些库有助于确保高质量的结果(QoR),也就是说,最终的输出是一种优化资源使用率的高性能设计。因为这些库是用C,C ++或SystemC提供的,所以您可以将这些库合并到C函数中并对其进行仿真,以在合成之前验证函数的正确性。 84 | 85 | Vivado® HLS提供以下C库来扩展标准C语言: 86 | - 任意精度的数据类型 87 | - 半精度(16位)浮点数据类型 88 | - 数学运算 89 | - Xilinx® IP函数,包括快速傅里叶变换(FFT)和有限冲激响应(FIR) 90 | - FPGA资源功能有助于最大程度地利用移位寄存器LUT(SRL)资源 91 | 92 | ##### C Library Example 93 | C库确保了比标准C类型更高的QoR。标准C类型基于8位边界(8位,16位,32位,64位)。但是,当针对硬件平台时,使用特定宽度的数据类型通常更为有效。 94 | 95 | 例如,具有用于通信协议的过滤功能的设计需要10位输入数据和18位输出数据才能满足数据传输要求。使用标准C数据类型,输入数据必须至少为16位,而输出数据必须至少为32位。在最终的硬件中,这会在输入和输出之间创建一个超出必要范围的数据路径,使用更多的资源,并且具有更长的延迟(例如,一个32位乘32位乘法需要的时间比18位乘以18位乘法更长的时间),并且需要更多的时钟周期才能完成。 96 | 97 | 取而代之的是,在此设计中使用任意精度的数据类型,您可以在综合之前指定要在C代码中指定的确切位大小,模拟更新的C代码,并在使用C仿真之前验证输出的质量。为C和C++提供的任意精度的数据类型,允许您对1到1024位任何宽度的数据类型进行建模。例如,您可以对某些高达32768位的C++类型进行建模。 98 | 99 | :star:注意:任意精度类型仅在函数内是必需的,因为Vivado HLS优化了内部逻辑,并删除了不扇出至输出端口的数据位和逻辑。 100 | ### Synthesis, Optimization, and Analysis 101 | Vivado® HLS是基于项目的。每个项目都包含一组C代码,并且可以包含多个解决方案。每个解决方案可以具有不同的约束条件和优化指令。您可以在Vivado HLS GUI中分析和比较每个解决方案的结果。 102 | 103 | 以下是Vivado HLS设计过程中的综合,优化和分析步骤: 104 | 1. 创建一个具有初始解决方案的项目。 105 | 2. 验证C仿真是否正确执行。 106 | 3. 运行综合以获得一组结果。 107 | 4. 分析结果。 108 | 109 | 在分析结果之后,您可以为具有不同约束条件和优化指令的项目创建新的解决方案,并综合新的解决方案。您可以重复此过程,直到设计具有所需的性能特征为止。使用多种解决方案可让您继续开发,同时保留以前的结果。 110 | #### Optimization 111 | 使用Vivado® HLS,您可以对设计应用不同的优化指令,包括: 112 | - 指示任务流水线执行,从而允许任务的下一个执行在当前执行完成之前开始。 113 | - 为函数,循环和某个作用域的执行完成指定等待时间。 114 | - 指定使用的资源数量限制。 115 | - 覆盖代码中固有或隐含的依赖性,并允许指定的操作。例如,如果可以放弃或忽略初始数据值(例如在视频流中),则允许在写入之前先读取存储器,以提高性能。 116 | - 选择I/O协议以确保最终设计可以连接到具有相同I/O协议的其他硬件模块。 117 | 118 | :star: 注意:Vivado HLS**自动确定任何子函数使用的I/O协议**。您不能控制这些端口,除非指定端口是否已注册。 119 | 120 | 您可以使用Vivado HLS GUI将优化指令直接放置到源代码中。另外,您也可以使用Tcl命令应用优化指令。 121 | 122 | #### Analysis 123 | 综合完成后,Vivado® HLS会自动创建综合报告,以帮助您了解实施的性能。在Vivado HLS GUI中,“分析范围”包括“性能”选项卡,通过该选项卡,您可以详细地交互分析结果。下图显示了提取控制逻辑和实现I/O端口示例的“性能”视图。 124 | 125 | ![](../images/5.png) 126 | 127 | “性能”选项卡针对每种状态显示以下内容: 128 | - C0:第一状态包括端口a,b和c上的读取操作以及加法操作。 129 | - C1和C2:设计进入循环并检查循环增量计数器并退出状态。然后,设计将数据读入变量x,这需要两个时钟周期。 130 | 因为设计正在访问Block RAM,所以需要两个时钟周期,访问地址一个时钟周期,读取数据需要下一个时钟周期。 131 | - C3:设计执行计算并将输出写入端口y。然后,循环返回到开始。 132 | ### RTL Verification 133 | 如果在项目中添加了C Test bench,则可以使用它来验证RTL是否与原始C的功能相同。C Test bench将验证顶层函数综合后的输出,如果RTL的功能完全相同,则main()返回0。Vivado® HLS使用此返回值进行C仿真和C/RTL协同仿真,以确定结果是否正确。如果C Test bench返回非零值,则Vivado HLS报告模拟失败。有关更多信息,请参见Test Bench Requirements。 134 | 135 | :bulb: 提示:Vivado HLS自动创建用于执行C/RTL协同仿真的基础结构,并使用以下受支持的RTL仿真器之一自动执行仿真: 136 | - Vivado Simulator (XSim) 137 | - ModelSim simulator 138 | - VCS 139 | - NCSim 140 | - Riviera 141 | - Xcelium 142 | 143 | 如果您选择Verilog或VHDL HDL进行模拟,则Vivado HLS使用您指定的HDL模拟器。Xilinx®设计工具包括Vivado Simulator。第三方HDL模拟器需要第三方供应商的许可证。仅Linux操作系统支持VCS和NCSim仿真器。 144 | 145 | ### RTL Export 146 | 使用Vivado® HLS,您可以导出Xilinx® IP格式的RTL并将最终的RTL输出文件打包为IP。 147 | - Vivado IP Catalog 148 | 149 | 导入到Vivado IP Catalog中,以在Vivado Design Suite中使用。 150 | - System Generator for DSP 151 | 152 | 将HLS设计导入System Generator。 153 | - Synthesized Checkpoint (.dcp) 154 | 155 | 以与导入任何Vivado Design Suite checkpoint相同的方式直接导入Vivado Design Suite。 156 | 157 | :star:注意:综合后的checkpoint格式调用逻辑综合,并将RTL实现编译为门级实现,该实现包含在IP包中。 158 | 159 | 对于除综合checkpoint以外的所有IP格式,您都可以在Vivado HLS中优化执行逻辑综合,以评估RTL综合或实现的结果。通过该优化步骤,您可以在移交IP软件包之前确认Vivado HLS提供的估计时间和区域。这些门级结果未包含在打包的IP中。 160 | 161 | :star: 注意:Vivado HLS会基于每个FPGA的内置库来估算时间和区域资源。当您使用逻辑综合将RTL编译为门级实现,在FPGA中对门进行物理布局并在门之间进行路由时,逻辑综合可能添加附加优化,这些会更改Vivado HLS估算值。 162 | 163 | -------------------------------------------------------------------------------- /Xilinx/UG902/Chapter-1-High-Level-Synthesis/CH1.5-Data-Types-for-Efficient-Hardware.md: -------------------------------------------------------------------------------- 1 | ## 1.5 Data Types for Efficient Hardware 2 | 基于C的原始数据类型都位于8位边界(8、16、32、64位)上。RTL总线(对应于硬件)支持任意数据长度。使用标准C数据类型可能会导致硬件效率低下。例如,FPGA中的基本乘法单元是DSP48宏。这提供了一个18*18位的乘法器。如果需要17位乘法,则不应强迫您使用32位C数据类型来实现此功能:本来只需要一个,现在需要三个DSP48宏来实现乘法器。 3 | 4 | 任意精度数据类型的优点是,它们允许C代码更新为使用位宽较小的变量,然后重新执行C仿真以验证功能是否相同或可接受。较小的位宽会导致硬件操作数变得更小,更快。反过来,这允许在FPGA中放置更多逻辑,并允许该逻辑以更高的时钟频率执行。 5 | 6 | ### Advantages of Hardware Efficient Data Types 7 | 以下代码执行一些基本的算术运算: 8 | ```c 9 | #include "types.h" 10 | void apint_arith(dinA_t inA, dinB_t inB, dinC_t inC, dinD_t inD, 11 | dout1_t *out1, dout2_t *out2, dout3_t *out3, dout4_t *out4 12 | ) { 13 | // Basic arithmetic operations 14 | *out1 = inA * inB; 15 | *out2 = inB + inA; 16 | *out3 = inC / inA; 17 | *out4 = inD % inA; 18 | } 19 | ``` 20 | 21 | 数据类型`dinA_t`,`dinB_t`等在头文件`types.h`中定义。强烈建议使用诸如`types.h`之类用于项目范围内的头文件,因为这样可以轻松地将标准C类型转换为任意精度类型,并有助于将任意精度类型重新定义为最佳大小。 22 | 23 | 如果以上示例中的数据类型定义为: 24 | ```c 25 | typedef char dinA_t; 26 | typedef short dinB_t; 27 | typedef int dinC_t; 28 | typedef long long dinD_t; 29 | typedef int dout1_t; 30 | typedef unsigned int dout2_t; 31 | typedef int32_t dout3_t; 32 | typedef int64_t dout4_t; 33 | ``` 34 | 35 | 该设计在综合之后给出了以下结果: 36 | ``` 37 | + Timing (ns): 38 | * Summary: 39 | +---------+-------+----------+------------+ 40 | | Clock | Target| Estimated| Uncertainty| 41 | +---------+-------+----------+------------+ 42 | |default | 4.00| 3.85| 0.50| 43 | +---------+-------+----------+------------+ 44 | + Latency (clock cycles): 45 | * Summary: 46 | +-----+-----+-----+-----+---------+ 47 | | Latency | Interval | Pipeline| 48 | | min | max | min | max | Type | 49 | +-----+-----+-----+-----+---------+ 50 | | 66| 66| 67| 67| none | 51 | +-----+-----+-----+-----+---------+ 52 | * Summary: 53 | +-----------------+---------+-------+--------+--------+ 54 | | Name | BRAM_18K| DSP48E| FF | LUT | 55 | +-----------------+---------+-------+--------+--------+ 56 | |Expression | -| -| 0| 17| 57 | |FIFO | -| -| -| -| 58 | |Instance | -| 1| 17920| 17152| 59 | |Memory | -| -| -| -| 60 | |Multiplexer | -| -| -| -| 61 | |Register | -| -| 7| -| 62 | +-----------------+---------+-------+--------+--------+ 63 | |Total | 0| 1| 17927| 17169| 64 | +-----------------+---------+-------+--------+--------+ 65 | |Available | 650| 600| 202800| 101400| 66 | +-----------------+---------+-------+--------+--------+ 67 | |Utilization (%) | 0| ~0 | 8| 16| 68 | +-----------------+---------+-------+--------+--------+ 69 | ``` 70 | 如果不需要使用标准C类型来实现数据的宽度,而是以小于,但仍然大于下一个最小标准C类型(例如以下)的宽度来实现,如下: 71 | ```c 72 | typedef int6 dinA_t; 73 | typedef int12 dinB_t; 74 | typedef int22 dinC_t; 75 | typedef int33 dinD_t; 76 | typedef int18 dout1_t; 77 | typedef uint13 dout2_t; 78 | typedef int22 dout3_t; 79 | typedef int6 dout4_t; 80 | ``` 81 | 82 | 综合后的结果表明,最大时钟频率,等待时间得到了改善,面积减少了75%。 83 | ``` 84 | + Timing (ns): 85 | * Summary: 86 | +---------+-------+----------+------------+ 87 | | Clock | Target| Estimated| Uncertainty| 88 | +---------+-------+----------+------------+ 89 | |default | 4.00| 3.49| 0.50| 90 | +---------+-------+----------+------------+ 91 | + Latency (clock cycles): 92 | * Summary: 93 | +-----+-----+-----+-----+---------+ 94 | | Latency | Interval | Pipeline| 95 | | min | max | min | max | Type | 96 | +-----+-----+-----+-----+---------+ 97 | | 35| 35| 36| 36| none | 98 | +-----+-----+-----+-----+---------+ 99 | * Summary: 100 | +-----------------+---------+-------+--------+--------+ 101 | | Name | BRAM_18K| DSP48E| FF | LUT | 102 | +-----------------+---------+-------+--------+--------+ 103 | |Expression | -| -| 0| 13| 104 | |FIFO | -| -| -| -| 105 | |Instance | -| 1| 4764| 4560| 106 | |Memory | -| -| -| -| 107 | |Multiplexer | -| -| -| -| 108 | |Register | -| -| 6| -| 109 | +-----------------+---------+-------+--------+--------+ 110 | |Total | 0| 1| 4770| 4573| 111 | +-----------------+---------+-------+--------+--------+ 112 | |Available | 650| 600| 202800| 101400| 113 | +-----------------+---------+-------+--------+--------+ 114 | |Utilization (%) | 0| ~0 | 2| 4| 115 | +-----------------+---------+-------+--------+--------+ 116 | ``` 117 | 118 | 两种设计之间的时延差异很大,这是由于除法和余数运算需要花费多个周期才能完成。使用精确的数据类型,而不是将设计强制设置为标准C数据类型,可以实现更高质量的FPGA实现:相同的精度,运行速度更快,资源更少。 119 | 120 | ### Overview of Arbitrary Precision Integer Data Types 121 | 122 | Vivado® HLS为C,C++提供整数和定点的任意精度数据类型,并支持System C的任意精度数据类型。 123 | 124 | ![](../images/t7.png) 125 | 126 | Vivado® HLS还提供了定义任意精度类型的头文件,这些头文件是独立的软件包,您有权在自己的源代码中使用它们。软件包xilinx_hls_lib_.tgz在Vivado® HLS安装区域的include目录中提供。该软件包不包含ap_cint.h中定义的C个任意精度类型。这些类型不能与标准C编译器一起使用--仅与Vivado® HLS一起使用。 127 | 128 | #### Arbitrary Precision Integer Types with C 129 | 对于C语言,头文件`ap_cint.h`定义任意精度整数数据类型`[u]int`。要在C函数中使用任意精度的整数数据类型,请执行以下操作: 130 | - 将头文件`ap_cint.h`添加到源代码中。 131 | - 将位类型更改为`intN`或`uintN`,其中`N`是从1到1024的位大小。 132 | 133 | #### Arbitrary Precision Types with C++ 134 | 对于C++语言,头文件`ap_int.h`定义任意精度整数数据类型`ap_[u]int`。要在C++函数中使用任意精度的整数数据类型,请执行以下操作: 135 | - 将头文件`ap_int.h`添加到源代码中。 136 | - 将位类型更改为`ap_int`或`ap_uint`,其中`N`是从1到1024的位大小。 137 | 138 | 下面的示例说明如何添加头文件以及实现两个变量以使用9位整数和10位无符号整数类型: 139 | ```c 140 | #include "ap_int.h" 141 | void foo_top () { 142 | ap_int<9> var1; // 9-bit 143 | ap_uint<10> var2; // 10-bit unsigned 144 | ``` 145 | `ap_[int]`数据类型允许的默认最大宽度为1024位。在包含`ap_int.h`头文件之前,可以通过定义正整数值小于或等于32768的宏`AP_INT_MAX_W`来覆盖此默认值 146 | 147 | *** 148 | :warning: 警告!将`AP_INT_MAX_W`的值设置得太高会导致软件编译和运行速度缓慢。 149 | *** 150 | *** 151 | :warning: 警告!使用`APFixed:`时,ROM综合可能需要很长时间。将其更改为`int`可以加快综合速度。例如: 152 | ```c 153 | static ap_fixed<32> a[32][depth] = 154 | ``` 155 | 可以被修改为: 156 | ```c 157 | static int a[32][depth] = 158 | ``` 159 | *** 160 | 161 | 以下是覆盖`AP_INT_MAX_W`的示例: 162 | ```c 163 | #define AP_INT_MAX_W 4096 // Must be defined before next line 164 | #include "ap_int.h" 165 | ap_int<4096> very_wide_var; 166 | ``` 167 | #### Arbitrary Precision Types with SystemC 168 | System C使用的任意精度类型在`systemc.h`头文件中定义,该文件必须包含在所有System C设计中。头文件包括SystemC `sc_int<>`,`sc_uint<>`,`sc_bigint<>`和`sc_biguint<>`类型。 169 | 170 | ### Overview of Arbitrary Precision Fixed-Point Data Types 171 | 定点数据类型将数据建模为整数和分数形式。在此示例中,Vivado HLS `ap_fixed`类型用于定义18位变量,其中6位代表二进制点以上的数字,而12位代表小数点以下的值。该变量指定为有符号,量化模式设置为四舍五入为正整数。由于未指定溢出模式,因此默认为wrap-around 模式。 172 | ```c 173 | #include 174 | ... 175 | ap_fixed<18,6,AP_RND > my_type; 176 | ... 177 | ``` 178 | 当**计算变量的位数不同或精度不同时,二进制点将自动对齐**。 179 | 180 | 使用定点执行的C++/SystemC仿真的行为与结果硬件相匹配。这使您可以使用快速的C级仿真来分析位精度,量化和溢出行为。 181 | 182 | 定点类型是浮点类型的有用替代,浮点类型需要很多时钟周期才能完成。除非需要浮点类型的整个范围,否则定点类型通常可以以相同的精度的较小和较快的硬件实现相同精度的浮点数。 183 | 184 | 下表提供了`ap_fixed`类型标识符的摘要。 185 | 186 | ![](../images/t8.png) 187 | 188 | `ap_[u]fixed`的数据类型允许的默认最大宽度为`1024`位。在包含`ap_int.h`头文件之前,可以通过定义正整数值小于或等于`32768`的宏`AP_INT_MAX_W`来覆盖此默认值。 189 | 190 | 191 | *** 192 | :warning: 警告!将`AP_INT_MAX_W`的值设置得太高可能会导致缓慢的软件编译和运行时间。 193 | *** 194 | *** 195 | :warning:警告!在以下情况下,ROM合成可能会变慢:`static APFixed_2_2 CAcode_sat[32][CACODE_LEN] =`。将`APFixed`更改为`int`可以更快地合成:`static int CAcode_sat[32][CACODE_LEN] =` 196 | *** 197 | 198 | 以下是覆盖`AP_INT_MAX_W`的示例: 199 | ```c 200 | #define AP_INT_MAX_W 4096 // Must be defined before next line 201 | #include "ap_fixed.h" 202 | ap_fixed<4096> very_wide_var; 203 | ``` 204 | 205 | 使用Vivado HLS时,强烈建议使用任意精度的数据类型。如前面的示例所示,它们通常对硬件实现的质量有明显的好处。 -------------------------------------------------------------------------------- /Xilinx/UG902/Chapter-1-High-Level-Synthesis/CH1.9-Exporting-the-RTL-Design.md: -------------------------------------------------------------------------------- 1 | ## 1.9 Exporting the RTL Design 2 | Vivado HLS流的最后一步是将RTL设计作为知识产权(IP)的一部分导出,并可以被Xilinx设计流中的其他工具使用。可以将RTL设计打包为以下输出格式: 3 | - 用于Vivado Design Suite的IP Catalog格式的IP 4 | - 用于DSP的System Generator用于DSP的Vivado System Generator 5 | - 综合检查点(.dcp) 6 | 7 | 下表显示了您可以导出的格式以及每种格式的详细信息。 8 | 9 | ![](../images/t21.png) 10 | 11 | 除了打包输出格式外,RTL文件还可以作为独立文件(不是打包格式的一部分)在位于目录 `//impl` 的实现内的verilog和vhdl目录中使用。 12 | 13 | 除了RTL文件外,这些目录还包含Vivado Design Suite的项目文件。打开文件project.xpr会使设计(Verilog或VHDL)在可以分析设计的Vivado项目中打开。如果在Vivado HLS项目中执行了C/RTL 协同仿真,则在Vivado项目中可以使用C/RTL 协同仿真文件。 14 | 15 | ### Synthesizing the RTL 16 | 当Vivado HLS报告综合结果时,它可以估算RTL综合后的预期结果:预期的时钟频率,预期的寄存器,LUT和Block RAM数量。这些结果是合理的,因为Vivado HLS无法知道RTL综合执行的确切的优化或实际的路由延迟是什么,因此无法知道最终的面积和时序值。 17 | 18 | 在导出设计之前,您**有机会执行逻辑综合并确认估计的准确性**。下图所示的流程选项调用了具有`syn`选项的RTL综合或具有`impl`选项的RTL综合和实现。在导出过程中,将RTL设计综合到门级或布局和布线实现。 19 | 20 | 提供了RTL综合优化以确认所报告的估计。**在大多数情况下,这些RTL结果不包含在打包的IP中**。 21 | 22 | ![](../images/78.png) 23 | 24 | 对于大多数导出格式,RTL综合是在verilog或vhdl目录中执行的,无论使用前面图中的下拉菜单为HDL选择了哪个HDL进行RTL综合,RTL综合的结果均未包含在打包的IP中。 25 | 26 | :star: 注意:设计检查点综合检查点(.dcp)始终作为综合RTL导出。flow选项可用于评估综合或实现的结果,但导出的软件包始终包含综合网表。 27 | ### Packaging IP Catalog Format 28 | 完成综合和RTL验证后,单击上的Export RTL工具栏按钮,打开Export RTL对话框。 29 | 30 | 在“Format Selection”中选择IP Catalog格式。 31 | 32 | Configuration选项允许将以下标识标签嵌入到导出的程序包中。这些字段可用于帮助识别Vivado IP目录中已打包的RTL。 33 | 34 | 当将设计加载到IP目录中时,可使用配置信息在同一设计的多个实例之间进行区分。例如,如果为IP目录打包了一个实现,然后创建了一个新解决方案并将其打包为IP,则默认情况下,该新解决方案具有相同的名称和配置信息。如果新的解决方案也添加到IP目录中,则IP目录会将其标识为同一IP的更新版本,并且将使用添加到IP目录中的最新版本。 35 | 36 | 另一种方法是在config_rtl配置中使用prefix选项来重命名输出设计和具有唯一前缀的文件。 37 | 38 | 如果配置设置中未提供任何值,那么将使用以下值: 39 | - Vendor: xilinx.com 40 | - Library: hls 41 | - Version: 1.0 42 | - Description: An IP generated by Vivado HLS 43 | - Display Name: This field is left blank by default 44 | - Taxonomy: This field is left blank by default 45 | 46 | 在打包过程完成之后,目录`//impl/ip`中的.zip文件归档可以导入到Vivado IP目录中,并可以在任何Vivado设计(RTL或IP Integrator)中使用。 47 | 48 | #### Software Driver Files 49 | 对于**包含AXI4-Lite从接口的设计,在导出过程中会创建一组软件驱动程序文件**。这些C驱动程序文件可以包含在SDK C项目中,并用于访问AXI4-Lite从端口。 50 | 51 | 软件驱动程序文件被写入目录`//impl/ip/drivers,并**包含在.zip压缩包**中。有关C驱动程序文件的详细信息,请参见AXI4-Lite接口。 52 | 53 | ### Exporting IP to System Generator 54 | 55 | ### Exporting a Synthesized Checkpoint 56 | 完成综合和RTL验证后,单击上的Export RTL工具栏按钮,打开Export RTL对话框。 57 | 58 | ![](../images/80.png) 59 | 60 | 当将设计打包为设计检查点IP时,在打包之前首先将其综合。 61 | 62 | 选择OK将生成设计检查点包。该软件包已写入//impl/ip目录。可以与其他任何设计检查点相同的方式在Vivado Design Suite项目中使用设计检查点文件。 63 | -------------------------------------------------------------------------------- /Xilinx/UG902/Chapter-2-High-Level-Synthesis-C-Libraries/CH2-High-Level-Synthesis-C-Libraries.md: -------------------------------------------------------------------------------- 1 | # Chapter 2 High-Level Synthesis C Libraries 2 | Vivado® HLS C 库允许使用C轻松建模通用硬件设计结构和功能,并综合为RTL。Vivado HLS提供了以下C库: 3 | - Arbitrary Precision Data Types Library 4 | - HLS Stream Library 5 | - HLS Math Library 6 | - HLS Video Library 7 | - HLS IP Library 8 | - HLS Linear Algebra Library 9 | - HLS DSP Library 10 | 11 | 您可以通过包含库头文件来使用设计中的每个C库。这些头文件位于Vivado HLS安装区域中的`include`目录中。 12 | 13 | :star: 重要!如果在Vivado HLS中使用设计,则Vivado HLS C库的头文件不必位于包含路径中。库头文件的路径是自动添加的。 14 | 15 | -------------------------------------------------------------------------------- /Xilinx/UG902/Chapter-2-High-Level-Synthesis-C-Libraries/CH2.2-HLS-Stream-Library.md: -------------------------------------------------------------------------------- 1 | ## 2.1 HLS Stream Library 2 | 流数据是一种数据传输,其中数据样本是从第一个样本开始按顺序发送的。流传输无需地址管理。 3 | 4 | 使用流数据的建模设计在C语言中可能很难。使用指针执行多个读取和/或写入访问的方法可能会带来问题,因为类型限定符和测试台的构造方式有牵连。 5 | 6 | Vivado HLS提供了一个C++模板类`hls::stream<>`,用于对流数据结构进行建模。使用`hls::stream<>`类实现的流具有以下属性。 7 | - 在C代码中,`hls::stream<>`的行为类似于无限深度的FIFO。不需要定义`hls::stream<>`的大小。 8 | - 依次读取和写入它们。即,从`hls::stream<>`读取的数据,将**无法再次读取**。 9 | - 默认情况下,顶层接口上的`hls::stream<>`是用`ap_fifo`接口实现的。 10 | - 设计内部的`hls::stream<>`被实现为**深度为2的FIFO**。优化指令STREAM用于更改此默认大小。 11 | 12 | 本节说明`hls::stream<>`类如何更轻松地使用流数据为设计建模。本节中的主题提供: 13 | - 使用流进行建模的概述以及流的RTL实现。 14 | - 全局流变量的规则。 15 | - 如何使用流。 16 | - 阻塞读取和写入。 17 | - 非阻塞读取和写入。 18 | - 控制FIFO深度。 19 | 20 | :star: 注意:`hls::stream`类应始终在函数之间作为C++**引用参数传递**。例如,&my_stream。 21 | 22 | :star: 重要!`hls::stream`类仅在C++设计中使用。**不支持流数组**。 23 | 24 | ### C Modeling and RTL Implementation 25 | 在**软件**(和RTL协同仿真期间的测试平台)中,将**流建模为无限队列**。无需指定任何深度即可在C++中模拟流。可以在函数内部以及函数接口上使用流。内部流可以作为函数传递给参数。 26 | 27 | 流只能在基于C++的设计中使用。每个`hls::stream<>`对象**必须由单个进程写入并由单个进程读取**。 28 | 29 | 如果在顶层接口上使用`hls::stream`,则默认情况下在RTL中将其实现为**FIFO接口(ap_fifo)**,但也可以将其最佳实现为**握手接口(ap_hs)或AXI-Stream接口(axis)**。 30 | 31 | 如果在设计函数内部使用`hls::stream`并综合到**硬件**中,则**将其实现为FIFO,默认深度为2**。在某些情况下,例如,使用插值时,FIFO的深度可能增加以确保FIFO可以容纳硬件产生的所有元素。**如果无法确保FIFO足够大以容纳硬件产生的所有数据样本,则会导致设计停滞**(在C/RTL协同仿真以及硬件实现中可见)。FIFO的深度可以使用STREAM指令在深度优化的情况下进行调整。示例设计`hls_stream`中提供了一个示例。 32 | 33 | :star: 重要!在默认的非DATAFLOW区域中使用`hls::stream`变量时,请确保其大小正确。 34 | 35 | 如果使用`hls::stream`在任务(子功能或循环)之间传输数据,则应立即考虑在`DATAFLOW`区域中实现任务,在该区域中数据从一个任务流向下一个任务。默认(非DATAFLOW)行为是在开始下一个任务之前完成每个任务,**在这种情况下,用于实现`hls::stream`变量的FIFO必须确定大小**,以确保它们足够大以容纳所有生成的数据样本通过生产者任务。无法增加`hls::stream`变量的大小会导致以下错误: 36 | ``` 37 | ERROR: [XFORM 203-733] An internal stream xxxx.xxxx.V.user.V' with default size is used in a non-dataflow region, which may result in deadlock. Please consider to resize the stream using the directive 'set_directive_stream' or the 'HLS stream' pragma. 38 | ``` 39 | 此错误通知您,在非DATAFLOW区域(默认FIFO深度为2)中,可能不足以容纳生产者任务将所有数据样本写入FIFO的大小。 40 | 41 | #### Global and Local Streams 42 | 流可以在本地或全局定义。本地流始终实现为内部FIFO。全局流可以实现为内部FIFO或端口: 43 | - 只能**读取或写入**的全局定义的流被推断为顶层**RTL模块的外部端口**。 44 | - 全局定义的流(在顶层函数下面的层次结构中)都可以**读取和写入**,都被实现为**内部FIFO**。 45 | 46 | 在全局范围内定义的流遵循与任何其他全局变量相同的规则。 47 | ### Using HLS Streams 48 | 要使用`hls::stream<>`对象,请包含头文件`hls_stream.h`。通过指定类型和变量名称来定义流数据对象。在此示例中,定义了128位无符号整数类型,并将其用于创建名为`my_wide_stream`的流变量。 49 | ```c++ 50 | #include "ap_int.h" 51 | #include "hls_stream.h" 52 | typedef ap_uint<128> uint128_t; // 128-bit user defined type 53 | hls::stream my_wide_stream; // A stream declaration 54 | ``` 55 | 流必须使用范围命名。Xilinx建议使用上面示例中显示的带范围的`hls::`命名。但是,如果要使用`hls`命名空间,则可以将前面的示例重写为: 56 | ```c++ 57 | #include 58 | #include 59 | using namespace hls; 60 | typedef ap_uint<128> uint128_t; // 128-bit user defined type 61 | stream my_wide_stream; // hls:: no longer required 62 | ``` 63 | 给定一个指定为`hls::stream`的流,类型`T`可以是: 64 | - 任何C++自然数据类型 65 | - Vivado HLS任意精度类型(例如ap_int<>,ap_ufixed<>) 66 | - 一个用户定义的包含以上两种类型任何一个的结构体 67 | 68 | 注意:包含方法(成员函数)的常规用户定义类(或结构体)不应用作流变量的类型(T)。 69 | 70 | 流可以被可选地命名。为流提供名称允许在报告中使用该名称。例如,Vivado HLS自动检查以确保在仿真期间读取输入流中的所有元素。给出以下两个流: 71 | ```c++ 72 | stream bytestr_in1; 73 | stream bytestr_in2("input_stream2"); 74 | ``` 75 | 关于流中剩余元素的所有警告均报告如下,其中很明显哪个消息与`bytetr_in2`有关: 76 | ``` 77 | WARNING: Hls::stream 'hls::stream.1' contains leftover data, which may result in RTL simulation hanging. 78 | WARNING: Hls::stream 'input_stream2' contains leftover data, which may result in RTL simulation hanging. 79 | ``` 80 | 当流传入和传出函数时,必须按引用传递它们,如以下示例所示: 81 | ```c++ 82 | void stream_function ( 83 | hls::stream &strm_out, 84 | hls::stream &strm_in, 85 | uint16_t strm_len 86 | ) 87 | ``` 88 | Vivado HLS支持阻塞和非阻塞访问方法。 89 | - **非阻塞**访问只能实现为**FIFO接口**。 90 | - 被实现为**ap_fifo端口**且由**AXI4Stream**资源定义的流端口**不得使用非阻塞访问**。 91 | Vivado HLS示例中提供了使用流的完整设计示例。请参阅GUI欢迎屏幕上可用的设计示例中的`hls_stream`示例。 92 | #### Blocking Reads and Writes 93 | 对hls::stream<>对象的基本访问正在阻止读取和写入。这些是使用类方法完成的。如果在空stream FIFO上尝试进行读取,对full stream FIFO进行写操作,或者直到映射到ap_hs接口协议的流完成了完整握手,这些方法就会stall(执行)。 94 | 95 | 可以在C/RTL协同仿真中观察到stall,当仿真器连续执行,而传输没有任何进展。下图显示了一个stall情况的经典示例,其中,RTL仿真时间持续增长,但是Inter或Intra事务没有任何进展: 96 | ``` 97 | // RTL Simulation : "Inter-Transaction Progress" ["Intra-Transaction 98 | Progress"] @ 99 | "Simulation Time" 100 | ///////////////////////////////////////////////////////////////////////////// 101 | ////// 102 | // RTL Simulation : 0 / 1 [0.00%] @ "110000" 103 | // RTL Simulation : 0 / 1 [0.00%] @ "202000" 104 | // RTL Simulation : 0 / 1 [0.00%] @ "404000" 105 | ``` 106 | ##### Blocking Write Methods 107 | 在此示例中,变量src_var的值被推送到流中。 108 | ```c++ 109 | // Usage of void write(const T & wdata) 110 | hls::stream my_stream; 111 | int src_var = 42; 112 | my_stream.write(src_var); 113 | ``` 114 | << 操作符已重载,因此可以类似于C++流(例如iostream和filestream)的流插入操作符的方式使用它。将被写入的`hls::stream<>`对象作为左侧参数提供,将被写入的值作为右侧参数提供。 115 | ```c++ 116 | // Usage of void operator << (T & wdata) 117 | hls::stream my_stream; 118 | int src_var = 42; 119 | my_stream << src_var; 120 | ``` 121 | ##### Blocking Read Methods 122 | 此方法从流的开头读取并将值赋值给变量dst_var。 123 | ```c++ 124 | // Usage of void read(T &rdata) 125 | hls::stream my_stream; 126 | int dst_var; 127 | my_stream.read(dst_var); 128 | ``` 129 | 另外,可以通过将流赋值给(例如使用=,+=)左侧的对象来读取流中的下一个对象: 130 | ```c++ 131 | // Usage of T read(void) 132 | hls::stream my_stream; 133 | int dst_var = my_stream.read(); 134 | ``` 135 | “ >>”运算符已重载,以允许使用类似于C++流(例如iostream和filestream)的流提取操作符。hls::stream作为LHS参数提供,而目标变量作为RHS提供。 136 | ```c++ 137 | // Usage of void operator >> (T & rdata) 138 | hls::stream my_stream; 139 | int dst_var; 140 | my_stream >> dst_var; 141 | ``` 142 | #### Non-Blocking Reads and Writes 143 | 还提供了非阻塞的写入和读取方法。即使在empty stream上尝试读取或对full stream进行写操作,这些操作也可以继续执行。 144 | 145 | 这些方法返回指示访问状态的布尔值(如果成功,则为true,否则为false)。包括了其他方法来测试hls::stream<>流的状态。 146 | 147 | :star: 重要!**非阻塞行为仅在使用`ap_fifo`协议的接口上受支持**。更具体地说,`AXI-Stream`标准和Xilinx `ap_hs` IO协议不支持非阻塞访问。 148 | 149 | 在C仿真过程中,流具有无限大小。因此,无法使用C仿真来验证流是否已满。仅当定义FIFO大小(默认大小为1或由STREAM指令定义的任意大小)时,才可以在RTL仿真期间验证这些方法。 150 | 151 | :star: 重要!如果设计被指定使用块级I/O协议`ap_ctrl_none`,并且设计包含任何采用非阻塞行为的`hls::stream`变量,则不能保证C/RTL协同仿真完成。 152 | 153 | ##### Non-Blocking Writes 154 | 此方法尝试将变量`src_var`推送到流`my_stream`中,如果成功,则返回布尔值`true`。否则,将返回`false`,并且队列不受影响。 155 | ```c++ 156 | // Usage of void write_nb(const T & wdata) 157 | hls::stream my_stream; 158 | int src_var = 42; 159 | if (my_stream.write_nb(src_var)) { 160 | // Perform standard operations 161 | ... 162 | } else { 163 | // Write did not occur 164 | return; 165 | } 166 | ``` 167 | ##### Fullness Test 168 | ```c++ 169 | bool full(void) 170 | ``` 171 | 当且仅当`hls::stream<>`对象已满时,才返回`true`。 172 | ```c++ 173 | // Usage of bool full(void) 174 | hls::stream my_stream; 175 | int src_var = 42; 176 | bool stream_full; 177 | stream_full = my_stream.full(); 178 | ``` 179 | ##### Non-Blocking Read 180 | ```c++ 181 | bool read_nb(T & rdata) 182 | ``` 183 | 此方法尝试从流中读取一个值,如果成功,则返回`true`。否则,将返回`false`,并且队列不受影响。 184 | ```c++ 185 | // Usage of void read_nb(const T & wdata) 186 | hls::stream my_stream; 187 | int dst_var; 188 | if (my_stream.read_nb(dst_var)) { 189 | // Perform standard operations 190 | ... 191 | } else { 192 | // Read did not occur 193 | return; 194 | } 195 | ``` 196 | ##### Emptiness Test 197 | ```c++ 198 | bool empty(void) 199 | ``` 200 | 如果`hls::stream<>`为空,则返回`true`。 201 | ```c++ 202 | // Usage of bool empty(void) 203 | hls::stream my_stream; 204 | int dst_var; 205 | bool stream_empty; 206 | stream_empty = my_stream.empty(); 207 | ``` 208 | 209 | 以下示例显示了当RTL FIFO为满或空时,无阻塞访问和满/空测试的组合如何提供错误处理功能: 210 | ```c++ 211 | #include "hls_stream.h" 212 | using namespace hls; 213 | typedef struct { 214 | short data; 215 | bool valid; 216 | bool invert; 217 | } input_interface; 218 | bool invert(stream& in_data_1, 219 | stream& in_data_2, 220 | stream& output 221 | ) { 222 | input_interface in; 223 | bool full_n; 224 | // Read an input value or return 225 | if (!in_data_1.read_nb(in)) 226 | if (!in_data_2.read_nb(in)) 227 | return false; 228 | // If the valid data is written, return not-full (full_n) as true 229 | if (in.valid) { 230 | if (in.invert) 231 | full_n = output.write_nb(~in.data); 232 | else 233 | full_n = output.write_nb(in.data); 234 | } 235 | return full_n; 236 | } 237 | ``` 238 | 239 | #### Controlling the RTL FIFO Depth 240 | 对于大多数使用流数据的设计,默认的RTL FIFO深度为2就足够了。流数据通常是在一个样本中一次处理的。 241 | 242 | 对于实现要求深度大于2的FIFO的多速率设计,必须确定(并使用STREAM指令设置)完成RTL仿真所需的深度。如果FIFO深度不足,则RTL协同模拟停顿。 243 | 244 | 由于无法在GUI指令面板中查看流对象,因此无法将STREAM方向直接应用于该Pane中。 245 | 246 | 右键单击在其上声明了`hls::stream<>`的对象(或在参数列表中使用或存在的)的函数,以: 247 | - 选择STREAM指令。 248 | - 使用流变量的名称手动填充variable字段。 249 | 250 | 或者,您可以: 251 | - 在指令.tcl文件中手动指定STREAM指令,或 252 | - 在source中将其作为pragma添加。 253 | 254 | ### C/RTL Co-Simulation Support 255 | Vivado HLS C/RTL协同仿真功能**不支持在顶层接口中包含`hls::stream<>`成员的结构体或类**。Vivado HLS支持这些结构或类进行综合。 256 | ```c++ 257 | typedef struct { 258 | hls::stream a; 259 | hls::stream b; 260 | } strm_strct_t; 261 | void dut_top(strm_strct_t indata, strm_strct_t outdata) { } 262 | ``` 263 | 这些限制**适用于顶层函数参数和全局声明的对象**。如果将流的结构体用于综合,则必须使用外部RTL仿真器和用户创建的HDL测试平台来验证设计。具有严格内部链接的`hls::stream<>`对象没有此类限制。 -------------------------------------------------------------------------------- /Xilinx/UG902/Chapter-2-High-Level-Synthesis-C-Libraries/CH2.3-HLS-Math-Library.md: -------------------------------------------------------------------------------- 1 | ## 2.3 HLS Math Library 2 | Vivado HLS数学库('hls_math.h')为标准C('math.h')和C++('cmath.h')库的综合提供支持,并且自动用于指定综合过程中的数学运算。该支持包括针对所有函数的浮点(单精度,双精度和半精度)以及针对某些函数的定点支持。 3 | 4 | 'hls_math.h'库可以代替标准C++数学库('cmath.h')可选地用于C++源代码,但不能用于C源代码。Vivado HLS将使用适当的实现方式,以避免C仿真与C/RTL协同仿真之间的精度差异。 5 | ### HLS Math Library Accuracy 6 | HLS数学函数是通过`hls_math.h`库中的可综合位近似函数实现的。**位近似HLS数学库函数无法提供与标准C函数相同的精度**。为了获得期望的结果,**位近似实现可能会使用与标准C数学库版本不同的底层算法**。函数的精度以ULP(最低精度单位)指定。精度上的差异对C仿真和C / RTL协同仿真都有影响。 7 | 8 | ULP差异通常在1-4 ULP范围内。 9 | - 如果在C源代码中使用标准C数学库,则由于某些函数与标准C数学库存在ULP差异的事实,**C仿真与C/RTL协同仿真之间可能会有差异**。 10 | - 如果在C源代码中使用了HLS数学库,则C仿真和C/RTL协同仿真之间不会有差异。但是,使用HLS数学库的C仿真可能与使用标准C数学库的C仿真有所不同。 11 | 12 | 此外,以下七个函数可能会显示一些差异,具体取决于用于编译和运行C仿真的C标准: 13 | - copysign 14 | - fpclassify 15 | - isinf 16 | - isfinite 17 | - isnan 18 | - isnormal 19 | - signbit 20 | 21 | **C90 mode** 22 | 23 | 通常,系统头文件仅提供`isinf`,`isnan`和`copysign`,它们以`double`形式进行操作。特别地,`copysign`总是返回双精度结果。如果必须将其返回float,则可能在综合之后产生意外的结果,因为将double-to-float转换模块引入了硬件。 24 | 25 | **C99 mode (-std=c99)** 26 | 27 | 通常在期望系统头文件会将它们重定向到__isnan(double)和__isnan(float)的情况下,提供所有七个函数。普通的GCC头文件不会重定向isnormal,而是根据fpclassify实现它。 28 | 29 | **C++ Using math.h** 30 | 31 | 所有这七个都由系统头文件提供,并且它们以双精度方式操作。 32 | 33 | copysign始终返回双精度结果。如果必须将其返回到float中,则可能在综合后产生意外结果,因为double-to-fat转换模块已引入到硬件中。 34 | 35 | **C++ Using cmath** 36 | 37 | 与C99模式(-std = c99)相似,不同之处在于: 38 | - 系统头文件通常是不同的。 39 | - 正确地对以下函数进行了重载: 40 | - float(), snan(double) 41 | - isinf(double) 42 | 43 | 即使在使用namespace std;时,copysign和copysignf也作为内置函数处理。 44 | 45 | **C++ Using cmath and namespace std** 46 | 47 | 没有问题。Xilinx建议使用以下命令以获得最佳结果: 48 | - 用于C的,-std = c99 49 | - 用于C和C++的, -fno-builtin 50 | 51 | 注:要指定C编译选项,例如`-std=c99`,请使用带有`-cflag`的Tcl命令`add_files`选项。或者,使用Project Settings对话框中的“EDIT CFLAG”按钮。 52 | 53 | ### The HLS Math Library 54 | **HLS数学库中提供了以下功能**。每个函数都支持半精度(type half),单精度(type float)和双精度(type double)。 55 | 56 | :star: 重要!对于下面列出的每个函数`func`,库中还提供了一个关联的半精度函数命名为`half_func`和单精度函数命名为`funcf`。 57 | 58 | 当半精度,单精度和双精度数据类型混合使用时,请检查常见的综合错误,以防止在最终的FPGA实现中引入类型转换硬件。 59 | 60 | ![](../images/2-3-1.png) 61 | 62 | ### Fixed-Point Math Functions 63 | **还为以下数学函数提供定点实现**。 64 | 65 | 所有定点数学函数均支持ap_[f]fixed和ap_[u]int数据类型,并指定以下位宽, 66 | ``` 67 | 1. ap_fixed where I<=33 and W-I<=32 68 | 2. ap_ufixed where I<=32 and W-I<=32 69 | 3. ap_int where I <= 33 70 | 4. ap_uint where I <= 32 71 | ``` 72 | ![](../images/2-3-2.png) 73 | 74 | 定点类型提供的函数值精确度稍差一些,但实现的RTL较小且更快。 75 | 76 | 使用定点数据类型实现数学函数的方法是: 77 | 1. 确定是否支持定点实现。 78 | 2. 更新数学函数以使用`ap_fixed`类型。 79 | 3. 进行C仿真,以验证设计策略是否以所需的精度运行。使用与RTL实现相同的位精度类型来执行C仿真。 80 | 4. 综合设计。 81 | 82 | 例如,函数sin的定点实现是通过将定点类型与数学函数一起使用来指定的,如下所示: 83 | ```c++ 84 | #include "hls_math.h" 85 | #include "ap_fixed.h" 86 | ap_fixed<32,2> my_input, my_output; 87 | my_input = 24.675; 88 | my_output = sin(my_input); 89 | ``` 90 | 使用定点数学函数时,结果类型必须具有与输入相同的宽度和整数位。 91 | 92 | ### Verification and Math Functions 93 | 94 | 如果在C源代码中使用标准C数学库,则C仿真结果和C/RTL协同仿真结果可能会有所不同:**如果源代码中的任何数学函数与标准C数学库相比具有ULP差异,在仿真RTL时可能会导致差异**。 95 | 96 | 如果在C源代码中使用`hls_math.h`库,则**C仿真和C/RTL协同仿真结果一致**。但是,使用hls_math.h进行C仿真的结果与使用标准C库得到的结果不同。hls_math.h库仅确保C仿真与C/RTL协同仿真结果相匹配。在这两种情况下,都会创建相同的RTL实现。以下说明使用数学函数时用于执行验证的每个可能的选项。 97 | 98 | #### Verification Option 1: Standard Math Library and Verify Differences 99 | 在这种选项中,标准C数学库在源代码中使用。如果综合的任何函数确实具有确切的精度,则**C/RTL协同仿真与C仿真不同**。下面的示例重点介绍了这种方法。 100 | ```c++ 101 | #include 102 | #include 103 | #include 104 | #include 105 | #include 106 | using namespace std; 107 | typedef float data_t; 108 | data_t cpp_math(data_t angle) { 109 | data_t s = sinf(angle); 110 | data_t c = cosf(angle); 111 | return sqrtf(s*s+c*c); 112 | } 113 | ``` 114 | 115 | 在这种情况下,C仿真和C/RTL协同仿真之间的结果是不同的。在比较模拟输出时,请记住,将测试台上写入的所有结果写入到执行仿真的工作目录中: 116 | - C simulation: Folder `//csim/build` 117 | - C/RTL co-simulation: Folder `//sim/` 118 | 119 | 其中,``是项目文件夹,``是文件夹中的解决方案的名称,而``是已验证的RTL的类型(verilog或vhdl)。下图显示了左侧的pre-synthesis结果文件和右侧的post-synthesis RTL结果的典型比较。输出显示在第三列中。 120 | 121 | ![](../images/84.png) 122 | 123 | pre-synthesis simulation和post-synthesis simulation的结果以小数为单位。您必须确定这些小数数量在最终的RTL实现中是否可接受。 124 | 125 | 推荐的处理这些差异的流程是使用测试台,检查结果以确保结果在可接受的误差范围内。这可以通过创建同一函数的两个版本来完成,一个用于综合,另一个作为参考版本。在此示例中,仅综合了`cpp_math`函数。 126 | ```c++ 127 | #include 128 | #include 129 | #include 130 | #include 131 | #include 132 | using namespace std; 133 | typedef float data_t; 134 | data_t cpp_math(data_t angle) { 135 | data_t s = sinf(angle); 136 | data_t c = cosf(angle); 137 | return sqrtf(s*s+c*c); 138 | } 139 | data_t cpp_math_sw(data_t angle) { 140 | data_t s = sinf(angle); 141 | data_t c = cosf(angle); 142 | return sqrtf(s*s+c*c); 143 | } 144 | ``` 145 | 在下面的示例中,使用变量diff将两个函数的输出进行比较的测试台来验证设计,以确定差异。在仿真过程中,两个函数均产生相同的输出。对cpp_math的函数进行C/RTL协同仿真会产生不同的结果,并检查结果的差异。 146 | ```c++ 147 | int main() { 148 | data_t angle = 0.01; 149 | data_t output, exp_output, diff; 150 | int retval=0; 151 | for (data_t i = 0; i <= 250; i++) { 152 | output = cpp_math(angle); 153 | exp_output = cpp_math_sw(angle); 154 | // Check for differences 155 | diff = ( (exp_output > output) ? exp_output - output : output - exp_output); 156 | if (diff > 0.0000005) { 157 | printf("Difference %.10f exceeds tolerance at angle %.10f \n", diff, angle); 158 | retval=1; 159 | } 160 | angle = angle + .1; 161 | } 162 | if (retval != 0) { 163 | printf("Test failed !!!\n"); 164 | retval=1; 165 | } else { 166 | printf("Test passed !\n"); 167 | } 168 | // Return 0 if the test passes 169 | return retval; 170 | } 171 | ``` 172 | 如果差异容限降低至0.00000005,则此测试平台将突出显示C/RTL协同仿真期间的误差容限: 173 | ``` 174 | Difference 0.0000000596 at angle 1.1100001335 175 | Difference 0.0000000596 at angle 1.2100001574 176 | Difference 0.0000000596 at angle 1.5100002289 177 | Difference 0.0000000596 at angle 1.6100002527 178 | etc.. 179 | ``` 180 | 当使用标准C数学库(math.h和cmath.h)时,创建一个“智能”测试平台以验证可接受的精度差异。 181 | 182 | #### Verification Option 2: HLS Math Library and Validate Differences 183 | 另一种验证方式是将源代码转换为使用HLS数学库。启用此选项后,C仿真和C/RTL协同仿真的结果之间没有区别。以下示例显示如何修改以上代码以使用hls_math.h库。 184 | 185 | :star: 注意:此选项仅在C++中可用。 186 | 187 | - 包括hls_math.h头文件。 188 | - 将数学函数替换为等效的hls::函数。 189 | 190 | ```c++ 191 | #include 192 | #include "hls_math.h" 193 | #include 194 | #include 195 | #include 196 | #include 197 | using namespace std; 198 | typedef float data_t; 199 | data_t cpp_math(data_t angle) { 200 | data_t s = hls::sinf(angle); 201 | data_t c = hls::cosf(angle); 202 | return hls::sqrtf(s*s+c*c); 203 | } 204 | ``` 205 | #### Verification Option 3: HLS Math Library File and Validate Differences 206 | 将HLS数学库文件lib_hlsm.cpp包括在内作为设计文件,可确保Vivado HLS使用HLS数学库进行C模拟。此opetion与option2相同,但是它不需要修改C代码。 207 | 208 | HLS数学库文件位于Vivado HLS安装区域中的src目录中。只需将文件复制到本地文件夹,然后将文件添加为标准设计文件即可。 209 | 210 | :star: 注意:此选项仅在C++中可用。 211 | 212 | 与option2一样,使用此option后,对于使用HLS数学库文件的C仿真结果与先前未添加此文件的结果之间也存在差异。这些差异应使用类似于option1的“智能”测试平台通过C仿真来验证。 213 | 214 | ### Common Synthesis Errors 215 | 以下是综合数学函数时的常见使用错误。这些通常是(但不是唯一)由将C函数转换为C++来利用数学函数的综合功能引起的。 216 | 217 | **C++ cmath.h** 218 | 219 | 如果使用C++ `cmath.h`头文件,则可以使用float函数(例如sinf和cosf)。这些导致硬件中的32位操作。cmath.h头文件还会重载标准函数(例如,sin和cos),因此它们可用于float和double类型。 220 | 221 | **C math.h** 222 | 223 | 如果使用C `math.h`库,则需要单精度函数(例如sinf和cosf)来综合32位浮点运算。所有标准函数调用(例如sin和cos)都将导致double和64-bit double运算被综合。 224 | 225 | **Cautions** 226 | 227 | 将C函数转换为C++以利用对math.h的支持时,在与Vivado HLS综合之前,请确保新的C++代码正确编译。例如,如果在带有`math.h`的代码中使用sqrtf(),则需要在C++代码中添加以下代码extern以支持它: 228 | 229 | ```c++ 230 | #include 231 | extern “C” float sqrtf(float); 232 | ``` 233 | 234 | 为避免类型转换引起不必要的硬件,请遵循有关浮点和双精度中讨论的将双精度和浮点类型混合在一起的警告。 -------------------------------------------------------------------------------- /Xilinx/UG902/Chapter-2-High-Level-Synthesis-C-Libraries/CH2.4-HLS-Video-Library.md: -------------------------------------------------------------------------------- 1 | ## 2.4 HLS Video Library 2 | :star: 重要!Vivado®HLS视频库已移至Xilinx® GitHub,可以在以下位置找到:https://github.com/Xilinx/xfopencv -------------------------------------------------------------------------------- /Xilinx/UG902/Chapter-2-High-Level-Synthesis-C-Libraries/CH2.5-HLS-IP-Libraries.md: -------------------------------------------------------------------------------- 1 | ## 2.5 HLS IP Libraries 2 | Vivado HLS提供C++库来实现许多Xilinx IP模块。C库允许直接从C++源代码推断以下Xilinx IP块,从而确保在FPGA中高质量的实现。 3 | 4 | ![](../images/t26.png) 5 | 6 | ### FFT IP Library 7 | 8 | ### SSR FFT IP Library 9 | 10 | ### FIR Filter IP Library 11 | 12 | ### DDS IP Library 13 | 14 | ### SRL IP Library -------------------------------------------------------------------------------- /Xilinx/UG902/Chapter-2-High-Level-Synthesis-C-Libraries/CH2.6-HLS-Linear-Algebra-Library.md: -------------------------------------------------------------------------------- 1 | ## 2.6 HLS Linear Algebra Library 2 | HLS线性代数库提供了许多常用的C++线性代数函数。HLS线性代数库中的函数均使用二维数组来表示矩阵,并在下表中列出。 3 | 4 | ![](../images/t34.png) 5 | 6 | 线性代数函数都使用二维数组来表示矩阵。所有函数都支持float(单精度)输入,用于实数和复数数据。函数的子集支持用于实数和复数数据的ap_fixed(fixed-point)输入。如果需要,可以由用户定义ap_fixed类型的精度和舍入行为。 7 | 8 | ### Using the Linear Algebra Library 9 | 您可以使用以下方法之一来引用HLS线性代数函数: 10 | - Using scoped naming: 11 | ```c++ 12 | #include "hls_linear_algebra.h" 13 | hls::cholesky(In_Array,Out_Array); 14 | ``` 15 | - Using the hls namespace: 16 | ```c++ 17 | #include "hls_linear_algebra.h" 18 | using namespace hls; // Namespace specified after the header files 19 | cholesky(In_Array,Out_Array); 20 | ``` 21 | 22 | ### Optimizing the Linear Algebra Functions 23 | 使用线性代数函数时,必须确定RTL实现的优化级别。优化的级别和类型取决于如何编写C代码以及如何将Vivado HLS指令应用于C代码。 24 | 25 | 为了简化优化过程,Vivado HLS提供了线性代数库函数,其中包括几种C代码架构和嵌入式优化指令。使用C++配置类,您可以选择要使用的C代码和要应用的优化指令。 26 | 27 | 尽管确切的优化效果因函数而异,但配置类通常允许您为RTL实现指定优化级别,如下所示: 28 | - Small:资源和吞吐量较低 29 | - Balanced:资源和吞吐量之间的折衷 30 | - Fast:较高的吞吐量,不过以较高的资源为代价 31 | 32 | Vivado HLS提供了示例项目,这些项目展示了如何为线性代数库中的每个函数使用配置类。您可以将这些示例用作模板,以了解如何针对特定实现目标为每个函数配置Vivado HLS。每个示例都提供了一个c++源文件,该文件具有多个作为不同c++函数的C代码体系结构。 33 | 34 | :star: 注意:要标识顶层C++函数,请在指令.tcl文件或Vivado HLS GUI指令选项卡中查找TOP指令。 35 | 36 | ![](../images/2-6-1.png) 37 | 38 | #### Cholesky 39 | 40 | #### Cholesky Inverse and QR Inverse 41 | 42 | #### Matrix Multiply 43 | 44 | #### QRF 45 | 46 | #### SVD -------------------------------------------------------------------------------- /Xilinx/UG902/Chapter-2-High-Level-Synthesis-C-Libraries/CH2.7-HLS-DSP-Library.md: -------------------------------------------------------------------------------- 1 | ## 2.7 HLS DSP Library 2 | HLS DSP库包含用于C++ DSP系统建模的构建模块函数,重点是SDR应用程序中使用的函数。下表显示了HLS DSP库中的函数。 3 | 4 | ![](../images/t40.png) 5 | 6 | 函数使用Vivado HLS固定精度类型ap_[u]int和ap_[u]fixed来描述所需的输入和输出数据。该函数具有最小的可行接口类型,以最大程度地提高灵活性。例如,具有简单吞吐量模型的函数(例如,一个样本输入一个样本)使用指针接口。执行速率更改的函数(例如viterbi_decoder)在接口上使用hls::stream类型。 7 | 8 | 您可以复制现有的库并使接口更复杂,例如为指针接口创建hls::streams,为任何函数创建AXI4-Stream接口。但是,复杂的接口需要更多的资源。 9 | 10 | Vivado HLS将大多数库元素作为模板化的C++类提供,在头文件(hls_dsp.h)中对其进行了完整说明,其中包含构造函数,析构函数和操作符访问函数。 11 | 12 | ### Using the DSP Library 13 | 您可以使用以下方法之一来引用DSP函数: 14 | - Using scoped naming: 15 | ```c 16 | #include 17 | static hls::awgn my_awgn(seed); 18 | my_awgn(snr, noise); 19 | ``` 20 | - Using the hls namespace: 21 | ```c 22 | #include 23 | using namespace hls; 24 | static awgn my_awgn(seed); 25 | my_awgn(snr, noise); 26 | ``` 27 | 28 | DSP库中的函数在源代码中包含了作为prgmas指令的综合指令,这些指令指导Vivado HLS综合函数以满足典型要求。该函数已针对最大吞吐量进行了优化,这是最常见的用例。例如,可以完全分割数组以确保实现初始间隔为1,而不考虑模板参数配置。 29 | 30 | 您可以按以下步骤删除现有的优化或应用其他优化: 31 | - 要在DSP功能上应用优化,请在Vivado HLS GUI中打开标题文件hls_dsp.h,然后执行以下操作之一 : 32 | - 按Ctrl键并单击#include “hls_dsp.h”。 33 | - 使用Explorer Pane,导航到使用该include文件夹的文件。 34 | - 要添加或删除优化指令,请在Information pane中打开头文件,然后使用“Directives”选项卡。 35 | 36 | :star: 注意:如果将优化添加为编译指示,则Vivado HLS会将优化放置在库中,并在每次将头文件添加到设计时都应用该优化。可能需要文件写入权限才能将优化添加为pragma。 37 | 38 | :bulb: 提示:如果要修改函数以修改其RTL实现,请在库源代码中查找带有前缀TIP的注释,该注释指示放置Pragma或应用directive的位置。 -------------------------------------------------------------------------------- /Xilinx/UG902/Chapter-2-High-Level-Synthesis-C-Libraries/CH2.8-HLS-SQL-Library.md: -------------------------------------------------------------------------------- 1 | ## 2.8 HLS SQL Library 2 | SQL库包含C++中的SQL标准部件函数。下表显示了HLS SQL库中的函数。 3 | 4 | ![](../images/t41.png) 5 | 6 | Vivado HLS在`hls_db`名称空间中将这些库元素作为模板化的C ++函数提供。有关所有SQL功能的完整描述,请参见第4章中的HLS SQL库功能。 7 | ### Using the SQL Library 8 | 您可以使用以下方法引用SQL函数: 9 | ```c++ 10 | #include 11 | hls_alg::sha256(in_stream, in_stream_depth, out_stream); 12 | ``` 13 | SQL库中的函数在源代码中包含了作为pragmas指令的综合指令,这些指令指导Vivado HLS综合函数以满足典型要求。 -------------------------------------------------------------------------------- /Xilinx/UG902/Chapter-3-High-Level-Synthesis-Coding-Styles/CH3-High-Level-Synthesis-Coding-Styles.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/Chapter-3-High-Level-Synthesis-Coding-Styles/CH3-High-Level-Synthesis-Coding-Styles.md -------------------------------------------------------------------------------- /Xilinx/UG902/Chapter-3-High-Level-Synthesis-Coding-Styles/CH3.1-Unsupported-C-Constructs.md: -------------------------------------------------------------------------------- 1 | ## 3.1 Unsupported C Constructs 2 | 尽管Vivado® HLS支持广泛的C语言,但某些结构无法综合,否则可能导致设计流程中的错误。本节讨论必须对编码进行更改的区域,以便在设备中综合和实现函数。 3 | 4 | 可综合的: 5 | - C函数必须包含设计的整体功能。 6 | - 没有任何函数执行操作系统的系统调用。 7 | - C构造必须为固定或有限大小。 8 | - 这些构造的实现必须明确。 9 | 10 | ### System Calls 11 | 系统调用无法综合,因为它们是与在运行C程序的操作系统上执行某些任务有关的活动。 12 | 13 | Vivado® HLS忽略仅显示数据且对算法的执行没有影响的常用系统调用,例如printf()和fprintf(stdout,)。通常,无法综合对系统的调用,应在综合之前将其从函数中删除。此类调用的其他示例是getc(),time(),sleep(),所有这些都对操作系统进行调用。 14 | 15 | 当执行综合时,**Vivado HLS定义宏`__SYNTHESIS__`**。这允许`__SYNTHESIS__`宏从设计中排除不可综合的代码。 16 | 17 | :star: 注意:仅在要综合的代码中使用`__SYNTHESIS__`宏。**请勿在测试平台中使用此宏**,因为C仿真或C RTL协同仿真不遵循该宏。 18 | 19 | :warning: 警告!**您不得在代码中或在编译器优化程序中定义或取消定义__SYNTHESIS__宏**,否则编译可能会失败。(个人注:一会说用这个宏注释代码,一会又说不能用,什么鬼?) 20 | 21 | 在下面的代码示例中,来自子函数的中间结果被保存到硬盘驱动器上的文件中。宏`__SYNTHESIS__`用于确保在综合过程中忽略不可综合的文件写入。 22 | ```c++ 23 | #include "hier_func4.h" 24 | int sumsub_func(din_t *in1, din_t *in2, dint_t *outSum, dint_t *outSub) 25 | { 26 | *outSum = *in1 + *in2; 27 | *outSub = *in1 - *in2; 28 | } 29 | int shift_func(dint_t *in1, dint_t *in2, dout_t *outA, dout_t *outB) 30 | { 31 | *outA = *in1 >> 1; 32 | *outB = *in2 >> 2; 33 | } 34 | void hier_func4(din_t A, din_t B, dout_t *C, dout_t *D) 35 | { 36 | dint_t apb, amb; 37 | sumsub_func(&A,&B,&apb,&amb); 38 | #ifndef __SYNTHESIS__ 39 | FILE *fp1; // The following code is ignored for synthesis 40 | char filename[255]; 41 | sprintf(filename,Out_apb_%03d.dat,apb); 42 | fp1=fopen(filename,w); 43 | fprintf(fp1, %d \n, apb); 44 | fclose(fp1); 45 | #endif 46 | shift_func(&apb,&amb,C,D); 47 | } 48 | ``` 49 | __SYNTHESIS__宏是一种便捷的方法,可以将不可综合的代码排除在外,而无需从C函数中删除代码本身。使用这样的宏意味着用于仿真的C代码和用于综合的C代码是不同的。 50 | 51 | :warning: 警告!如果使用__SYNTHESIS__宏来更改C代码的功能,则可能导致C仿真与C综合之间的结果不同。这种代码中的错误本质上很难调试。不要使用__SYNTHESIS__宏来更改功能。 52 | ### Dynamic Memory Usage 53 | 任何管理系统内存分配的系统调用,例如malloc(),alloc()和free(),都将使用操作系统内存中存在并在运行时创建和释放的资源 :要能够综合设计的硬件实现,必须完全独立,并指定所有必需的资源。 54 | 55 | 综合之前必须从设计代码中删除系统调用中的内存分配。由于动态内存操作用于定义设计的功能,因此必须将其转换为等效的有界表示。 56 | 下面的代码示例演示如何将使用malloc()的设计转换为可综合的版本,并重点介绍两种有用的编码样式技术: 57 | - 设计不使用`__SYNTHESIS__`宏。 58 | 59 | 用户定义的宏`NO_SYNTH`用于在可综合版本和不可综合版本之间进行选择。这样可以确保在C中仿真相同的代码,并在Vivado® HLS中进行综合。 60 | 61 | - 使用malloc()的原始设计中的指针使用固定大小的元素不需要重写。 62 | 63 | 可以创建固定大小的资源,并且可以简单地使现有指针指向固定大小的资源。此技术可以防止对现有设计进行手动编码。 64 | 65 | ```c++ 66 | #include "malloc_removed.h" 67 | #include 68 | //#define NO_SYNTH 69 | dout_t malloc_removed(din_t din[N], dsel_t width) { 70 | #ifdef NO_SYNTH 71 | long long *out_accum = malloc (sizeof(long long)); 72 | int* array_local = malloc (64 * sizeof(int)); 73 | #else 74 | long long _out_accum; 75 | long long *out_accum = &_out_accum; 76 | int _array_local[64]; 77 | int* array_local = &_array_local[0]; 78 | #endif 79 | int i,j; 80 | 81 | LOOP_SHIFT:for (i=0;i>2; 86 | } 87 | *out_accum=0; 88 | LOOP_ACCUM:for (j=0;jbar(); 110 | } 111 | 112 | 113 | A* a = 0; 114 | if (base) 115 | a = new A(); 116 | else 117 | a = new B(); 118 | fun(a); //原著是foo(a) 119 | ``` 120 | 121 | ### Pointer Limitations 122 | 123 | **General Pointer Casting** 124 | 125 | Vivado HLS不支持通用指针转换,但是支持在自然C类型之间进行指针转换。 126 | 127 | **Pointer Arrays** 128 | 129 | Vivado HLS支持指针数组进行综合,前提是每个指针都指向一个标量或一个标量数组。指针数组不能指向附加指针。 130 | 131 | **Function Pointers** 132 | 133 | 不支持函数指针。 134 | 135 | ### Recursive Functions 136 | 137 | 递归函数无法综合。这适用于可以形成无穷递归的函数,其中无穷无尽: 138 | ```c++ 139 | unsigned foo (unsigned n) 140 | { 141 | if (n == 0 || n == 1) return 1; 142 | return (foo(n-2) + foo(n-1)); 143 | } 144 | ``` 145 | Vivado® HLS不支持尾部递归,在尾部递归中调用次数有限。 146 | ```c++ 147 | unsigned foo (unsigned m, unsigned n) 148 | { 149 | if (m == 0) return n; 150 | if (n == 0) return m; 151 | return foo(n, m%n); 152 | } 153 | ``` 154 | 在C++中,模板可以实现尾部递归。接下来介绍它。 155 | 156 | #### Standard Template Libraries 157 | 许多C++标准模板库(STL)包含递归功能,并使用动态内存分配。因此,无法综合STL。STL的解决方案是创建具有相同功能的局部功能,该功能不具有递归,动态内存分配或动态创建和析构的这些特征。 158 | 159 | :star: 注意:综合支持标准数据类型,例如std::complex。 160 | 161 | -------------------------------------------------------------------------------- /Xilinx/UG902/Chapter-3-High-Level-Synthesis-Coding-Styles/CH3.11-Assertions.md: -------------------------------------------------------------------------------- 1 | ## 3.11 Assertions 2 | 当用assert范围信息时,HLS支持C中的断言宏进行综合。例如,变量和循环界限的上限。 3 | 4 | 当存在可变的循环边界时,Vivado HLS无法确定循环的所有迭代的延迟,而是通过“?”标记来报告延迟。Tripcount指令可以将循环界限通知给Vivado HLS,但是此信息仅用于报告目的,不会影响综合结果(创建相同大小的硬件,无论是否使用Tripcount指令)。 5 | 6 | 下面的代码示例显示断言如何将变量的最大范围告知Vivado HLS,以及如何将这些断言用于产生更优的硬件。 7 | 8 | 在使用断言之前,必须包含定义断言宏的头文件。在此示例中,它包含在头文件中。 9 | ```c++ 10 | #ifndef _loop_sequential_assert_H_ 11 | #define _loop_sequential_assert_H_ 12 | #include 13 | #include 14 | #include ap_cint.h 15 | #define N 32 16 | typedef int8 din_t; 17 | typedef int13 dout_t; 18 | typedef uint8 dsel_t; 19 | void loop_sequential_assert(din_t A[N], din_t B[N], dout_t X[N], dout_t Y[N], dsel_t xlimit, dsel_t ylimit); 20 | #endif 21 | ``` 22 | 在主代码中,两个assert语句放置在每个循环之前。 23 | ```c 24 | assert(xlimit<32); 25 | ... 26 | assert(ylimit<16); 27 | ... 28 | ``` 29 | 这些断言: 30 | - 保证如果断言为假与值大于规定的值,则C仿真将失败。这也说明了为什么在综合之前仿真C代码很重要:确认设计在综合之前有效。 31 | - 通知Vivado HLS该变量的范围不会超过该值,并且这个事实可以优化RTL中的变量大小,在这种情况下,可以优化循环迭代。 32 | 33 | 以下代码示例显示了这些断言。 34 | ```c 35 | #include "loop_sequential_assert.h" 36 | void loop_sequential_assert(din_t A[N], din_t B[N], dout_t X[N], dout_t 37 | Y[N], dsel_t 38 | xlimit, dsel_t ylimit) { 39 | dout_t X_accum=0; 40 | dout_t Y_accum=0; 41 | int i,j; 42 | assert(xlimit<32); 43 | SUM_X:for (i=0;i<=xlimit; i++) { 44 | X_accum += A[i]; 45 | X[i] = X_accum; 46 | } 47 | assert(ylimit<16); 48 | SUM_Y:for (i=0;i<=ylimit; i++) { 49 | Y_accum += B[i]; 50 | Y[i] = Y_accum; 51 | } 52 | } 53 | ``` 54 | 除了断言宏,此代码与“Loop Parallelism”中显示的代码相同。在综合之后的综合报告中,有两个重要区别。 55 | 56 | 如果没有assert宏,报告将如下所示,表明循环tripcount可以在1到256之间变化,因为循环边界的变量是d_sel数据类型的8位变量。 57 | 58 | ``` 59 | * Loop Latency: 60 | +----------+-----------+----------+ 61 | |Target II |Trip Count |Pipelined | 62 | +----------+-----------+----------+ 63 | |- SUM_X |1 ~ 256 |no | 64 | |- SUM_Y |1 ~ 256 |no | 65 | +----------+-----------+----------+ 66 | ``` 67 | 68 | 在具有assert宏的版本中,报告显示了循环SUM_X和SUM_Y报告的Tripcount为32和16。因为断言声明值永远不会大于32和16,因此Vivado HLS可以在报告中使用该值。 69 | 70 | ``` 71 | * Loop Latency: 72 | +----------+-----------+----------+ 73 | |Target II |Trip Count |Pipelined | 74 | +----------+-----------+----------+ 75 | |- SUM_X |1 ~ 32 |no | 76 | |- SUM_Y |1 ~ 16 |no | 77 | +----------+-----------+----------+ 78 | ``` 79 | 此外,与使用Tripcount指令不同,assert语句可以提供更优化的硬件。在没有断言的情况下,最终硬件将使用大小最大为256个循环迭代的变量和计数器。 80 | ``` 81 | * Expression: 82 | +----------+------------------------+-------+---+----+ 83 | |Operation |Variable Name |DSP48E |FF |LUT | 84 | +----------+------------------------+-------+---+----+ 85 | |+ |X_accum_1_fu_182_p2 |0 |0 |13 | 86 | |+ |Y_accum_1_fu_209_p2 |0 |0 |13 | 87 | |+ |indvar_next6_fu_158_p2 |0 |0 |9 | 88 | |+ |indvar_next_fu_194_p2 |0 |0 |9 | 89 | |+ |tmp1_fu_172_p2 |0 |0 |9 | 90 | |+ |tmp_fu_147_p2 |0 |0 |9 | 91 | |icmp |exitcond1_fu_189_p2 |0 |0 |9 | 92 | |icmp |exitcond_fu_153_p2 |0 |0 |9 | 93 | +----------+------------------------+-------+---+----+ 94 | |Total | |0 |0 |80 | 95 | +----------+------------------------+-------+---+----+ 96 | ``` 97 | 断言变量范围小于最大可能范围的代码将导致更小的RTL设计。 98 | ``` 99 | * Expression: 100 | +----------+------------------------+-------+---+----+ 101 | |Operation |Variable Name |DSP48E |FF |LUT | 102 | +----------+------------------------+-------+---+----+ 103 | |+ |X_accum_1_fu_176_p2 |0 |0 |13 | 104 | |+ |Y_accum_1_fu_207_p2 |0 |0 |13 | 105 | |+ |i_2_fu_158_p2 |0 |0 |6 | 106 | |+ |i_3_fu_192_p2 |0 |0 |5 | 107 | |icmp |tmp_2_fu_153_p2 |0 |0 |7 | 108 | |icmp |tmp_9_fu_187_p2 |0 |0 |6 | 109 | +----------+------------------------+-------+---+----+ 110 | |Total | |0 |0 |50 | 111 | +----------+------------------------+-------+---+----+ 112 | ``` 113 | 断言可以指示设计中任何变量的范围。在使用断言时执行涵盖所有可能情况的C仿真非常重要。这将确认Vivado HLS使用的断言是有效的。 -------------------------------------------------------------------------------- /Xilinx/UG902/Chapter-3-High-Level-Synthesis-Coding-Styles/CH3.12-SystemC-Synthesis.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/Chapter-3-High-Level-Synthesis-Coding-Styles/CH3.12-SystemC-Synthesis.md -------------------------------------------------------------------------------- /Xilinx/UG902/Chapter-3-High-Level-Synthesis-Coding-Styles/CH3.2-C-Test-Bench.md: -------------------------------------------------------------------------------- 1 | ## 3.2 C Test Bench 2 | 综合任何块的第一步是验证C函数是否正确。该步骤由测试台执行。编写好的测试台可以大大提高您的生产率。 3 | 4 | C函数比RTL仿真的执行速度快几个数量级。与在RTL进行开发相比,在综合之前使用C开发和验证算法的效率更高。 5 | - 利用C语言开发的关键是要有一个测试台,以根据已知的良好结果检查函数的结果。因为已知该算法是正确的,所以可以在综合之前验证任何代码更改。 6 | - Vivado® HLS重用C测试台以验证RTL设计。使用Vivado HLS时无需创建RTL测试台。如果测试台检查顶层函数的结果,则可以通过仿真验证RTL。 7 | 8 | :star: 注意:要为测试台提供输入参数,请选择Project→Project Settings,单击Simulation,然后使用Input Arguments选项。测试台不能执行交互用户输入。Vivado HLS GUI没有命令控制台,并且在执行测试台时不能接受用户输入。 9 | 10 | Xilinx建议您从测试台中分离用于综合的顶层函数,并使用头文件。以下代码示例显示了一种设计,其中hier_func调用两个子函数: 11 | - sumsub_func执行加法和减法。 12 | - shift_func执行移位。 13 | 14 | 数据类型在头文件(hier_func.h)中定义,该文件也有描述: 15 | ```c++ 16 | #include "hier_func.h" 17 | int sumsub_func(din_t *in1, din_t *in2, dint_t *outSum, dint_t *outSub) 18 | { 19 | *outSum = *in1 + *in2; 20 | *outSub = *in1 - *in2; 21 | } 22 | int shift_func(dint_t *in1, dint_t *in2, dout_t *outA, dout_t *outB) 23 | { 24 | *outA = *in1 >> 1; 25 | *outB = *in2 >> 2; 26 | } 27 | void hier_func(din_t A, din_t B, dout_t *C, dout_t *D) 28 | { 29 | dint_t apb, amb; 30 | sumsub_func(&A,&B,&apb,&amb); 31 | shift_func(&apb,&amb,C,D); 32 | } 33 | ``` 34 | 顶层函数可以包含多个子函数。只能有一个用于综合的顶层函数。要综合多个函数,请将它们组合为一个顶层函数。 35 | 36 | 要综合函数hier_func: 37 | 1. 将以上示例所示的文件作为设计文件添加到Vivado HLS项目中。 38 | 2. 将顶层函数指定为hier_func。 39 | 40 | 综合后: 41 | - 顶层函数的参数(在上面的示例中为A,B,C和D)被综合为RTL端口。 42 | - 顶层函数(上例中的sumsub_func和shift_func)内的函数被综合为分层的块。 43 | 44 | 上面的示例中的头文件(hier_func.h)显示了如何使用宏以及typedef语句使代码更具可移植性和可读性。稍后的部分将展示typedef语句如何优化类型以及变量的位宽,以便在最终的FPGA实现中改善面积和性能。 45 | ```c 46 | #ifndef _HIER_FUNC_H_ 47 | #define _HIER_FUNC_H_ 48 | #include 49 | #define NUM_TRANS 40 50 | typedef int din_t; 51 | typedef int dint_t; 52 | typedef int dout_t; 53 | void hier_func(din_t A, din_t B, dout_t *C, dout_t *D); 54 | #endif 55 | ``` 56 | 此示例中的头文件包含设计文件中不需要的一些定义(例如NUM_TRANS)。这些定义由测试台使用,该测试台还包括相同的头文件。 57 | 58 | 以下代码示例显示了第一个示例中所示设计的测试台。 59 | ```c 60 | #include "hier_func.h" 61 | int main() { 62 | // Data storage 63 | int a[NUM_TRANS], b[NUM_TRANS]; 64 | int c_expected[NUM_TRANS], d_expected[NUM_TRANS]; 65 | int c[NUM_TRANS], d[NUM_TRANS]; 66 | //Function data (to/from function) 67 | int a_actual, b_actual; 68 | int c_actual, d_actual; 69 | // Misc 70 | int retval=0, i, i_trans, tmp; 71 | FILE *fp; 72 | // Load input data from files 73 | fp=fopen(tb_data/inA.dat,r); 74 | for (i=0; i> 1; 176 | *outB = *in2 >> 2; 177 | } 178 | void hier_func2(din_t A, din_t B, dout_t *C, dout_t *D) // Test Bench一部分 179 | { 180 | dint_t apb, amb; 181 | sumsub_func(&A,&B,&apb,&amb); // 顶层函数 182 | shift_func(&apb,&amb,C,D); 183 | } 184 | ``` 185 | 186 | ### Combining Test Bench and Design Files 187 | 您还可以将设计和测试台纳入单个设计文件中。下面的示例具有与C测试台相同的功能,不同之处在于所有内容均在单个文件中。hier_func重命名为hier_func3以确保示例是唯一的。 188 | 189 | :star: 重要!如果测试台和设计位于单个文件中,则必须将该文件作为设计文件和测试台文件添加到Vivado® HLS项目中。 190 | 191 | ```c++ 192 | #include 193 | #define NUM_TRANS 40 194 | typedef int din_t; 195 | typedef int dint_t; 196 | typedef int dout_t; 197 | int sumsub_func(din_t *in1, din_t *in2, dint_t *outSum, dint_t *outSub) 198 | { 199 | *outSum = *in1 + *in2; 200 | *outSub = *in1 - *in2; 201 | } 202 | int shift_func(dint_t *in1, dint_t *in2, dout_t *outA, dout_t *outB) 203 | { 204 | *outA = *in1 >> 1; 205 | *outB = *in2 >> 2; 206 | } 207 | void hier_func3(din_t A, din_t B, dout_t *C, dout_t *D) 208 | { 209 | dint_t apb, amb; 210 | sumsub_func(&A,&B,&apb,&amb); 211 | shift_func(&apb,&amb,C,D); 212 | } 213 | int main() { 214 | // Data storage 215 | int a[NUM_TRANS], b[NUM_TRANS]; 216 | int c_expected[NUM_TRANS], d_expected[NUM_TRANS]; 217 | int c[NUM_TRANS], d[NUM_TRANS]; 218 | //Function data (to/from function) 219 | int a_actual, b_actual; 220 | int c_actual, d_actual; 221 | // Misc 222 | int retval=0, i, i_trans, tmp; 223 | FILE *fp; 224 | // Load input data from files 225 | fp=fopen(tb_data/inA.dat,r); 226 | for (i=0; i b) 177 | a -= b; 178 | else 179 | b -= a; 180 | } 181 | ``` 182 | 该循环无法进行流水线处理。循环的下一个迭代要等到上一个迭代结束后才能开始。并非所有循环依赖性都如此极端,但是此示例强调了某些操作要等到其他一些操作完成才能开始。解决方案是尝试确保尽早执行初始操作。 183 | 184 | 循环依赖性可能与任何类型的数据一起发生。它们在使用数组时特别常见。 185 | 186 | ### Unrolling Loops in C++ Classes 187 | 在C++类中使用循环时,应注意确保循环归纳变量不是该类的数据成员,因为这样会阻止循环展开。 188 | 189 | 在此示例中,循环归纳变量k是foo_class类的成员。 190 | ```c++ 191 | template 192 | class foo_class { 193 | private: 194 | pe_mac mac; 195 | public: 196 | T0 areg; 197 | T0 breg; 198 | T2 mreg; 199 | T1 preg; 200 | T0 shift[N]; 201 | int k; // Class Member 202 | T0 shift_output; 203 | 204 | void exec(T1 *pcout, T0 *dataOut, T1 pcin, T3 coeff, T0 data, int col) 205 | { 206 | Function_label0:; 207 | #pragma HLS inline off 208 | SRL:for (k = N-1; k >= 0; --k) { 209 | #pragma HLS unroll // Loop will fail UNROLL 210 | if (k > 0) 211 | shift[k] = shift[k-1]; 212 | else 213 | shift[k] = data; 214 | } 215 | *dataOut = shift_output; 216 | shift_output = shift[N-1]; 217 | } 218 | *pcout = mac.exec1(shift[4*col], coeff, pcin); 219 | }; 220 | ``` 221 | 为使Vivado® HLS能够按照UNROLL编译指示指定的方式展开循环,应重新编写代码以删除k作为类成员。 222 | ```c++ 223 | template 224 | class foo_class { 225 | private: 226 | pe_mac mac; 227 | public: 228 | T0 areg; 229 | T0 breg; 230 | T2 mreg; 231 | T1 preg; 232 | T0 shift[N]; 233 | T0 shift_output; 234 | void exec(T1 *pcout, T0 *dataOut, T1 pcin, T3 coeff, T0 data, int col) 235 | { 236 | Function_label0:; 237 | int k; // Local variable 238 | #pragma HLS inline off 239 | SRL:for (k = N-1; k >= 0; --k) { 240 | #pragma HLS unroll // Loop will unroll 241 | if (k > 0) 242 | shift[k] = shift[k-1]; 243 | else 244 | shift[k] = data; 245 | } 246 | *dataOut = shift_output; 247 | shift_output = shift[N-1]; 248 | } 249 | *pcout = mac.exec1(shift[4*col], coeff, pcin); 250 | }; 251 | ``` -------------------------------------------------------------------------------- /Xilinx/UG902/Chapter-3-High-Level-Synthesis-Coding-Styles/CH3.6-Arrays.md: -------------------------------------------------------------------------------- 1 | ## 3.6 Arrays 2 | 在讨论编码风格如何影响综合后的数组实现之前,值得讨论一种情况,在这种情况下,即使在执行综合之前,例如在C仿真期间,数组也会引入问题。 3 | 4 | 如果指定非常大的数组,则可能导致C仿真用完内存并失败,如以下示例所示: 5 | ```c++ 6 | #include "ap_cint.h" 7 | 8 | int i, acc; 9 | // Use an arbitrary precision type 10 | int32 la0[10000000], la1[10000000]; 11 | 12 | for (i=0 ; i < 10000000; i++) { 13 | acc = acc + la0[i] + la1[i]; 14 | } 15 | ``` 16 | 仿真可能由于内存不足而失败,因为该数组放置在内存中存在的栈中,而不是由OS管理的堆中,并且可以使用本地磁盘空间进行增长。 17 | 18 | 这可能意味着设计在运行时内存不足,并且某些问题可能使该问题更有可能发生: 19 | - 在PC上,可用内存通常少于大型Linux boxes,并且可用内存可能更少。 20 | - 如上所示,使用任意精度类型会使此问题变得更糟,因为它们比标准C类型需要更多的内存。 21 | - 使用C++和SystemC中更复杂的定点任意精度类型可能会导致问题的发生,因为它们需要更多的内存。 22 | 23 | 在C/C ++代码开发中改善内存资源的标准方法是使用链接器选项,例如以下用于显式设置堆栈大小`-Wl,-stack,10485760`的选项)来增加堆栈的大小。这可以在Vivado® HLS中应用,方法是转到`Porject Settings → Simulation → Linker flags`,也可以将其作为Tcl命令的选项提供: 24 | ``` 25 | csim_design -ldflags {-Wl,--stack,10485760} 26 | cosim_design -ldflags {-Wl,--stack,10485760} 27 | ``` 28 | 在某些情况下,计算机可能没有足够的可用内存,并且增加堆栈大小无济于事。 29 | 30 | 解决方法是使用动态内存分配进行仿真,但使用固定大小的数组进行综合,如下面的示例所示。这意味着为此所需的内存在堆上分配,由操作系统管理,并且可以使用本地磁盘空间来增长。 31 | 32 | 对代码进行这样的更改并不理想,因为现在仿真的代码和综合的代码是不同的,但这可能是使设计过程前进的唯一方法。如果这样做,请确保C测试台涵盖了访问数组的所有方面。由`cosim_design`执行的RTL仿真将验证内存访问是否正确。 33 | ```c++ 34 | #include "ap_cint.h" 35 | 36 | int i, acc; 37 | #ifdef __SYNTHESIS__ 38 | // Use an arbitrary precision type & array for synthesis 39 | int32 la0[10000000], la1[10000000]; 40 | #else 41 | // Use an arbitrary precision type & dynamic memory for simulation 42 | int32 *la0 = malloc(10000000 * sizeof(int32)); 43 | int32 *la1 = malloc(10000000 * sizeof(int32)); 44 | #endif 45 | for (i=0 ; i < 10000000; i++) { 46 | acc = acc + la0[i] + la1[i]; 47 | } 48 | ``` 49 | :star: 注意:仅在要综合的代码中使用`__SYNTHESIS__`宏。不要在测试台使用这个宏,因为它不被C仿真或C RTL系统仿真支持。 50 | 51 | 数组通常在综合后实现为存储器(RAM,ROM或FIFO)。顶层函数接口上的数组被综合为访问外部存储器的RTL端口。在设计内部,大小小于1024的数组将合成为SRL。大小大于1024的数组将根据优化设置综合为Block RAM,LUTRAM,UltraRAM。 52 | 53 | 像循环一样,数组是一种直观的编码结构,因此经常在C程序中找到它们。与循环一样,Vivado HLS包含优化和指令,可用于优化其在RTL中的实现,而无需修改代码。 54 | 55 | 数组可能在RTL中造成问题的情况包括: 56 | - 数组访问经常造成性能瓶颈。当实现为内存时,**内存端口的数量将限制对数据的访问**。如果不仔细执行数组初始化操作,则可能导致RTL中的重置和初始化时间过长。 57 | - 必须小心确保将仅需要**读取访问权限**的数组实现为RTL中的**ROM**。 58 | 59 | Vivado HLS支持指针数组。每个指针只能指向一个标量或一个标量数组。 60 | 61 | :star: 注意:必须调整数组大小。例如,支持大小确定的数组,例如:Array [10];。但是,不支持大小不确定的数组,例如:Array [];。 62 | 63 | ### Array Accesses and Performance 64 | 以下代码示例显示了一种访问数组可能会限制最终RTL设计性能的情况。在此示例中,对数组mem[N]进行了三次访问以创建求和结果。 65 | ```c 66 | #include "array_mem_bottleneck.h" 67 | 68 | dout_t array_mem_bottleneck(din_t mem[N]) { 69 | dout_t sum=0; 70 | int i; 71 | SUM_LOOP:for(i=2;i 234 | void init_sin_table(din1_t sin_table[256]) 235 | { 236 | int i; 237 | for (i = 0; i < 256; i++) { 238 | dint_t real_val = sin(M_PI * (dint_t)(i - 128) / 256.0); 239 | sin_table[i] = (din1_t)(32768.0 * real_val); 240 | } 241 | } 242 | dout_t array_ROM_math_init(din1_t inval, din2_t idx) 243 | { 244 | short sin_table[256]; 245 | init_sin_table(sin_table); 246 | return (int)inval * (int)sin_table[idx]; 247 | } 248 | ``` 249 | 250 | :bulb: 提示:因为sin()函数的结果为常数,所以RTL设计中不需要内核即可实现sin()函数。 -------------------------------------------------------------------------------- /Xilinx/UG902/Chapter-3-High-Level-Synthesis-Coding-Styles/CH3.8-C-Builtin-Functions.md: -------------------------------------------------------------------------------- 1 | ## 3.8 C Builtin Functions 2 | Vivado HLS支持以下C内置函数: 3 | - __builtin_clz(unsigned int x):返回x中从最高有效位开始的前导0位的数目。如果x为0,则结果不确定。 4 | - __builtin_ctz(unsigned int x):返回x中从最低有效位开始的尾随0位的数量。如果x为0,则结果不确定。 5 | 6 | 以下示例显示了可以使用的这些函数。此示例返回in0中前导零和in1中尾后零的数量之和: 7 | ```c 8 | int foo (int in0, int in1) { 9 | int ldz0 = __builtin_clz(in0); 10 | int ldz1 = __builtin_ctz(in1); 11 | return (ldz0 + ldz1); 12 | } 13 | ``` -------------------------------------------------------------------------------- /Xilinx/UG902/FAQ.md: -------------------------------------------------------------------------------- 1 | - 为什么多次访问指针参数必须用volatile。指针在这里综合为什么电路? 2 | - -------------------------------------------------------------------------------- /Xilinx/UG902/images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/1.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/2-3-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/2-3-1.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/2-3-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/2-3-2.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/2-6-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/2-6-1.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/2.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/3.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/39.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/39.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/4.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/40.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/41.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/42.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/42.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/43.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/43.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/44.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/44.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/45.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/45.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/46.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/46.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/47.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/47.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/48.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/49.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/49.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/5.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/50.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/51.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/51.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/52.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/52.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/53.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/53.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/54.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/54.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/55.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/55.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/56.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/56.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/57.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/58.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/59.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/59.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/60.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/61.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/61.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/62.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/62.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/63.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/63.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/64.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/65.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/65.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/66.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/66.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/67.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/67.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/68.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/68.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/69.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/69.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/70.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/71.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/71.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/72.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/73.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/73.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/74.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/74.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/75.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/75.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/76.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/77.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/77.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/78.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/78.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/80.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/81.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/81.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/82.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/82.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/83.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/83.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/84.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/84.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/86.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/86.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/87.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/87.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/88.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/88.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/89.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/89.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/90.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/90.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/91.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/91.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/92.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/92.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/93.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/93.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/t10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/t10.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/t11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/t11.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/t12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/t12.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/t14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/t14.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/t15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/t15.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/t16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/t16.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/t17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/t17.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/t18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/t18.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/t19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/t19.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/t20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/t20.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/t21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/t21.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/t22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/t22.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/t23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/t23.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/t24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/t24.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/t25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/t25.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/t26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/t26.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/t34.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/t34.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/t40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/t40.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/t41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/t41.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/t42.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/t42.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/t43.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/t43.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/t44.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/t44.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/t45.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/t45.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/t7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/t7.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/t8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/t8.png -------------------------------------------------------------------------------- /Xilinx/UG902/images/t9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG902/images/t9.png -------------------------------------------------------------------------------- /Xilinx/UG998/CH1.md: -------------------------------------------------------------------------------- 1 | # Ch1 Introduction 2 | ## Overview 3 | 软件是所有应用程序的基础。无论是用于娱乐,游戏,通讯还是医学,当今人们使用的许多产品都是从软件模型或原型开始的。根据系统的性能和可编程性约束,软件工程师的任务是确定最佳的实施平台,以将项目推向市场。为了完成此任务,软件工程师将获得编程技术和各种硬件处理平台的帮助。 4 | 5 | 在编程方面,过去的几十年在面向对象的编程方面取得了进展,以实现代码重用和提高算法性能的并行计算范式。编程语言,框架和工具的进步使软件工程师能够快速原型化并测试解决特定问题的不同方法。快速建立解决方案原型的需求导致了两个有趣的问题。第一个问题,如何分析和量化一个算法相对于另一个算法的改进,在其他著作中进行了广泛讨论,而不是本指南的重点。第二个问题是在哪里执行算法,在本指南中提供有关现场可编程门阵列(FPGA)的解决方案。 6 | 7 | 关于在哪里运行算法,人们越来越关注并行化和并发性。尽管对并行和并行执行软件程序的兴趣不是新的,但处理器和专用集成电路(ASIC)设计的某些趋势有助于重新产生和增加兴趣。过去,软件工程师面临两种选择来从软件算法外获得更高的性能:定制集成电路或FPGA。 8 | 9 | 第一个也是最昂贵的选择是将算法交给硬件工程师进行定制电路实现。该选项的成本基于: 10 | - 电路制造成本 11 | - 将算法转换为硬件的时间 12 | 13 | 尽管制造工艺节点技术的进步已在功耗,计算吞吐量和逻辑密度方面取得了显着改善,但为应用制造定制集成电路或ASIC的成本仍然很高。在每个处理节点上,制造成本持续增加,以至于这种方法仅在经济上可行,对于运送上百万个单位的应用来说是可行的。 14 | 15 | 第二种选择是使用FPGA,它解决了ASIC制造固有的成本问题。FPGA使设计人员可以使用由基本可编程逻辑元件组成的现成组件来创建算法的定制电路实现。该平台节省了功耗,并具有较小制造节点的性能优势,而不会招致ASIC开发工作的成本和复杂性。与ASIC相似,在FPGA中实现的算法得益于定制电路的固有并行特性。 16 | 17 | ## Programming Model 18 | 硬件平台的编程模型是其采用的驱动因素之一。软件算法通常以C/C++或其他高级语言实现,从而抽象出计算平台的细节。这些语言允许快速迭代,增量改进和代码可移植性,这对于软件工程师而言至关重要。在过去的几十年中,以这些语言实现的算法的快速执行推动了处理器和软件编译器的发展。 19 | 20 | 最初,改善软件的运行时间是基于两个核心概念:提高处理器时钟频率和使用专用处理器。多年以来,通常的做法是等待一年的下一代处理器,以加快执行速度。在每个新的更高时钟频率下,软件程序都会运行得更快。尽管在某些情况下这是可以接受的,但对于大量的应用程序而言,通过处理器时钟频率提高速度并不足以将可行的产品推向市场。 21 | 22 | 对于此类应用程序,创建了专用处理器。尽管有许多专用处理器,例如数字信号处理器(DSP)和图形处理单元(GPU),但是所有这些处理器都能够执行以高级语言(例如C)编写的算法,并且具有功能特定的加速器,以改善其目标软件应用程序的执行。 23 | 24 | 随着最近标准和专用处理器设计的范式转变,两种类型的处理器都不再依赖时钟频率的增加来加快程序速度,并为每个芯片增加了更多的处理内核。多核处理器将程序并行化放在提高软件性能的技术的最前沿。现在,软件工程师必须以某种方式构造算法,以实现性能的高效并行化。算法设计所需的技术使用与FPGA设计相同的基本元素。FPGA和处理器之间的主要区别在于编程模型。 25 | 26 | 从历史上看,FPGA的编程模型集中于寄存器传输级别(RTL)描述而不是C/C++。尽管这种设计模型与ASIC设计完全兼容,但是它类似于软件工程中的汇编语言编程。图1-1显示了使用RTL作为设计方法的传统FPGA设计流程,它说明了编程模型的差异如何影响实现时间和不同计算平台可实现的性能。 27 | 28 | ![](./images/1-1.png) 29 | 30 | 如图1-1所示,在标准和专用处理器的项目设计周期中,相对较快地达到软件程序的初始工作版本。在初始工作版本之后,必须分配额外的开发工作以在任何实现平台上实现最大性能。 31 | 32 | 该图还显示了为FPGA平台开发相同软件应用程序所花费的时间。与标准处理器和专用处理器的相同阶段相比,应用程序的初始版本和优化版本均提供了显着的性能。RTL编码和FPGA优化的应用程序可实现最高性能。 33 | 34 | 但是,实现此实现所需的开发时间超出了典型软件开发工作的范围。因此,传统上仅将FPGA用于要求性能配置文件的应用程序,而这些性能配置文件是任何其他方式都无法实现的,例如具有多个处理器的设计。 35 | 36 | Xilinx®的最新技术进步消除了处理器和FPGA之间编程模型的差异。正如从C语言和其他高级语言到不同处理器体系结构的编译器一样,Xilinx Vivado®高级综合(HLS)编译器为面向Xilinx FPGA的C/C++程序提供了相同的功能。图1-2将Vivado HLS编译器的结果与软件工程师可用的其他处理器解决方案进行了比较。 37 | 38 | ![](./images/1-2.png) 39 | 40 | ## Guide Organization 41 | 对于同一C/C++应用程序,FPGA和其他处理器的性能之间存在显着差异。本指南的以下各章描述了这种巨大性能差异的原因,并介绍了Vivado HLS编译器的工作方式。 42 | 43 | ### Chapter 2: What is an FPGA? 44 | _第2章,什么是FPGA?_ 介绍了FPGA中可用的计算元素以及它们与处理器的比较方式。它涵盖了诸如FPGA存储器层次结构,逻辑元素以及这些元素如何相互关联等主题。 45 | 46 | ### Chapter 3: Basic Concepts of Hardware Design 47 | 处理器和FPGA的硬件之间的差异会影响每个目标的编译器的工作方式。*第3章,硬件设计的基本概念*涵盖了适用于FPGA和基于处理器的设计的基本硬件概念。了解这些概念有助于设计人员指导Vivado HLS编译器创建最佳处理架构。 48 | 49 | ### Chapter 4: Vivado High-Level Synthesis 50 | _第4章,Vivado高级综合_ 介绍了Xilinx Vivado HLS编译器。本节使用前两章的概念,介绍如何为FPGA编译C/C++程序。本章重点介绍编译器如何提取并行性,组织存储器以及在FPGA中连接多个程序。 51 | 52 | ### Chapter 5: Computation-Centric Algorithms 53 | 尽管有大量有关算法分析的文献,但以计算为中心的算法与以控制为中心的算法的细微差别在很大程度上取决于实现平台。_第5章,以计算为中心的算法_,为FPGA定义了以计算为中心的算法,并提供了示例和最佳实践建议。 54 | 55 | ### Chapter 6: Control-Centric Algorithms 56 | 以控制为中心的算法可以在处理器和FPGA上实现。实现的选择取决于算法所需的反应时间。_第6章,以控制为中心的算法_ 提供了以控制为中心的算法实现选项的概述,并提供了用于用户数据报协议(UDP)数据包处理的网络示例。 57 | 58 | ### Chapter 7: Software Verification and Vivado HLS 59 | 与所有编译器一样,Vivado HLS编译器输出的质量和正确性取决于输入软件。_第7章,软件验证和Vivado HLS_ 回顾了适用于Vivado HLS编译器的推荐软件质量技术。它提供了典型编码错误的示例及其对Vivado HLS编译的影响,以及每种问题的可能解决方案。它还包括有关无法在C级别完全验证程序行为时的处理方法的部分。 60 | 61 | ### Chapter 8: Integration of Multiple Programs 62 | 正如大多数处理器运行多个程序来执行一个应用程序一样,FPGA也可以构建多个程序或模块来执行一个特定的应用程序。_第8章,集成多个程序_ 描述了如何在FPGA中连接多个模块以及如何使用处理器控制这些模块。它着重介绍了Xilinx Zynq®-7000片上系统(SoC),该系统将FPGA架构与Arm® Cortex™-A9处理器结合在一起。通过使用消费者和生产者示例,本章还演示了完整的系统开发,集成和设计权衡。 63 | 64 | ### Chapter 9: Verification of a Complete Application 65 | 借助FPGA,完整的应用程序可以创建硬件系统。该系统可以在FPGA架构中具有一个或多个模块,以及在处理器上执行的代码。_第9章,完整应用程序的验证_ 提供建议和最佳实践,以确保目标应用程序正确执行。 66 | 67 | -------------------------------------------------------------------------------- /Xilinx/UG998/CH2.md: -------------------------------------------------------------------------------- 1 | # Ch2 What is an FPGA? 2 | ## Overview 3 | FPGA是一种集成电路(IC),可以在制造后针对不同的算法进行编程。现代FPGA器件包含多达200万个逻辑单元,可以配置这些逻辑单元以实现各种软件算法。尽管传统的FPGA设计流程比常规的IC更类似于处理器,但与IC的开发工作相比,FPGA具有明显的成本优势,并且在大多数情况下都具有相同的性能水平。与IC相比,FPGA的另一个优点是可以动态重新配置。该过程与在处理器中加载程序相同,可能会影响FPGA架构中可用的部分或全部资源。 4 | 5 | 使用Vivado®HLS编译器时,重要的是要对FPGA架构中的可用资源以及它们如何交互以执行目标应用程序有基本的了解。本章介绍了有关FPGA的基本信息,这是将Vivado HLS引导到任何算法的最佳计算架构所必需的。 6 | 7 | ## FPGA Architecture 8 | FPGA的基本结构由以下元素组成: 9 | - Look-up table (LUT): 该元素执行逻辑运算。 10 | - Flip-Flop (FF): 该寄存器元素存储LUT的结果。 11 | - Wires: 这些元素将元素相互连接。 12 | - Input/Output (I/O) pads: 这些物理上可用的端口将数据传入和传出FPGA。 13 | 14 | 这些元素的组合产生了如图2-1所示的基本FPGA架构。尽管此结构足以实现任何算法,但最终实现的效率受到计算吞吐量,所需资源和可达到的时钟频率等方面的限制。 15 | 16 | ![](./images/2-1.png) 17 | 18 | 当代的FPGA体系结构将基本元素与其他计算和数据存储模块结合在一起,从而增加了设备的计算密度和效率。在以下各节中讨论的这些其他元素是: 19 | - 嵌入式存储器用于分布式数据存储 20 | - 锁相环(PLL),用于以不同的时钟速率驱动FPGA架构 21 | - 高速串行收发器 22 | - 片外存储器控制器 23 | - 乘积块 24 | 25 | 这些元素的组合为FPGA提供了实现在处理器上运行的任何软件算法的灵活性,并产生了如图2-2所示的当代FPGA架构。 26 | 27 | ![](./images/2-2.png) 28 | 29 | ### LUT 30 | LUT是FPGA的基本构建块,能够实现N个布尔变量的任何逻辑功能。本质上,此元素是真值表,其中输入的不同组合实现了不同的功能以产生输出值。真值表的大小限制为N,其中N代表LUT的输入数量。对于一般的N输入LUT,该表访问的存储器位置数为: 31 | 32 | $$2^N \tag{Equation 2-1} $$ 33 | 34 | 它允许该表实现以下功能: 35 | 36 | $$2^{N^N} \tag{Equation 2-2} $$ 37 | 38 | > Note: A typical value for N in Xilinx FPGA devices is 6. 39 | 40 | LUT的硬件实现可以认为是连接到一组多路复用器的存储单元的集合。LUT的输入充当多路复用器上的选择器位,以在给定的时间点选择结果。请务必牢记这种表示形式,因为LUT既可以用作函数计算引擎,也可以用作数据存储元素。图2-3显示了LUT的功能示意图。 41 | 42 | ![](./images/2-3.png) 43 | 44 | ### Flip-Flop 45 | 触发器是FPGA架构内的基本存储单元。该元素始终与LUT配对,以辅助逻辑流水线和数据存储。触发器的基本结构包括数据输入,时钟输入,时钟使能,复位和数据输出。在正常操作期间,数据输入端口上的任何值都会在时钟的每个脉冲上锁存并传递到输出。时钟使能引脚的目的是允许触发器为一个以上的时钟脉冲保持特定值。**仅当时钟和时钟使能都等于1时,才锁存新的数据输入并将其传递到数据输出端口**。图2-4显示了触发器的结构。 46 | 47 | ![](./images/2-4.png) 48 | 49 | ### DSP Block 50 | Xilinx FPGA中可用的最复杂的计算模块是DSP模块,如图2-5所示。DSP模块是嵌入到FPGA架构中的算术逻辑单元(ALU),它由三个不同模块的链组成。DSP中的计算链由加/减单元组成,加/减单元连接到与最终加/减/累加引擎相连的乘法器。该链允许单个DSP单元实现以下形式的功能: 51 | 52 | $$ 53 | p=a \times(b+d)+c \tag{Equation 2-3} 54 | $$ 55 | 56 | 或 57 | 58 | $$ 59 | p+=a \times(b+d) \tag{Equation 2-4} 60 | $$ 61 | 62 | ![](./images/2-5.png) 63 | 64 | ### Storage Elements 65 | 66 | FPGA器件包括嵌入式存储元件,可用作随机存取存储器(RAM),只读存储器(ROM)或移位寄存器。这些元素是Block RAM(BRAM),UltraRAM块(URAMS),LUT和移位寄存器(SRL)。 67 | 68 | BRAM是一个双端口RAM模块,已实例化到FPGA架构中,以提供片上存储相对较大的数据集。设备中可用的两种BRAM存储器可以容纳18k或36k位。这些可用存储器的数量取决于设备。**这些存储器的双端口性质允许对不同位置进行并行,相同时钟周期的访问**。 69 | 70 | 就如何用C/C++代码表示数组而言,BRAM可以实现RAM或ROM。唯一的区别是何时将数据写入存储元素。在RAM配置中,可以在电路运行期间的任何时间读取和写入数据。相反,在ROM配置中,只能在电路运行期间读取数据。ROM的数据作为FPGA配置的一部分写入,不能以任何方式进行修改。 71 | 72 | UltraRAM块是双端口,同步288 Kb RAM,具有4,096位深和72位宽的固定配置。它们可在UltraScale+设备上使用,并且提供的存储容量是BRAM的8倍。 73 | 74 | 如前所述,LUT是一个小型存储器,在设备配置期间会在其中写入真值表的内容。由于Xilinx FPGA中LUT结构的灵活性,这些模块可用作64位存储器,通常称为分布式存储器。这是FPGA器件上可用的最快的一种存储器,因为可以在架构的任何部分中实例化它,以提高实现电路的性能。 75 | 76 | 移位寄存器是相互连接的寄存器链。该结构的目的是提供沿计算路径(例如使用过滤器)的数据重用。例如,基本滤波器由一系列乘法器组成,这些乘法器将数据样本与一组系数相乘。通过使用移位寄存器存储输入数据,内置的数据传输结构在每个时钟周期将数据样本移至链中的下一个乘法器。图2-6给出了一个移位寄存器示例。 77 | 78 | ![](./images/2-6.png) 79 | 80 | ## FPGA Parallelism Versus Processor Architectures 81 | 与处理器架构相比,构成FPGA架构的结构在应用程序执行中实现了高度的并行性。Vivado HLS编译器为软件程序生成的自定义处理体系结构呈现了不同的执行范例,在决定将应用程序从处理器移植到FPGA时必须考虑到这一点。为了检验FPGA执行范例的好处,本节简要回顾了处理器程序的执行。 82 | 83 | ### Program Execution on a Processor 84 | 不管处理器的类型如何,处理器都将其作为指令序列执行程序,这些指令序列转化为对软件应用程序有用的计算。该指令序列由处理器编译器工具(例如GNU编译器集合(GCC))生成,该工具将C/C++中表示的算法转换为处理器固有的汇编语言构造。处理器编译器的工作是采用以下形式的C函数: 85 | 86 | $$ 87 | Z=a+b \tag{Equation 2-5} 88 | $$ 89 | 90 | 并将其转换为汇编代码,如下所示: 91 | 92 | ![](./images/2-7.png) 93 | 94 | 图2-7中的汇编代码定义了加法运算,用于根据处理器的内部寄存器计算z的值。该代码指出,用于计算的输入值存储在寄存器R1和R2中,而计算的结果存储在寄存器R3中。该代码很简单,并且没有表达计算z值所需的所有指令。此代码仅在数据到达处理器后处理计算。因此,编译器必须创建其他汇编语言指令,以使用中央存储器中的数据加载处理器的寄存器,并将结果写回到存储器中。用于计算z值的完整汇编程序如下: 95 | 96 | ![](./images/2-8.png) 97 | 98 | 图2-8中的代码显示,即使是简单的操作(例如将两个值相加)也将导致多个汇编指令。每个指令的计算延迟在指令类型之间是不相等的。例如,根据a和b的位置,LD操作需要使用不同数量的时钟周期来完成。如果这些值在处理器缓存中,则这些加载操作将在几十个时钟周期内完成。如果这些值位于主双倍数据速率(DDR)内存中,则这些操作将花费数百至数千个时钟周期才能完成。如果这些值位于硬盘驱动器中,则加载操作将花费更长的时间才能完成。这就是为什么具有高速缓存命中跟踪的软件工程师花费大量时间来重组其算法,以增加内存中数据的空间局部性,从而提高高速缓存命中率并减少每条指令花费的处理器时间。 99 | 100 | > 重要信息:当在FPGA中实现相同的操作时,不需要软件工程师在重组算法以更好地适应可用处理器高速缓存时所需的工作水平。 101 | 102 | ### Program Execution on an FPGA 103 | 104 | FPGA是一种固有的并行处理结构,能够实现可以在处理器上运行的任何逻辑和算术功能。主要区别在于,用于将软件描述转换为RTL的Vivado HLS编译器不受高速缓存和统一内存空间的限制。 105 | 106 | > 注意:通常,1个LUT等效于1位计算。 107 | 108 | 用于z的计算的LUT仅限于此操作。与处理器(所有计算共享相同的ALU)不同,FPGA实现为软件算法中的每个计算实例化独立的LUT集。 109 | 110 | 除了在每次计算中分配唯一的LUT资源外,FPGA在存储器架构和存储器访问成本方面均不同于处理器。在FPGA实现中,Vivado HLS编译器将存储器安排到尽可能靠近操作使用点的多个存储库中。这导致瞬时内存带宽,远远超出了处理器的能力。例如,Xilinx Kintex®-7410T器件共有1,590个18k-bit BRAM可用。在存储器带宽方面,该器件的存储器布局为软件工程师提供了寄存器级每秒0.5M位和BRAM级每秒23T位的容量。 111 | 112 | 关于计算吞吐量和内存带宽,Vivado HLS编译器通过调度,流水线和数据流等过程,发挥了FPGA架构的功能。尽管这些过程对用户透明,但它们是软件编译过程不可或缺的阶段,可提取软件应用程序的最佳电路级实现。 113 | 114 | #### Scheduling 115 | **调度是识别数据并控制不同操作之间的依赖关系以确定每个操作何时执行的过程**。在传统的FPGA设计中,这是一个手动过程,也称为**并行化**软件算法以用于硬件实现。 116 | 117 | Vivado HLS分析相邻操作之间以及跨时间之间的依赖性。这使编译器可以对在同一时钟周期内执行的操作进行分组,并可以设置硬件以允许功能调用重叠。函数调用执行的重叠消除了处理器限制,该限制要求当前函数调用必须完全完成,然后才能开始对同一组操作的下一个函数调用。此过程称为流水线,在以下各节和其余各章中将详细介绍。 118 | 119 | #### Pipelining 120 | 流水线技术是一种数字设计技术,使设计人员可以避免数据依赖并提高算法硬件实现中的并行度。原始软件实现中的数据相关性为了功能上的等效而保留,但是所需的电路分为一系列独立的阶段。链中的所有级均在同一时钟周期内并行运行。唯一的区别是每个阶段的数据源。在前一个时钟周期内,计算的每个阶段都从前一阶段计算的结果中接收其数据值。例如,为了计算以下功能,Vivado HLS编译器实例化一个乘法器和两个加法器块: 121 | 122 | $$ 123 | y=(a \times x)+b+c \tag{Equation 2-6} 124 | $$ 125 | 126 | 图2-9显示了此计算结构以及流水线的影响。它显示了示例函数的两种实现。最重要的实现是无需流水线就可以计算结果y所需的数据路径。此实现的行为类似于相应的C/C++函数,因为在计算开始时必须知道所有输入值,并且一次只能计算一个结果y。底部的实现显示了同一电路的流水线版本。 127 | 128 | ![](./images/2-9.png) 129 | 130 | 图2-9中数据路径中的方框表示由FPGA架构中的触发器模块实现的寄存器。每个盒子可以算作一个时钟周期。因此,在流水线版本中,每个结果y的计算需要三个时钟周期。通过添加寄存器,可以将每个块及时隔离到单独的计算部分中。这意味着具有乘法器的部分和具有两个加法器的部分可以并行运行,并减少函数的总体计算延迟。通过并行运行数据路径的两个部分,该块实际上是在并行计算值y和y’,其中y’是下次执行公式2-6的结果。y的初始计算(也称为流水线填充时间)需要三个时钟周期。在此初始计算之后,每个时钟周期的输出处都会有一个新的y值,因为计算流水线包含当前和后续y计算的重叠数据集。 131 | 132 | 图2-10显示了流水线​​架构,其中原始数据(深灰色),半计算数据(白色)和最终数据(浅灰色)同时存在,并且每个阶段的结果都捕获在其自己的寄存器集中。因此,尽管这种计算的等待时间是多个周期,但是对于每个周期,都可以产生新的结果。 133 | 134 | ![](./images/2-10.png) 135 | 136 | #### Dataflow 137 | 138 | 数据流是另一种数字设计技术,其概念与流水线相似。数据流的目标是在粗粒度级别上表达并行性。在软件执行方面,此转换适用于单个程序中功能的并行执行。 139 | 140 | Vivado HLS通过基于程序的不同功能的输入和输出来评估程序不同功能之间的交互,从而提取出这种并行度。并行性最简单的情况是函数在不同的数据集上工作并且彼此不通讯。在这种情况下,Vivado HLS为每个功能分配FPGA逻辑资源,然后独立运行模块。在软件程序中,更复杂的情况是一种功能为另一种功能提供结果的情况。这种情况称为消费者生产者方案。 141 | 142 | Vivado HLS在消费者-生产者方案中支持两种使用模型。在首次使用模型中,生产者在消费者可以开始其操作之前创建一个完整的数据集。并行化是通过实例化一对配置为存储体ping和pong的BRAM存储器来实现的。在函数调用期间,每个函数只能访问一个存储体(ping或pong)。当开始新的函数调用时,HLS生成的电路将切换生产者和使用者的内存连接。这种方法保证了功能的正确性,但将可实现的并行性级别限制为跨函数调用。 143 | 144 | 在第二种使用模型中,消费者可以开始使用生产者的部分结果,并且可以实现的并行度扩展到包括函数调用中的执行。Vivado HLS生成的用于这两种功能的模块通过使用先进先出(FIFO)存储电路进行连接。该存储电路在软件编程中充当队列,可在模块之间提供数据级同步。在函数调用期间的任何时候,两个硬件模块都在执行其编程。唯一的例外是,使用者模块在开始计算之前会等待生产者提供一些数据。在Vivado HLS术语中,使用者模块的等待时间称为interval或initiation interval (II)。 145 | 146 | -------------------------------------------------------------------------------- /Xilinx/UG998/CH3.md: -------------------------------------------------------------------------------- 1 | # Ch3 Basic Concepts of Hardware Design 2 | ## Overview 3 | 处理器和FPGA之间的主要区别之一是处理体系结构是否固定。这种差异直接影响每个目标的编译器的工作方式。对于处理器,计算架构是固定的,编译器的工作是确定如何使软件应用程序最适合可用的处理结构。性能是应用程序与处理器功能的映射程度以及正确执行所需的处理器指令数量的函数。 4 | 5 | 相反,FPGA类似于带有一盒构建块的空白面板。Vivado® HLS编译器的工作是从最适合软件程序的构建块框中创建处理体系结构。指导Vivado HLS编译器创建最佳处理体系结构的过程需要有关硬件设计概念的基础知识。 6 | 7 | 本章介绍了适用于FPGA和基于处理器的设计的一般设计概念,并说明了这些概念之间的关系。本章不涉及FPGA设计的详细方面。与处理器编译器一样,Vivado HLS编译器将算法实现的底层细节处理到FPGA逻辑结构中。 8 | 9 | ## Clock Frequency 10 | 处理器时钟频率是确定特定算法的执行平台时首先要考虑的项目之一。常用的准则是时钟频率越高,算法的性能执行率越高。尽管这可能是在处理器之间进行选择的很好的第一规则,但实际上会产生误导,并可能导致设计人员在处理器和FPGA之间进行选择时做出错误的选择。 11 | 12 | 该一般指导原则产生误导的原因与处理器和FPGA之间的时钟频率标称差异有关。例如,比较处理器和FPGA的时钟频率时,面对表3-1中所示的比较并不少见。 13 | 14 | ![](./images/t3-1.png) 15 | 16 | 对表3-1中的值进行简单分析可能会误导设计人员,以为处理器的性能是FPGA的四倍。这种简单的分析错误地假设平台之间的唯一区别是时钟频率。但是,平台还有其他差异。 17 | 18 | 处理器和FPGA之间的**第一个主要区别**是软件程序的执行方式。处理器能够在通用硬件平台上执行任何程序。这个通用平台包括处理器的核心,并定义了必须安装所有软件的固定体系结构。具有对处理器体系结构的内在理解的编译器将用户软件编译为一组指令。结果指令集总是以相同的基本顺序执行,如图3-1所示。 19 | 20 | ![](./images/3-1.png) 21 | 22 | 无论处理器是标准处理器还是专用处理器,指令的执行总是相同的。用户应用程序的每条指令必须经历以下阶段: 23 | 24 | 1. Instruction fetch (IF) 25 | 2. Instruction decode (ID) 26 | 3. Execute (EXE) 27 | 4. Memory operations (MEM) 28 | 5. Write back (WB) 29 | 30 | 表3-2总结了每个阶段的目的。 31 | 32 | ![](./images/t3-2.png) 33 | 34 | 大多数现代处理器都包括指令执行路径的多个副本,并且能够以某种程度的重叠来运行指令。由于处理器中的指令通常相互依赖,因此指令执行硬件的副本之间的重叠并不完美。在最好的情况下,只有使用处理器引入的开销阶段可以重叠。负责应用程序计算的EXE阶段按顺序执行。顺序执行的原因与EXE阶段中有限的资源以及指令之间的依赖性有关。 35 | 36 | 图3-2显示了具有以半并行顺序执行的多个指令的处理器。对于所有指令都尽快执行的处理器来说,这是最好的情况。即使在这种最佳情况下,每个时钟周期处理器也仅限于一个EXE stage。这意味着用户应用程序每个时钟周期向前移动一个操作。即使编译器确定所有五个EXE阶段都可以并行执行,但是该处理器的结构将阻止它。 37 | 38 | ![](./images/3-2.png) 39 | 40 | FPGA不能在通用计算平台上执行所有软件。它一次在该程序的定制电路上执行一个程序。因此,更改用户应用程序将更改FPGA中的电路。与图3-1不同,在FPGA中进行处理时,EXE阶段如图3-3所示。MEM阶段的存在取决于应用程序。 41 | 42 | ![](./images/3-3.png) 43 | 44 | 有了这种灵活性,Vivado HLS编译器无需考虑平台中的开销阶段,而可以找到最大化指令并行性的方法。使用与图3-2相同的假设,图3-4显示了FPGA中相同软件的执行配置文件。 45 | 46 | ![](./images/3-4.png) 47 | 48 | 根据图3-2和图3-4的比较,FPGA与处理器相比具有9倍的标称性能优势。实际数字始终是特定于应用程序的,但是FPGA通常证明对于计算密集型应用程序,其性能至少是处理器的10倍。 49 | 50 | 仅关注时钟频率而隐藏的另一个问题是软件程序的功耗。功耗的近似值由下式给出: 51 | 52 | $$ 53 | P=\frac{1}{2} c F V^{2} \tag{Equation 3-1} 54 | $$ 55 | 56 | 如公式3-1所示,经验数据支持功耗与时钟频率之间的关系,对于相同的计算工作量,该数据显示处理器中的功耗高于FPGA。通过为每个软件程序创建自定义电路,FPGA能够以较低的时钟频率运行,并且各操作之间具有最大的并行度,而不需要在处理器中看到的指令解释开销。 57 | 58 | > 推荐:在处理器和FPGA之间进行选择时,**建议根据吞吐量和延迟时间而不是最大时钟频率来分析应用程序需求和计算工作量**。 59 | 60 | ## Latency and Pipelining 61 | 延迟是完成一条指令或一组指令以产生应用结果值所花费的时钟周期数。使用图3-1中所示的基本处理器体系结构,一条指令的等待时间为五个时钟周期。如果应用程序总共有5条指令,则此简单模型的总延迟为25个时钟周期。也就是说,直到25个时钟周期到期后,应用程序的结果才可用。 62 | 63 | 应用程序延迟是FPGA和处理器中的关键性能指标。在这两种情况下,都可以通过使用流水线解决延迟问题。在处理器中,流水线意味着下一条指令可以在当前指令完成之前启动执行。这允许指令集处理中所需的开销阶段重叠。图3-2显示了处理器流水线的最佳情况。通过重叠执行指令,处理器为五个指令应用程序实现了九个时钟周期的延迟。 64 | 65 | 在FPGA中,不存在与指令处理相关的开销周期。延迟是通过运行原始处理器指令的EXE阶段需要多少个时钟周期来衡量的。对于图3-3的情况,延迟为一个时钟周期。并行性在延迟中也起着重要作用。对于完整的五指令应用,FPGA延迟也是一个时钟周期,如图3-4所示。利用FPGA的一个时钟周期延迟,可能不清楚流水线为何具有优势。但是,在FPGA中进行流水线处理的原因与在处理器中进行流水处理的原因相同,即提高应用程序性能。 66 | 67 | 如前所述,FPGA是一片空白,带有构建模块,必须将其连接才能实现应用程序。Vivado HLS编译器可以直接或通过寄存器连接块。图3-5显示了使用5个构建块实现的图3-3中EXE阶段的实现。 68 | 69 | ![](./images/3-5.png) 70 | 71 | FPGA中的操作时序是信号从源寄存器传输到宿寄存器所花费的时间长度。假设图3-5中的每个构建块需要2 ns的时间来执行,当前设计需要10 ns的时间来实现该功能。等待时间仍然是一个时钟周期,但是时钟频率限制为100 MHz。100 MHz的频率限制来自FPGA中时钟频率的定义。对于FPGA电路,时钟频率定义为源寄存器和宿寄存器之间的最长信号传播时间。 72 | 73 | FPGA中的流水线是插入更多寄存器以将大型计算块分解为较小段的过程。计算的这种划分增加了绝对时钟周期数的等待时间,但是**通过允许定制电路以更高的时钟频率运行,从而提高了性能**。 74 | 75 | 图3-6显示了完成流水线操作后图3-5中处理体系结构的实现。**完整的流水线意味着在FPGA电路的每个构件之间插入一个寄存器**。寄存器的增加将电路的时序要求从10 ns降低到2 ns,从而导致最大时钟频率为500 MHz。此外,通过将计算分为单独的寄存器限制区域,每个块始终可以处于繁忙状态,这对应用程序吞吐量产生了积极影响。 76 | 77 | > 重要信息:流水线引起的延迟是在FPGA设计期间要考虑的权衡之一。 78 | 79 | ![](./images/3-6.png) 80 | 81 | ## Throughput 82 | 吞吐量是用于确定实现的整体性能的另一个指标。**它是处理逻辑接受下一​​个输入数据样本所花费的时钟周期数**。使用该值,重要的是要记住,电路的时钟频率会改变吞吐量数字的含义。 83 | 84 | 例如,图3-5和图3-6都显示了在输入数据样本之间需要一个时钟周期的实现。关键区别在于,图3-5中的实现在输入采样之间需要10 ns,而图3-6中的电路在输入数据采样之间仅需要2 ns。在知道了时基之后,很明显第二种实现具有更高的性能,因为它可以接受更高的输入数据速率。 85 | 86 | > 注意:在分析在处理器上执行的应用程序时,也可以使用本节中描述的吞吐量定义。 87 | 88 | ## Memory Architecture and Layout 89 | 所选实现平台的内存体系结构是可能影响软件应用程序性能的物理元素之一。内存体系结构确定了可实现性能的上限。在某个性能点上,无论可用计算资源的类型和数量如何,处理器或FPGA上的所有应用程序都将成为受内存限制的。FPGA设计中的一种策略是了解内存限制在何处以及如何受到数据布局和内存组织的影响。 90 | 91 | 在基于处理器的系统中,无论处理器的具体类型如何,软件工程师都必须在基本相同的内存体系结构上适应应用程序。这种共性简化了应用程序迁移过程,但以性能为代价。软件工程师熟悉的通用内存体系结构包括慢速,中速或快速存储器,具体取决于将数据发送到处理器所需的时钟周期数。这些存储器分类在表3-3中定义。 92 | 93 | ![](./images/t3-3.png) 94 | 95 | 该表中所示的存储体系结构假定为用户提供了一个大的存储空间。在此存储空间内,用户分配和释放分配区域以存储程序数据。数据的物理位置及其在层次结构中**不同级别之间的移动方式由计算平台处理**,并且**对用户透明**。在这种系统中,**提高性能的唯一方法是尽可能重用高速缓存中的数据**。 96 | 97 | 为了实现此目标,软件工程师必须花费大量时间来查看高速缓存trace,重组软件算法以增加数据局部性以及管理内存分配以最大程度地减少程序的瞬时内存占用量。尽管所有这些技术都可以跨处理器移植,但结果却并非如此。必须针对运行的每个处理器调整软件程序,以最大化性能。 98 | 99 | 凭借使用基于处理器的存储器的经验,软件工程师在FPGA中使用存储器时遇到的第一个区别是缺乏固定的片上存储器架构。基于FPGA的系统可以连接到慢速和中速存储器,但在可用快速存储器方面表现出最大程度的差异。也就是说,Vivado HLS编译器没有构建软件以最佳利用现有缓存,而是构建了一种快速存储架构,以最适合算法中的数据布局。最终的FPGA实现可以具有一个或多个不同大小的内部存储区,可以彼此独立地进行访问。 100 | 101 | 图3-7中的代码示例显示了解决程序内存需求的最佳实践建议。 102 | 103 | 由于缺乏动态内存分配,FPGA代码可能会使经验丰富的软件工程师感到惊讶。由于底层的固定内存架构,长期以来,动态内存分配的使用一直是基于处理器的系统的最佳实践准则的一部分。 104 | 105 | 与这种方法相比,Vivado HLS编译器构建了针对应用程序量身定制的内存体系结构。量身定制的存储器体系结构既取决于程序中存储块的大小,又取决于整个程序执行过程中如何使用数据。当前最先进的FPGA编译器(例如Vivado HLS)要求在编译时可以完全分析应用程序的内存需求。 106 | 107 | 静态内存分配的好处是Vivado HLS可以以不同的方式实现数组A的内存。根据算法中的计算,Vivado HLS编译器可以将A的存储器实现为寄存器,移位寄存器,FIFO或BRAM。 108 | 109 | > 注意:尽管动态内存分配受到限制,但Vivado HLS编译器完全支持指针。有关指针支持的详细信息,请参见第4章中的指针。 110 | 111 | ### Registers 112 | 存储器的寄存器实现是最快的可能的存储器结构。在这种实现方式中,A的每个条目都成为一个独立的实体。每个独立实体都嵌入到计算中,无需使用寻址逻辑或其他延迟逻辑即可使用。 113 | 114 | ### Shift Register 115 | 用处理器编程术语,可以将移位寄存器视为队列的一种特殊情况。在此实现中,A的**每个元素在计算的不同部分中多次使用**。移位寄存器的关键特性是,每个时钟周期都可以访问A的每个元素。另外,将所有数据项移动到下一个相邻的存储容器仅需要一个时钟周期。 116 | 117 | ### FIFO 118 | FIFO可被认为是具有单个入口点和单个出口点的队列。这种结构**通常用于在程序循环或函数之间传输数据**。不涉及寻址逻辑,并且实现细节由Vivado HLS编译器完全处理。 119 | 120 | ### BRAM 121 | BRAM是嵌入到FPGA架构中的随机存取存储器。Xilinx FPGA器件包括许多这些嵌入式存储器。确切的存储器数量取决于设备。用处理器编程的术语来说,这种存储器可以被认为是具有以下限制的高速缓存: 122 | - 不实现通常在处理器缓存中发现的缓存一致性,冲突和缓存未命中跟踪逻辑。 123 | - 仅在设备开机时才保留其值。 124 | - 支持对两个不同存储位置的并行相同周期访问。 125 | 126 | -------------------------------------------------------------------------------- /Xilinx/UG998/CH4.md: -------------------------------------------------------------------------------- 1 | # Ch4 Vivado High-Level Synthesis 2 | ## Overview 3 | Xilinx® Vivado® 高级综合(HLS)编译器提供的编程环境类似于可在标准和专用处理器上进行应用程序开发的环境。Vivado HLS与处理器编译器共享关键技术,用于解释,分析和优化C/C++程序。主要区别在于应用程序的执行目标。 4 | 5 | 通过将FPGA定位为执行结构,Vivado HLS使软件工程师能够针对吞吐量,功耗和延迟优化代码,而无需解决单个存储空间和有限计算资源的性能瓶颈。这允许将计算密集型软件算法实施到实际产品中,而不仅仅是功能演示者。本章介绍Vivado HLS编译器的工作方式以及与传统软件编译器的区别。 6 | 7 | 针对Vivado HLS编译器的应用程序代码使用与任何处理器编译器相同的类别。Vivado HLS按照以下方面分析所有程序: 8 | - Operations 9 | - Conditional statements 10 | - Loops 11 | - Functions 12 | 13 | 重要信息:Vivado HLS可以编译几乎所有C/C++程序。Vivado HLS的唯一编码限制是使用具有单个内存空间的处理器中典型的动态语言结构。使用Vivado HLS时,要考虑的主要动态结构是本章所述的内存分配和指针。 14 | 15 | ## Operations 16 | 操作指的是计算结果值所涉及的应用程序的算术和逻辑组件。此定义有意**排除比较语句**,因为它们在条件语句中处理。 17 | 18 | 在进行操作时,Vivado HLS与其他编译器之间的主要区别在于对设计器的限制。对于处理器编译器,固定的处理体系结构意味着用户只能通过限制操作依赖性和操纵内存布局以最大程度地提高缓存性能来影响性能。相反,Vivado HLS不受固定处理平台的限制,而是基于用户输入构建特定于算法的平台。如本节中的示例所示,这使HLS设计人员可以在吞吐量,延迟和功耗方面影响应用程序性能。 19 | 20 | 图4-1显示了在结果F[i]的计算中涉及的三个操作的集合。 21 | 22 | ![](./images/4-1.png) 23 | 24 | 使用处理器,生成的执行配置文件类似于图4-2。此应用程序配置文件仅关注中央处理器(CPU)中指令处理的EXE阶段。这是指令处理中处理器和FPGA之间共享的唯一阶段。在此示例中,执行跟踪是顺序的是因为执行平台而不是算法。基于该算法,可以以任意顺序或同时计算A[i]和D[i]的值。唯一的算法限制是这两个值必须在F[i]之前计算。 25 | 26 | ![](./images/4-2.png) 27 | 28 | 图4-3显示了使用Vivado HLS中的默认设置将图4-1中的代码编译到FPGA的结果。生成的执行配置文件与处理器的执行配置文件相似,因为乘法和加法按顺序发生。此默认行为的原因是最大程度地减少了实现用户应用程序所需的构件数量。尽管FPGA没有固定的处理体系结构,但是每个设备都具有可支持的最大数量的构建块。因此,设计人员可以评估FPGA资源,应用性能和每个器件的应用数量。 29 | 30 | ![](./images/4-3.png) 31 | 32 | 即使具有默认行为,由于为算法创建的自定义内存体系结构,该实现也优于处理器执行。在处理器上,阵列A,B,C,D,E和F存储在单个内存空间中,一次只能访问一个。相反,HLS检测这些存储器并为每个阵列创建一个独立的存储体,这导致阵列B和阵列C的读取操作之间出现重叠。 33 | 34 | 在时钟周期1中对阵列E的读取操作的调度显示了Vivado HLS的自动资源优化之一。对于存储器操作,Vivado HLS分析包含数据的存储体,以及在计算过程中消耗该值的位置。尽管阵列E的读取可以在时钟周期0内进行,但Vivado HLS会自动将存储器操作尽可能地靠近消耗数据的位置,以减少电路中的临时数据存储量。因为使用E值的乘法器要到时钟周期2才运行,所以安排读取访问的发生要早于时钟周期1没有好处。 35 | 36 | Vivado HLS帮助用户控制生成的电路大小的另一种方法是通过提供用于变量大小确定的数据类型。与所有编译器类似,Vivado HLS为用户提供对整数,单精度和双精度数据类型的访问。这样可以将软件快速移植到FPGA上,但可以掩盖算法效率低下的问题,这是处理器中可用的32位和64位数据路径的结果。 37 | 38 | 例如,假设图4-1中的代码仅需要数组B,C和E中的20位值。在原始处理器代码中,这些位大小将要求数组A,D和F能够存储64位值,以避免精度损失。Vivado HLS可以按原样编译代码,但是这会导致效率低下的64位数据路径消耗的资源比算法所需的资源更多。 39 | 40 | 图4-4显示了如何使用Vivado HLS任意精度数据类型重写图4-1中的代码的示例。通过使用这些数据类型,可以快速进行软件级的探索,并验证算法正确性所需的最低精度。除了减少实现计算所需的资源数量之外,使用任意精度的数据类型还可以减少完成操作所需的逻辑级别。反过来,这减少了设计的等待时间。 41 | 42 | ![](./images/4-4.png) 43 | 44 | 如第3章“硬件设计的基本概念”,流水线化或将计算划分为较小的寄存器绑定区域,这是实现目标时钟频率的基本FPGA设计技术。根据操作的大小,此优化由Vivado HLS自动执行。Vivado HLS将大型操作划分为多个计算阶段,并相应增加了电路等待时间。 45 | 46 | ## Conditional Statements 47 | 条件语句是程序控制流语句,通常以if,if-else或case语句的形式实现。这些编码结构是大多数算法不可或缺的一部分,并被包括HLS在内的所有编译器完全支持。编译器之间的唯一区别是如何实现这些类型的语句。 48 | 49 | 使用处理器编译器,条件语句将转换为可能会或可能不会导致上下文切换的分支操作。引入分支会影响到接下来要从内存中提取哪个指令的依赖关系,从而破坏了图3-2中所示的最大指令执行包。这种不确定性导致处理器执行流水线中出现气泡,并直接影响程序性能。 50 | 51 | 在FPGA中,条件语句对性能的潜在影响与在处理器中的影响不同。Vivado HLS创建条件语句的每个分支所描述的所有电路。因此,条件软件语句的运行时执行涉及两个可能结果之间的选择,而不是上下文切换。 52 | ## Loops 53 | 循环是表达迭代计算的通用编程结构。一种常见的误解是在使用像HLS这样的编译器时不支持循环。尽管对于FPGA的早期编译器来说可能是这样,但HLS完全支持循环,甚至可以进行超出标准处理器编译器能力的转换。图4-5显示了一个简单循环的示例。 54 | 55 | ![](./images/4-5.png) 56 | 57 | 出于说明目的,假设该循环每次迭代花费四个时钟周期,而与实现平台无关。在处理器上,编译器被迫按顺序调度循环迭代,总共运行40个周期,如图4-6所示。 58 | 59 | ![](./images/4-6.png) 60 | 61 | HLS没有此限制。因为HLS为算法创建了硬件,所以它可以通过流水线化迭代来更改循环的执行配置文件。循环迭代流水线将操作并行化的概念从循环迭代内扩展到跨迭代。 62 | 63 | 为了减少迭代等待时间,Vivado HLS进行的第一个自动优化是将**运算符并行化到循环迭代主体**。第二个优化是**循环迭代流水线**。这种优化需要用户输入,因为它会影响FPGA实现的资源消耗和输入数据速率。 64 | 65 | **HLS的默认行为是按照与处理器相同的调度执行循环**,如图4-6所示。这意味着图4-5中的代码的处理等待时间为40个周期,输入数据速率为每4个周期一次。在此示例中,输入数据速率由可以从输入中采样B和C值的速度定义。 66 | 67 | HLS可以并行化或流水线化循环的迭代,以减少计算延迟并增加输入数据速率。用户通过设置循环初始化间隔(II)来控制迭代流水线的级别。循环的II指定连续循环迭代的开始时间之间的时钟周期数。图4-7显示了将II的值设置为1后得到的循环调度。 68 | 69 | ![](./images/4-7.png) 70 | 71 | 为了获得此结果,HLS分析了循环迭代0和1之间的数据依赖性和资源争用,并自动解决了以下问题: 72 | - 为了解决数据依赖性,HLS更改了循环主体中的操作之一,或向用户查询算法更改。 73 | - 为了解决资源争用,HLS实例化资源的更多副本或向用户查询算法更改。 74 | 75 | 表4-1总结了循环流水线对执行特性的影响。 76 | 77 | ![](./images/t4-1.png) 78 | 79 | ## Functions 80 | 函数是一个编程层次结构,可以包含运算符,循环和其他函数。HLS和处理器编译器中的函数处理都类似于循环。 81 | 82 | 在HLS中,循环和函数之间的主要区别与术语有关。HLS可以并行化循环和函数的执行。对于循环,这种转换通常称为流水线,因为运算符和循环迭代之间存在明显的层次结构差异。使用函数,循环主体外部和循环内部的操作在同一层次结构上下文中,如果使用术语流水线操作,则可能导致混乱。为了避免在使用HLS时可能出现的混乱,将函数调用执行的并行化称为**数据流优化**。 83 | 84 | 数据流优化指示HLS为给定程序层次结构的所有功能创建独立的硬件模块。这些独立的硬件模块能够在数据传输期间并发执行和自同步。 85 | 86 | ## Dynamic Memory Allocation 87 | 动态内存分配是C和C++编程语言中可用的内存管理技术之一。用这种方法,用户可以在程序运行时分配必要的内存。分配的内存大小可以在程序执行之间变化,并且可以从第3章“硬件设计的基本概念”中所述的中央物理内存池中分配。表4-2中显示了通常与动态内存分配关联的函数调用。 88 | 89 | ![](./images/t4-2.png) 90 | 91 | 如第3章“硬件设计的基本概念”中所述,FPGA没有HLS编译器必须适合用户应用程序的固定存储器架构。取而代之的是,HLS根据算法的独特要求来合成内存体系结构。因此,提供给HLS编译器以在FPGA中实现的所有代码**必须仅使用编译时可分析的内存分配**。 92 | 93 | 为了帮助用户确保提供给HLS的所有代码都是可综合的,编译器在分析设计之前执行了编码合规检查。此代码合规性标记会标记所有不适用于HLS的编码样式。**用户负责手动更改代码并删除所有动态内存分配实例**。 94 | 95 | 图4-8中的代码在内存中分配了一个区域,用于存储10个32位的值。 96 | 97 | ![](./images/4-8.png) 98 | 99 | 尽管此编码示例明确声明了恒定的内存分配,但HLS代码合规性阶段并未分析malloc语句的内容。即使分配是恒定的,HLS也不能综合包含表4-2中任何关键字的代码,如图4-8所示的示例。有两种修改此代码以符合HLS的可能方法。以下代码示例演示了这些方法,并说明了它们对FPGA实现的影响。 100 | 101 | 图4-9中的代码显示了C/C++程序自动进行的内存分配。HLS严格按照C/C++规定的行为来实现此内存样式。这意味着为存储数组A而创建的内存仅在包含该数组的函数调用期间存储有效数据值。因此,**函数调用负责在每次使用前用有效数据填充A**。 102 | 103 | ![](./images/4-9.png) 104 | 105 | 图4-10中的代码显示了C/C++程序的静态内存分配。这种类型的内存分配行为表明,数组A的内容在函数调用之前有效,直到程序完全关闭为止。使用HLS时,只要电路有电,为数组A实现的内存就包含有效数据。 106 | 107 | ![](./images/4-10.png) 108 | 109 | 自动和静态内存分配技术都可以增加处理器上运行的算法的总体软件内存占用量。在C/C++中为FPGA实现指定算法时,最重要的考虑因素是用户应用程序的总体目标。也就是说,编译为FPGA时的主要目标不是创建最佳的软件算法实现。相反,当使用类似HLS的工具时,目标是以一种允许工具推断出最佳硬件架构的方式来捕获算法,从而实现最佳实施。 110 | ## Pointers 111 | 指针是内存中某个位置的地址。C/C++程序中指针的一些常见用法是函数参数,数组处理,指向指针的指针和类型转换。这种语言结构的固有灵活性使其成为C/C++代码的有用且流行的元素。**HLS编译器支持可以在编译时进行完整分析的指针用法**。**可分析的指针用法是可以在笔和纸计算中完全表达和计算的用法,而无需运行时信息**。 112 | 113 | 图4-8中的代码显示了如何使用指针来引用内存中动态分配的区域。如前所述,HLS不支持此用法,**因为仅在程序执行期间才知道指针的目标地址**。这并不意味着在使用HLS编译器时不支持将指针用于内存管理。图4-11显示了一种有效的编码样式,其中使用了指针来访问内存。 114 | 115 | ![](./images/4-11.png) 116 | 117 | 该代码有效,因为可以分析指针pA的所有使用并将其映射回数组A。由于数组A是通过自动内存分配创建的,因此HLS可以完全确定A的属性。 118 | 119 | **内存和指针的另一个受支持模型是访问外部内存**。使用HLS时,对函数参数的任何指针访问都意味着变量或外部存储器。HLS将外部存储器定义为编译器生成的RTL范围之外的任何存储器。这意味着该存储器可能位于FPGA的另一个函数中,或者位于片外存储器(例如DDR)的一部分中。 120 | 121 | 在图4-12所示的代码中,函数foo是HLS的顶层模块,以data_in作为参数。基于对data_in的多指针访问,HLS推断此功能参数是外部存储模块,必须通过硬件级别上的总线协议对其进行访问。诸如高级可扩展接口(AXI)协议之类的总线协议指定了多个功能如何相互连接和通信。 122 | 123 | ![](./images/4-12.png) 124 | -------------------------------------------------------------------------------- /Xilinx/UG998/CH5.md: -------------------------------------------------------------------------------- 1 | # Ch5 Computation-Centric Algorithms 2 | ## Overview 3 | 尽管关于算法分析的文献很多,但以计算为中心的算法与以控制为中心的算法的细微差别在很大程度上取决于实现平台。本章在Vivado® HLS编译器和FPGA的上下文中定义了以计算为中心的算法。它还包括示例和最佳实践建议,以最大程度地提高HLS生成的实现的性能。 4 | 5 | 以计算为中心的算法是为每个任务配置一次的算法,并且在任务持续时间内无法更改其行为。硬件中的任务与C/C++程序中的函数调用相同。任务的大小在HLS用户的控制下。 6 | 7 | > 推荐:通常,建议任务的大小基于算法中的自然工作划分。 8 | 9 | 图5-1显示了Sobel边缘检测操作的代码。这是一个以计算为中心的算法的示例,该算法可以分为不同大小的任务。此算法是二维滤波操作,它通过计算x和y方向上每个像素的梯度来计算图像中区域的边缘。如目前所写,此代码可以由HLS编译为FPGA实现。 10 | 11 | 为了适当地优化该算法,设计人员必须首先确定任务的大小。任务的大小决定了需要配置生成硬件模块的频率以及接收新一批数据的频率。图5-2和图5-3显示了图5-1中代码的两个可能的任务定义。另一种选择是将图5-1中的代码定义为任务。 12 | 13 | 任务选择2(图5-2)创建仅用于梯度计算的硬件模块。梯度计算在3x3像素窗口上工作,不支持线或图像帧的概念。该选择的问题是该选择执行的工作量与算法的自然工作分配之间的不匹配。Sobel边缘检测可在完整图像范围内使用。这意味着对于任务大小的选择,设计人员必须确定如何将图像划分为使用HLS构建的任务处理器所需的3x3像素切片。需要处理器或其他硬件模块来完成算法的功能。 14 | 15 | ![](./images/5-2.png) 16 | 17 | 任务选择3(图5-3)处理每个任务的完整像素行。这是对“任务选择1”的改进,因为它需要更少的附加模块来实现算法的完整功能。这种方法还将与控制处理器的交互减少到每行一次。将任务的大小设置为一次只能处理一行的问题在于,基础操作需要多行来计算结果。通过这种选择,可能需要一种复杂的控制机制来将图像行排序到HLS生成的硬件模块中。 18 | 19 | ![](./images/5-3.png) 20 | 21 | 任务选择1(图5-1)是此算法的最佳选择,因为它与图5-1所示代码中表示的每个函数调用的完整图像匹配。该选择是一项以计算为中心的任务,因为在图像帧的持续时间内,生成的FPGA实现的配置是固定的。可以在帧之间更改已处理图像的大小,但不能在任务开始后更改。 22 | 23 | 确定适当的任务大小后,用户必须使用HLS编译器选项优化算法实现。对于图5-1中的代码,FPGA实现具有每秒60帧的1080像素的目标图像大小。这转化为硬件模块,该模块能够以150 MHz的时钟频率处理1920x1080像素,每个时钟周期的输入数据速率为1像素。 24 | 25 | ## Data Rate Optimization 26 | 27 | 在HLS编译器中,代码优化从基线编译开始。**基准编译的目的是确定实现瓶颈位于何处**,并设置一个基准点来衡量不同优化的效果。基准编译使用最少的FPGA资源和最低的输入数据速率构建算法实现。在本章的示例中,基线编译导致每40个时钟周期1个像素的输入数据速率。 28 | 29 | 使用HLS编译器时,流水线优化是增加输入数据速率和所生成实现中并行度的方法。如第2章所述,什么是FPGA?在第3章“硬件设计的基本概念”中,流水线将大型计算划分为可以并行执行的较小阶段。当应用于循环时,流水线设置循环的启动间隔(II)。 30 | 31 | 循环II通过影响开始i+1迭代所需的时钟周期数来控制循环的输入数据速率。设计人员可以选择在算法代码中将流水线优化应用到何处。图5-4显示了流水线编译指示在窗口计算中的应用。 32 | 33 | > 注意:有关HLS编译器中可用的编译指示的详细信息,请参见《 Vivado Design Suite用户指南:高级综合(UG902)[参考1]》。 34 | 35 | ![](./images/5-4.png) 36 | 37 | 图5-4中的示例显示了作为编译器编译指示直接应用到算法源中的流水线优化。在此级别的代码中,流水线编译指示的作用是每个时钟周期在3x3过滤器窗口中计算一个字段。因此,需要9个时钟周期来计算3x3窗口中的乘法,以及一个额外的时钟周期才能生成结果像素。在应用程序级别上,这意味着输入采样率每10个时钟周期变为1个像素,这不足以满足应用程序要求。 38 | 39 | 图5-5显示了流水线​​编译指示在j循环中的应用,该循环跨越了图像的各列。通过在此循环上应用管道编译指示,HLS实现可以在每个时钟周期输入数据速率达到1个像素。为了获得新的输入数据速率,编译器首先完全展开窗口计算循环,以便所有梯度乘法可以并行发生。展开过程会实例化其他硬件,并将每个时钟周期对输入映像的存储带宽要求增加到九个存储操作。 40 | 41 | ![](./images/5-5.png) 42 | 43 | 尽管HLS编译器可以检测到需要比算法中表示的更高的内存带宽,但编译器无法自动引入影响算法正确性的任何更改。在此示例中,超出HLS生成的模块范围的内存无法满足流水线优化所需的九个并发内存访问。 44 | 45 | 无论外部存储器上的端口数量如何,由HLS生成的模块只能连接到一个端口,该端口每个时钟周期只能进行一次事务。因此,必须修改算法,以将内存带宽要求从模块输入端口移到由HLS编译器生成的内存。该内部存储器类似于处理器中的高速缓存。对于像Sobel边缘检测这样的图像处理算法,此本地内存称为行缓冲区。 46 | 47 | 行缓冲器是一个多bank内部存储器,可为生成的实现提供每个时钟周期同时访问来自三个不同行的像素。在开始任何计算之前,实现行缓冲区的算法必须分配时间,以用足够的数据填充结构来满足计算需求。这意味着要满足每个计算结果九次访问的存储要求,该算法必须考虑通过行缓冲区的数据移动以及算法更改所产生的额外带宽。 48 | 49 | 图5-6显示了图像像素通过行缓冲区的移动。 50 | 51 | ![](./images/5-6.png) 52 | 53 | 浅灰色框表示此存储结构当前存储的像素。该块的目的是仅存储功能正确性所需的最小像素数,而不是存储整个图像。如前所述,此存储结构的添加在输入像素采样和输出像素计算之间引入了延迟。对于3x3窗口操作,例如在图5-5中所示的代码中,行缓冲区必须存储两条完整的图像行和第三行的前三个像素,然后才能计算出第一个输出像素。深灰色和黑色框表示此延迟。黑框突出显示从源图像写入下一个输入像素的位置。深灰色框显示当前计算的像素在输出图像中的位置。 54 | 55 | HLS使用来自FPGA架构的BRAM资源来实现线路缓冲区。这些双端口存储元件布置在存储体中,其中一个存储体对应于一条线。因此,可用于算法计算的存储器带宽**从每个时钟周期原始的1个像素增加到每个时钟周期3个像素,增加了三倍**。这仍然不足以满足每个时钟周期9个像素的要求。 56 | 57 | 为了满足每个时钟9像素的要求,设计人员除了行缓冲器外,还必须在算法源代码中添加一个内存窗口。存储器窗口是使用FPGA架构中的FF资源实现的存储元素。该存储器中的每个寄存器都可以独立于所有其他寄存器访问,并且可以同时访问。从逻辑上讲,由FF元素组成的内存可以采用最适合C/C++算法描述的任何形状。 58 | 59 | 图5-7显示了Sobel边缘检测算法的存储器窗口。 60 | 61 | ![](./images/5-7.png) 62 | 63 | 灰色的中心像素突出显示要为其计算梯度的像素。黑柱表示行缓冲器提供的3个像素。在每个时钟周期,窗口的内容向左移动,以便为行缓冲区中的新列腾出空间。窗口内存的数据重用和分布式实现提供了算法所需的九种内存操作。该存储器不会在设计中引入额外的延迟。窗口数据移动操作与行缓冲区的操作同时发生。 64 | 65 | 图5-8显示了通过分层存储体系结构从输入到计算的整个数据移动。 66 | 67 | ![](./images/5-8.png) 68 | 69 | 图5-9显示了实现分层内存体系结构所需的算法代码更改。这种分层的体系结构允许HLS生成的实现实现每时钟周期1像素的输入数据速率。在此代码示例中,算法的计算内核位于sobel_operator函数中。此代码的主要变化是行循环和列循环分别扩展了一个迭代。此扩展解决了行缓冲区引入的额外任务执行时间。另外,通过基于原始图像边界的if条件来保护对行缓冲区的写入操作。该算法的输出写操作基于输出图像的位置,该位置与原始图像有1行1列的偏移。 70 | 71 | 如图5-9所示,以计算为中心的应用程序可以具有for循环,if-else语句等形式的嵌入式控制语句。这种算法的关键特征是其功能和行为在任务持续时间内是固定的。HLS生成的模块根据给定的配置处理一批数据。可以在每个任务之间更改配置,但不能在任务期间更改。 72 | 73 | > 提示:行缓冲区操作库是HLS编译器提供的视频库的一部分。有关更多信息,请参见《 Vivado设计套件用户指南:高级综合(UG902)[参考1]》。 74 | 75 | ![](./images/5-9.png) 76 | 77 | -------------------------------------------------------------------------------- /Xilinx/UG998/CH6.md: -------------------------------------------------------------------------------- 1 | # Ch6 Control-Centric Algorithms 2 | ## Overview 3 | 以控制为中心的算法是一种可以在任务执行期间根据系统级因素进行更改的算法。以计算为中心的算法在任务持续时间内将相同的运算应用于所有输入数据值,而以控制为中心的算法则根据当前输入端口状态确定其运算。本章介绍了使用Vivado® HLS编译器优化这些类型的应用程序的最佳实践。 4 | ## Expressing Control in C/C++ 5 | 在描述最佳实践之前,重要的是要回顾如何用C和C ++语言表达控制。 6 | 7 | ### Loops 8 | 循环是用于表达迭代计算的基本编程构造。像所有编译器一样,HLS允许将循环表示为for循环,while循环和do-while循环。用Vivado HLS编译的所有类型的应用程序都支持此构造。如第5章以计算为中心的算法中的Sobel边缘检测示例所示,循环对于C/C++中的计算密集型算法至关重要。 9 | 10 | 图6-1显示了for循环的示例以及Vivado HLS编译的效果。它说明了Vivado HLS编译如何在单个FPGA实现中生成计算和控制逻辑。与上一代用于FPGA结构的代码编译器不同,Vivado HLS编译器不区分控制和计算语言结构。对于该图中的代码,HLS为循环中的数学运算生成流水线式数据路径。这种实现通过在循环迭代之内和之间并行化计算来减少执行延迟。除此逻辑外,Vivado HLS实现还嵌入了循环控制器逻辑。回路控制器逻辑指示执行硬件多少次以计算y的值。 11 | 12 | ![](./images/6-1.png) 13 | 14 | ### Conditional Statements 15 | 在C和C ++中,条件语句通常表示为if-else语句。在硬件实现中,这将基于触发值在两个结果或两个执行路径之间做出选择。这种有用的结构使设计人员可以在变量或功能级别上对算法进行控制。HLS编译器完全支持这两种用例。 16 | 17 | 图6-2显示了if-else语句的示例,其中if语句在算法中的两个不同函数之间进行选择。Vivado HLS编译器生成的实现为function_a和function_b分配FPGA资源。这两个硬件电路都是并行运行的,**并且在相同的时钟周期内进行平衡以产生结果**。原始源代码中的条件触发器用于在两个计算结果之间进行选择。 18 | 19 | ![](./images/6-2.png) 20 | 21 | ### Case Statements 22 | Case语句根据输入变量的值定义程序中特定的操作或事件序列。尽管此构造可用于以计算为中心的算法,但在以控制为中心的应用程序中更为普遍,在这些应用程序中,系统级别的更改直接影响模块的执行。同样,在大多数使用模型中,case语句明确定义了从一个程序控制区域到另一个程序控制区域的过渡。 23 | 24 | 图6-3显示了一个示例case语句以及使用Vivado HLS进行编译的结果。编译器将case语句转换为硬件有限状态机(FSM)。FSM的数组表示状态之间的转换,并与代码样本中的大小写转换相对应。FSM中的每个状态还包括程序控制区域内的计算逻辑。 25 | 26 | ![](./images/6-3.png) 27 | 28 | ### Control System Classification 29 | 30 | 使用代码构造以控制为中心的应用程序之后,设计人员面临的下一个决定是在其上运行应用程序的平台。在过去,处理器通常被选为最合适的平台。正如Zynq®-7000SoC所展示的,在许多用例中,处理器是最佳选择。但是,HLS编译器消除了状态机优化和复杂性的问题,这是在FPGA架构中实现控制算法的瓶颈。设计人员可以选择在处理器上运行相同的控制算法,或者作为FPGA架构中由HLS生成的客户控制器运行。然后,根据算法响应时间要求和FPGA架构资源的消耗在这些选项之间进行选择。 31 | 32 | 表6-1显示了按对外部事件的响应时间分类的控制算法。 33 | 34 | ![](./images/t6-1.png) 35 | 36 | 对于需要非常慢的响应时间的设计,最佳的实现选择是处理器。这种选择为将以计算为中心的算法编译到FPGA架构中提供了更多空间。图6-4显示了一个具有非常慢的控制响应时间的系统的示例。 37 | 38 | ![](./images/6-4.png) 39 | 40 | 对于要求中等速度的设计(如慢速或中等类别所示),实现选择可以是更多的处理器,也可以是FPGA结构中的定制逻辑。在这些情况下,控制算法具有关键功能,必须将其实现为硬件模块。对于这些类型的系统,硬件协处理器的目的是弥补控制处理器中的通信延迟或处理速度不足。图6-5显示了一个需要硬件协同处理元素的系统的示例。 41 | 42 | ![](./images/6-5.png) 43 | 44 | 以控制为中心的应用程序的最后一类是快速响应时间类别。此类别是指要求响应时间和计算吞吐量高于处理器所能提供的控制应用程序。自从引入HLS编译器以来,属于该类别的算法范围已经扩大。例如,越来越多地使用HLS编译器来生成Zynq-7000 SoC的处理器加速器模块。 45 | 46 | ## UDP Packet Processing 47 | 用户数据报协议(UDP)是计算机联网应用程序中使用的无状态数据传输协议。该协议不能保证数据包传送,也不能处理丢失的数据包恢复。相反,它在有线或无线通道上尽可能快地传输数据包。该协议可实现的数据速率使其成为Internet电话,视频流和其他应用程序的标准,在这些应用程序中,数据速率比接收传输中的每个数据包都重要。 48 | 49 | 尽管此协议不能跟踪数据包的传送和状态,但它仍然是一个以控制为中心的应用程序。UDP数据包处理器的控制方面包括: 50 | - 以线路传输速率解析传入的数据包 51 | - 响应来自网络的控制包 52 | - 格式化数据包以进行传输 53 | - 处理传输通道中断 54 | 55 | 所有这些控制方面都会导致如图6-6所示的复杂状态机。在引入HLS编译器之前,这种复杂的控制级别始终以处理器为目标,即使以牺牲性能为代价。选择此实现方式的主要原因是难以在手动设计流程中有效表达和平衡此大小的FSM。 56 | 57 | ![](./images/6-6.png) 58 | 59 | 如图6-6所示,UDP数据包处理FSM是一个由互连状态组成的复杂网络。每个状态处理数据包处理的不同阶段。除了状态之间的复杂交互之外,每个状态都可以被系统级事件中断。这些事件可能会触发来自应用程序的状态信息请求,或者重新配置如何处理下一个数据包。与以计算为中心的应用程序不同,包处理没有明确定义的任务大小。必须分析每个数据包,这意味着只要设备通电,任务的持续时间是无限的。UDP处理FSM的实现始于顶层功能签名。 60 | 61 | 图6-7显示了针对使用HLS编译器实现FPGA的UDP数据包处理引擎的顶层功能签名。在此功能中,数组用于为该模块与系统其余部分之间的物理通信缓冲区建模。还要注意的重要一点是,使用volatile关键字标记不是数组的每个函数变量。如图6-6所示,该控制器必须能够在任何执行阶段处理系统的中断。这个需求的问题是在C和C++中都指定的函数变量行为。 62 | 63 | ![](./images/6-7.png) 64 | 65 | 在C和C++中,在发出函数调用时,对函数变量进行采样并存储在函数存储空间内的本地副本中。这意味着,除了可能在多个内存空间中存储相同的变量之外,C/C++程序直到下一个函数调用时才检测到变量值的变化。volatile关键字是此问题的语言解决方案。嵌入式软件开发人员熟悉的此构造通知C/C++编译器,变量可以在函数调用期间更改值。因此,每次在代码中使用volatile变量时,都必须直接从函数端口访问它。尽管此语言构造可解决数据访问问题,但它不会删除变量的内部副本。 66 | 67 | const限定符解决了跨存储空间潜在的数据重复问题。当将此限定符应用于函数端口时,编译器避免在函数存储空间内创建变量的本地副本。相反,读或写操作直接在变量端口上进行。在硬件中,使用const volatile限定符可使系统在任务期间对外部输入做出反应,并减少反应的延迟。 68 | 69 | 图6-8显示了封装UDP控件FSM的主要处理过程的代码。 70 | 71 | ![](./images/6-8.png) 72 | 73 | UDP控制FSM的执行分为初始化和正常执行阶段。一旦FPGA实现退出复位状态,就会初始化阶段。在此阶段,状态标志设置为默认值,并且从内存中加载该块的媒体访问控制(MAC)地址。MAC地址是为其分配动态主机配置协议(DHCP)地址的唯一网络标识符。UDP控制器可以广播其地址后,它开始处理网络控制数据包,以向网络请求并注册Internet协议(IP)地址。控制器在网络中正确注册后,它将切换到正常操作模式并开始生成UDP数据包。除了特定的功能之外,此代码还演示了如何在单个以控制为中心的应用程序中组合控制和计算编码元素。 74 | 75 | 图6-8中的代码显示了基于两个执行阶段的单层控制层次结构。实际上,以控制为中心的应用程序比该示例更为复杂,并且具有分层的控制结构。以与处理器相同的方式捕获控制层次结构的能力,是HLS与其它软件编译器之间的主要区别之一。 76 | 77 | 图6-9显示了如何为HLS编译器表达层次控制的示例。该图是图6-8中servlet功能的一部分。初始化后,servlet函数控制UDP控制器的所有操作阶段。如该代码所示,该模块与系统级信号具有恒定的交互作用,以确定下一个操作。另外,这种编码风格保留了嵌套的case语句和处理器代码典型的计算功能的混合。这有助于捕获C/C++中的功能,并有助于代码从处理器迁移到FPGA。 78 | 79 | ![](./images/6-9.png) 80 | 81 | 可以使用HLS编译器在以FPGA为中心的以控制为中心的应用程序中进行编译和实现。因此,实现这种类型的代码的决定减少到控制代码的需求与应用程序中所有其他功能的需求之间的资源折衷。通过使用HLS编译器开发整个应用程序,用户可以确定设计中以控制为中心的功能和以数据为中心的功能在不同性能点上需要多少资源。HLS编译器产生多种假设情景的能力允许探索设计变量,例如吞吐量与面积与延迟。 -------------------------------------------------------------------------------- /Xilinx/UG998/CH7.md: -------------------------------------------------------------------------------- 1 | # Ch7 Software Verification and Vivado HLS 2 | ## Overview 3 | 与处理器编译器一样,Vivado® HLS编译器输出的质量和正确性取决于输入软件。本章回顾了适用于Vivado® HLS编译器的推荐软件质量保证技术。**它提供了典型编码错误的示例及其对HLS编译的影响,以及每种问题的可能解决方案**。它还包括关于无法在C/C++仿真级别上完全验证程序行为的情况下该怎么做的部分。 4 | 5 | ## Software Test Bench 6 | 验证任何由HLS生成的模块都需要一个软件测试平台。软件测试台具有以下重要功能: 7 | - 证明针对FPGA实现的软件运行且不会产生分段错误 8 | - 证明算法的功能正确性 9 | 10 | 像其他任何编译器一样,段错误在HLS中是一个问题。但是,在检测导致问题的编码错误方面存在差异。在基于处理器的执行中,段错误是由试图访问处理器未知的存储位置的程序引起的。导致此错误的最常见原因是用户程序尝试在分配内存并将其附加到指针之前访问与指针地址关联的内存中的位置。根据以下事件序列,在运行时检测此错误相对简单: 11 | 1. 处理器检测到内存访问冲突,并通知操作系统(OS)。 12 | 2. OS向引起错误的程序或进程发出信号。 13 | 3. 从操作系统收到错误信号后,程序终止并生成一个核心转储文件以进行分析。 14 | 15 | 在HLS生成的实现中,由于没有处理器,也没有操作系统监视程序执行,因此很难检测到段错误。段故障的唯一指示是电路生成的结果值不正确。仅凭这一点还不足以确定细分错误的根本原因,因为存在多个可能触发错误结果计算的问题。 16 | 17 | > 建议:使用HLS时,建议设计人员确保软件测试平台可以编译并执行功能,而不会在处理器上出现问题。这保证了HLS生成的实现不会导致段错误。 18 | 19 | 软件测试平台的另一个目的是证明针对FPGA执行的算法的功能正确性。对于生成的硬件实现,HLS编译器仅保证与原始C/C++代码的功能等效。因此,需要一个良好的软件测试平台来最小化硬件验证和确认方面的工作。 20 | 21 | 一个好的软件测试平台的特征是对算法的软件实现执行数千或数百万的数据集测试。这使设计人员可以高度自信地断言算法已正确捕获。但是,即使有许多测试向量,有时仍可能在FPGA设计的硬件验证期间检测HLS生成的输出中的错误。在硬件验证过程中检测到功能错误意味着软件测试平台不完整。将有问题的测试向量应用于C/C++执行会发现算法中的语句不正确。 22 | 23 | > 重要说明:不能直接在生成的RTL中修复错误。功能正确性的任何问题都是软件算法功能正确性的直接结果。 24 | 25 | > 提示:用于测试针对使用HLS实现FPGA的算法的软件测试平台没有任何编码风格限制。软件工程师可以自由使用任何有效的C/C++编码样式或结构来彻底测试算法的功能正确性。 26 | ## Code Coverage 27 | 代码覆盖率表明设计中语句的多少百分比被测试基准代码运行到。该指标可以通过gcov之类的工具生成,从而可以了解用于执行该算法的测试向量的质量。 28 | 29 | 至少,**测试平台必须获得90%的代码覆盖率分数**,才能被认为是对算法的充分测试。这意味着测试向量会触发case语句,条件if-else语句和for循环中的所有分支。除了总体覆盖率指标之外,由代码覆盖率工具生成的报告还提供了执行功能的哪些部分以及哪些部分没有执行的见解。 30 | 31 | 图7-1显示了使用gcov测试过的示例应用程序。 32 | 33 | ![](./images/7-1.png) 34 | 35 | 运行gcov要求使用附加的标志编译代码,这些标志生成用于profiling程序执行所需的信息。假设文件example.c中存在图7-1的代码,则可以使用图7-2中所示的命令序列运行gcov。 36 | 37 | ![](./images/7-2.png) 38 | 39 | gcov结果表明,执行了92.31%的程序行,这满足了HLS的最低90%代码覆盖率要求。但是,gcov产生的更有趣的结果是每行代码执行的次数,如表7-1所示。 40 | 41 | ![](./images/t7-1.png) 42 | 43 | 结果表明,永远不会执行在for循环内发生的分配A = 0。该语句通过条件语句控制分配给用户警告可能的问题。门控条件语句i == 11对于图7-1中所示的循环边界永远不可能成立。该算法必须检查这是否是预期的行为。HLS将C/C++中无法访问的语句(例如A分配给0)检测为要从电路中消除的无效代码。 44 | 45 | 46 | ## Uninitialized Variables 47 | 未初始化的变量是不良的编码样式的结果,在这种编码样式中,设计人员在声明时未将变量初始化为0。图7-3显示了一个示例代码片段,其中包含未初始化的变量。 48 | 49 | ![](./images/7-3.png) 50 | 51 | 在此代码片段示例中,变量A永远不会造成问题,因为在读取变量之前先对其进行分配。问题由变量B创建,变量B在分配值之前用于计算。B的这种用法在C和C++中都属于未定义行为的类别。尽管某些处理器编译器通过在声明时自动为B分配0来解决此问题,但HLS并未使用这种类型的解决方案。 52 | 53 | HLS假定可以从最终实现中优化用户代码中的任何未定义行为。这触发了优化级联效应,可以将电路缩减为零。用户可以通过注意生成的实现的空RTL文件来检测这种类型的错误。 54 | 55 | 检测此类错误的更好方法是使用代码分析工具,例如valgrind和Coverity。这两个工具都在用户程序中标记未初始化的变量。与所有软件质量问题一样,在使用HLS编译代码之前,必须解决未初始化的变量。 56 | ## Out-of-Bounds Memory Access 57 | 在HLS中,内存访问被表示为对数组的操作或通过指针对外部存储器的操作。在越界访问内存的情况下,重点是由HLS转换为内存块的数组。图7-4显示了具有越界内存访问的代码示例。 58 | 59 | 此代码尝试在超出分配的内存范围的位置将数据写入数组A。在处理器编译器中,这种类型的地址溢出触发地址计数器复位为0。这意味着在处理器执行图7-4中的代码时,位置A[0]的内容为15,而不是5。结果在功能上不正确,这种错误通常不会导致程序崩溃。 60 | 61 | ![](./images/7-4.png) 62 | 63 | 使用HLS,访问无效地址会触发一系列事件,从而导致生成的电路中出现不可恢复的运行时错误。因为HLS实现假定已正确验证了软件算法,所以错误恢复逻辑未包含在生成的FPGA实现中。因此,通过对存储数组A的值的BRAM资源元素执行图7-4中的代码,将生成无效的内存地址。然后,BRAM发出HLS实施不希望的错误条件,并且该错误将无人看管。BRAM中的无人值守错误导致系统挂起,只能通过重新引导设备来解决。 64 | 65 | 为了在电路编译之前发现这种情况,建议通过动态代码检查器(例如valgrind)执行该工具。Valgrind是一套旨在检查和分析C/C++程序质量的工具。valgrind Memcheck工具执行已编译的C/C++程序,并在执行期间监视所有内存操作。该工具标记以下关键问题: 66 | - Use of uninitialized variables (Figure 7-3) 67 | - Invalid memory access requests (Figure 7-4) 68 | 69 | > 推荐:在使用HLS编译软件功能以执行FPGA之前,建议设计人员解决由动态代码检查器标记的所有问题。 70 | 71 | ## Co-Simulation 72 | 用于C/C++程序分析和功能测试的工具可解决影响HLS实施的大多数问题。但是,这些工具无法验证并行化后的C/C++程序是否保持功能正确性。在HLS编译器中,通过协同仿真解决了此问题。 73 | 74 | 协同仿真是一个过程,在该过程中,生成的FPGA实现由软件仿真期间使用的同一C/C++测试平台执行。HLS以对用户透明的方式处理C/C++测试平台与生成的RTL之间的通信。作为此过程的一部分,HLS调用硬件模拟器(例如Vivado模拟器)来模拟RTL在设备上的运行方式。此仿真的主要目的是检查用户提供的并行化指导是否会破坏算法的功能正确性。 75 | 76 | 默认情况下,HLS在并行化之前遵守所有算法依赖关系,以确保与原始C/C++表示功能等效。在无法完全分析算法依赖性的情况下,HLS采用保守的方法并服从依赖性。这可能会导致编译器生成保守的实现,而该实现无法实现应用程序的目标性能目标。图7-5显示了触发HLS中保守行为的代码示例。 77 | 78 | ![](./images/7-5.png) 79 | 80 | 该代码显示了在数组A和B上运行的循环,并且分析问题发生在数组A上。数组A的索引取决于循环变量i和变量k。在此示例中,变量k表示编译时未知值的函数参数。因此,HLS无法证明对A[k+i]的写入与在计算B[i]中使用的A[i]的读取不同。基于这种不确定性,HLS假定存在一种算法依赖性,从而迫使A[k+i]和B[i]的计算按原始C/C++源代码中的顺序进行。用户有能力克服这种依赖性,并迫使HLS生成其中并行计算A[k+i]和B[i]的电路。该替代的影响仅影响所生成的电路,因此只能通过协同仿真进行验证。 81 | 82 | 使用协同仿真时,请务必记住这是对处理器上执行的并行硬件的仿真。因此,它比C/C++仿真慢大约10,000倍。同样重要的是要记住,**协同仿真的目的不是验证算法的功能正确性。相反,其目的是检查用户对HLS编译器的指导是否破坏了算法**。 83 | 84 | > 推荐:建议仅在算法功能验证期间使用的部分测试向量上运行协同仿真。 85 | 86 | ## When C/C++ Verification Is Not Possible 87 | 88 | HLS的大多数用例都在可以通过C/C++仿真完全验证其功能正确性的算法中。但是,在某些情况下,HLS编译之前无法完全验证算法的C/C++表示形式。图7-6显示了此类代码的示例。 89 | 90 | ![](./images/7-6.png) 91 | 92 | 此代码显示了C中描述的UDP数据包处理引擎的代码段。在此示例中,所有指针都使用volatile关键字声明。在设备驱动程序开发中很常见的volatile关键字的用法会警告编译器,指针已连接到在执行功能期间可能会更改的存储元素。每次在源代码中指定该指针时,都必须对其进行读写。用于合并指针访问的传统编译器优化也可以通过volatile关键字来关闭。 93 | 94 | volatile数据的问题在于,在C/C++仿真中无法完全验证代码的行为。C/C++模拟不能在测试功能执行过程中更改指针的值。因此,此类代码只能在HLS编译后的RTL仿真中完全验证。用户必须编写一个RTL测试平台,以在所有可能的情况下为C/C++源代码中的每个volatile指针测试生成的电路。协同仿真不适用于这种情况,因为它受到可以在C/C++仿真中使用的测试向量的限制。 -------------------------------------------------------------------------------- /Xilinx/UG998/CH8.md: -------------------------------------------------------------------------------- 1 | # Ch8 Integration of Multiple Programs 2 | ## Overview 3 | 正如大多数处理器运行多个程序来执行一个应用程序一样,FPGA实例化多个程序或模块来执行一个应用程序。本章重点介绍如何连接FPGA中的多个模块以及如何使用处理器控制这些模块。本章中的示例使用Xilinx®Zynq®-7000SoC来演示处理器与FPGA架构之间的互连。 4 | 5 | Zynq-7000 SoC是针对低功耗软件执行的新型设备中的第一款。该器件在单个芯片中结合了Arm®Cortex™-A9多核处理器和FPGA架构。该设备的集成度消除了与协处理器或加速解决方案相关的通信延迟和瓶颈。该器件还无需PCIe®桥接器即可在处理器上运行的代码与Vivado®HLS为FPGA编译的代码之间传输数据。相反,这两个计算域的互连是通过使用高级可扩展接口(AXI)协议进行的。 6 | ## AXI 7 | AXI是Arm高级微控制器总线体系结构(AMBA®)系列微控制器总线的一部分。该标准定义了系统中的模块之间如何传输数据。适用于Zynq-7000 SoC上运行的应用程序的AXI通信用例为: 8 | - Memory mapped slave 9 | - Memory mapped master 10 | - Direct point-to-point stream 11 | 12 | > 注意:有关AXI及其如何为Xilinx FPGA实现的更多信息,请参见《 AXI参考指南(UG761)[参考2]。 13 | 14 | ### Memory Mapped Slave 15 | AXI4-Lite是一种内存映射的从设备连接,它使用与基于处理器的系统中的设备驱动程序相同的通信机制。处理器代码通过向设备驱动程序发出函数调用来访问从加速器内核。Vivado HLS自动生成的设备驱动程序访问加速器中的寄存器以配置和触发任务执行。这些寄存器也可以直接安装在处理器的存储空间中,而无需驱动程序也可以直接访问。 16 | 17 | FPGA架构中的从加速器无法自行启动任何数据传输。具体而言,这种类型的接口不允许加速器启动与主存储器的数据传输以完成其任务。该接口的事务图如图8-1所示。此图显示了在事务处理期间花费时钟周期的位置。了解事务序列和时序预算可使设计人员正确确定此接口的适用性和对应用程序性能的影响。 18 | 19 | ![](./images/8-1.png) 20 | 21 | ### Memory Mapped Master 22 | AXI4是存储器映射的Master接口,它允许HLS生成的模块启动到设备(例如DDR存储器)的数据事务,而无需处理器的干预。具有此接口的块可以消除处理器从主存储器复制和传输数据所花费的时间,从而提高应用程序的计算吞吐量。 23 | 24 | 重要的是要记住,处理器无法访问与AXI4接口关联的函数端口。因此,对于具有AXI4接口的模块,建议包含与AXI4-Lite接口相连的某些功能参数,这是推荐的最佳实践。从接口允许处理器传送基址,函数应从基址获取其任务数据。设置事务基地址后,可以从内存和加速模块之间的数据传输中删除处理器。 25 | 26 | 图8-2显示了AXI4接口的事务时序图。该图显示了事务序列和相关的开销,这使设计人员能够确定该接口对特定应用的适用性。 27 | 28 | ![](./images/8-2.png) 29 | 30 | ### Direct Point-to-Point Stream 31 | AXI4-Stream是FPGA架构中两个模块之间的直接点对点通信通道。与AXI4一样,该传输通道在处理器的存储空间中不可见。它也没有与寻址和从内存中获取数据相关的任何开销。而是通过FIFO在模块之间传输数据。 32 | 33 | 类似于软件开发中函数之间的队列,AXI4-Stream是编译到FPGA架构上的函数之间的首选数据传输通道。连接到这种类型的数据传输通道的函数并行运行,并根据通道的状态自同步。只要通道中有空间,在流输入处连接的函数即生产者就可以传输数据。只要通道报告它不为空,在流输出处连接的函数即使用者,就可以接收数据。 34 | 35 | 消费者和生产者都独立地与AXI4-Stream通道进行交互。根据通道的状态,函数可以完成事务或等待直到通道就绪。只要功能的总吞吐能力满足系统级要求,就不会丢失或跳过数据。 36 | 37 | 图8-3显示了AXI4-Stream数据传输通道的事务时序图。该通道不提供寻址逻辑,并且具有用户定义的存储量。默认情况下,AXI4-Stream的深度为1,这使生产者和使用者之间保持同步。生产者与消费者之间的耦合程度可通过更改AXI4-Stream通道中的存储量来影响。 38 | 39 | ![](./images/8-3.png) 40 | 41 | ## Design Example: Application Running on a Zynq-7000 SoC 42 | 该设计示例展示了如何获取处理器代码并将其转换为可在Zynq-7000 SoC上运行的应用程序。本示例在迁移过程中完成了以下步骤: 43 | - Analyzing and partitioning the processor code 44 | - Compiling the program in Vivado HLS 45 | - Composing the system in Vivado IP integrator 46 | - Connecting processor code and FPGA fabric functions 47 | 48 | > 注意:Zynq-7000设备中的Arm Cortex-A9处理器可以支持单程序执行和完整的操作系统,例如Linux。在任何一种情况下,构建应用程序所需的步骤都是相同的。因此,本示例着重于单个程序执行模型,该模型演示了应用程序迁移过程。 49 | 50 | ### Analyzing and Partitioning the Processor Code 51 | 面向Zynq-7000设备的大多数软件应用程序都是在标准x86处理器或DSP处理器上执行的应用程序开始的。因此,移植设计的第一步是为Arm Cortex-A9处理器编译程序并分析其性能。在Arm处理器上运行的程序的性能分析数据可指导设计人员选择如何在处理器和FPGA架构之间划分原始代码。 52 | 53 | 图8-4显示了此示例的原始处理器代码。 54 | 55 | ![](./images/8-4.png) 56 | 57 | 该设计由一个main 函数组成,该功能调用了两个子功能:生产者和消费者。编译到Arm处理器后,有两种方法可以分析程序性能: 58 | - 测量时间 59 | 60 | 此方法涉及使用计时器来检测代码,并测量处理器上每个子功能的执行时间。 61 | 62 | - 使用代码分析工具 63 | 64 | 这种侵入性较小的方法使用诸如gprof之类的工具来测量花费在函数上的时间量,并提供有关函数被调用次数的统计信息。 65 | 66 | 在此示例中,gprof的结果表明生产者和消费者函数是应用程序中的性能瓶颈。因此,决定在FPGA架构中实现这两个函数。将函数标记为FPGA实现后,必须分析函数端口以确定最合适的硬件接口。 67 | 68 | 图8-5显示了生产者函数的签名。 69 | 70 | ![](./images/8-5.png) 71 | 72 | 生产者函数包括以下端口: 73 | - strm_out 74 | 75 | 此端口是用于函数输出的数组,并连接到消费者函数中的相应输入。**由于生产者和使用者功能均以顺序队列的形式访问此阵列,因此最佳的硬件接口是AXI4-Stream**。 76 | 77 | - strm_len 78 | 79 | 此功能参数是输入,必须由处理器提供。因此,该端口必须**映射在AXI4-Lite接口**上。 80 | 81 | 图8-6显示了消费者函数的函数签名。 82 | 83 | ![](./images/8-6.png) 84 | 85 | 图8-6显示了消费者函数的函数签名。 86 | - strm_in 87 | 88 | 该数组端口连接到与生产者函数相同的数组。因此,该端口必须连接到**AXI4-Stream接口**。 89 | 90 | - strm_len 91 | 92 | 此函数参数的作用与生产者函数相同。与生产者函数相同,此端口被实现为**AXI4-Lite接口**。 93 | 94 | - dout 95 | 96 | 这是一个输出端口。由于设计中没有其他FPGA架构模块,因此唯一的选择是将值传送回处理器。通过发出处理器中断,可以将数据从FPGA架构直接传输到处理器。确认中断后,处理器将在其内存空间中查询数据。dout函数参数必须映射到**AXI4-Lite接口**,以便可以从处理器程序访问。 97 | 98 | ### Compiling the Program in Vivado HLS 99 | 在确定了要在FPGA架构中运行的功能之后,设计人员将准备用于Vivado HLS编译的源代码。在此示例中,生产者和使用者功能在FPGA架构中实现为独立模块。一个编译项目产生了FPGA架构中的一个模块。因此,在此示例中,设计人员必须运行两次HLS才能生成相应的模块。 100 | 101 | > 推荐:当使用多个项目或模块时,建议将源代码分成不同的文件。这种简单的技术可以防止一个模块的编译问题影响设计中的另一个模块。 102 | 103 | 可以使用工具命令语言(Tcl)脚本文件来控制HLS编译。Tcl脚本文件类似于编译Makefile,它指示编译器实现哪些函数到FPGA器件中。 104 | 105 | 图8-7显示了用于生产者函数的HLS编译Tcl脚本文件。 106 | 107 | ![](./images/8-7.png) 108 | 109 | 该脚本分为以下几节: 110 | - Project setup 111 | 112 | 本节包括源文件和要编译的函数的名称。指导Vivado HLS编译器是一个将指令或编译指示应用于设计源代码的迭代过程。设计的每个连续改进都称为解决方案。所有项目至少都有一个解决方案。 113 | 114 | - Solution setup 115 | 116 | 本部分建立了为其编译软件功能的时钟频率和设备。如果设计人员通过使用指令引导编译器,则解决方案指令将包含在脚本的此部分中。 117 | 118 | - Compilation 119 | 120 | 此部分驱动RTL的生成和打包。将HLS程序组装成完整的Zynq-7000设备应用程序时,需要使用Vivado IP集成器,它是一种系统组合工具。IP集成商要求将模块打包为等效于软件对象文件。 121 | 122 | > 注意:有关IP和IP集成器的更多信息,请参见《Vivado设计套件用户指南:使用IP设计》(UG896)[参考3]和《Vivado设计套件用户指南:使用IP集成器设计IP子系统》(UG994)[参考4]。 123 | 124 | 生产者和消费者函数的优化需要使用编译指示来确定所生成模块及其接口的并行性。图8-8显示了生产者函数的优化代码。 125 | 126 | ![](./images/8-8.png) 127 | 128 | 生产者函数通过pipeline编译指示并行化。这创建了一种实现,其中i和i+1迭代的开始时间被一个时钟周期隔开。除了pipeline编译指示外,该代码还显示了interface编译指示的使用。 129 | 130 | interface编译指示定义了模块在FPGA架构中的连接方式。定义过程分为接口行为和接口映射。在此的示例,发生以下情况: 131 | 1. strm_out端口的ap_fifo接口编译指示将数组转换为硬件FIFO。 132 | 2. 物理FIFO通过resource编译指令映射到AXI4-Stream接口。 133 | 3. 首先将strm_len函数参数分配给ap_none接口行为,然后将其映射到AXI4-Lite接口。 134 | 135 | > 注意:AXI4-Lite接口处理来自处理器的strm_len值的正确排序。因此,HLS生成的模块不需要在此端口上强制执行其他同步。 136 | 137 | 图8-9显示了消费者函数的代码。此函数具有与生产者函数相同的优化和编译指示。 138 | 139 | ![](./images/8-9.png) 140 | 141 | ### Composing the System in Vivado IP Integrator 142 | Vivado IP集成器是用于系统组成的Xilinx FPGA设计工具。该工具的一种用途是获取HLS编译器生成的块,并将其连接到执行用户应用程序的处理平台。用软件开发术语来说,IP集成器类似于将所有程序对象组合到单个bitstream中的链接器。bitstream是用于对FPGA架构进行编程的二进制文件。 143 | 144 | ### Connecting Processor Code and FPGA Fabric Functions 145 | 在IP集成器中创建FPGA架构编程二进制文件后,设计人员必须创建在处理器上运行的软件。**该软件的目的是初始化FPGA架构功能,启动执行并从架构中接收结果**。为了使整个应用程序在功能上等同于原始处理器代码,在FPGA架构中运行的**每个函数都需要在Arm Cortex-A9处理器上运行的代码中具有以下功能**: 146 | - Address mapping 147 | - Initialization 148 | - Start function 149 | - Interrupt service routine (ISR) 150 | - Interrupt registration in the processor exception table 151 | - New main function to run the system 152 | 153 | 此函数适用于在FPGA架构中运行的生产者和消费者函数。因此,图8-10中仅显示了生产者函数的代码。 154 | 155 | ![](./images/8-10.png) 156 | 157 | 此代码显示了处理器程序空间中生产者硬件模块的配置。第一个参数指出正在构造中访问生产者函数的哪个实例。由于FPGA中只有生产者的一个实例,因此此参数的值为0。基址定义由IP集成器中的系统组成步骤提供。此地址表示可从处理器访问的内存映射加速器在内存空间中的位置。 158 | 159 | 图8-11显示了使生产者硬件模块可用于处理器上运行的程序所需的初始化功能。 160 | 161 | ![](./images/8-11.png) 162 | 163 | 图8-12设置了生产者硬件模块以开始执行任务。该功能负责将模块中断设置为已知状态并开始执行任务。 164 | 165 | ![](./images/8-12.png) 166 | 167 | 图8-13中所示的ISR描述了处理器如何响应FPGA架构中生产者函数的中断。ISR的内容是特定于应用程序的。此代码显示了与Zynq-7000设备中的HLS生成的模块正确交互所需的最低ISR。 168 | 169 | ![](./images/8-13.png) 170 | 171 | 所有中断服务程序必须在处理器异常表中注册。处理器中断控制器初始化之后,主程序可以开始执行用户应用程序。图8-14显示了如何为Zynq-7000设备配置异常表。 172 | 173 | ![](./images/8-14.png) 174 | 175 | 图8-15显示了该应用程序的新主程序。在设置好硬件并配置了处理器环境之后,对于本示例来说,处理器上没有剩余的计算量。通过使用HLS编译,所有计算都移到了FPGA架构中。在这种情况下,处理器的目的是在每个硬件模块上启动任务,并在模块完成任务后收集结果。 176 | 177 | ![](./images/8-15.png) 178 | 179 | -------------------------------------------------------------------------------- /Xilinx/UG998/CH9.md: -------------------------------------------------------------------------------- 1 | # Ch9 Verification of a Complete Application 2 | ## Overview 3 | 在FPGA设计中,一个完整的应用程序是指一个硬件系统,该系统实现了由设计的软件表示所捕获的功能。可使用Vivado®HLS编译器在FPGA上构建的系统主要有两类: 4 | - 独立计算系统 5 | - 基于处理器的系统 6 | ## Standalone Compute Systems 7 | 独立计算系统是由一个或多个HLS生成的模块创建的FPGA实现,这些模块连接在一起以实现软件应用程序。在这些类型的系统中,算法的配置是固定的,并在设备配置期间加载。由HLS编译器生成的模块连接到外部FPGA引脚,用于数据发送和接收事务。这是最容易验证的系统。 8 | 独立系统的验证分为以下几个阶段: 9 | - Module verification 10 | - Connectivity verification 11 | - Application verification 12 | - Device validation 13 | ### Module Verification 14 | 第7章,软件验证和Vivado HLS中详细介绍了HLS生成块的模块验证。在软件和协同仿真中完全验证了该模块的功能正确性之后,设计人员必须测试该模块的系统误差容限。 15 | 16 | 软件仿真和协同仿真都专注于单独测试算法的功能正确性。也就是说,对算法和编译模块进行了测试,以确保以理想方式处理所有输入和输出时的正确功能。全面的测试有助于确保将数据提供给模块后的正确性。通过消除模块的内部处理核心作为可能的错误源,它还有助于减少后续阶段的验证负担。此方法未处理的唯一模块级问题是验证模块可以从其接口处的错误握手中完全恢复。 17 | 18 | 系统内测试测试HLS生成的模块如何响应其输入和输出端口的不正确切换。该测试的目的是消除I/O行为,因为它可能导致崩溃或以其他方式不利地影响被测模块。用这种方法测试的不当用例的类型是: 19 | - 不稳定的时钟信号切换 20 | - 复位操作和随机复位脉冲 21 | - 输入端口以不同速率接收数据 22 | - 输出端口以不同速率采样 23 | - 接口协议冲突 24 | 25 | 这些测试是系统级行为的示例,可确保HLS生成的模块在所有情况下均按预期运行。此阶段所需的测试量取决于接口的类型和集成方法。通过使用HLS默认设置生成符合AXI的接口,设计人员可以避免编写详尽的错误的系统级行为的测试平台。符合AXI标准的接口已由HLS编译器的开发人员进行了全面测试和验证。 26 | 27 | ### Connectivity Verification 28 | 连接性验证是一系列测试,用于检查应用程序中的模块是否正确连接。与模块验证一样,所需的测试量取决于系统集成方法。如第8章中讨论的那样,可以手动或在FPGA设计工具的帮助下组装应用程序。 29 | 30 | Xilinx®系统生成器和Vivado IP集成器设计流程均提供了FPGA设计工具帮助。这些图形模块连接工具可处理与模块连接有关的所有方面。作为这些流程的一部分,每个工具都会检查应用程序中每个模块的端口类型和协议符合性。如果每个模块都经过了模块验证,则无需使用这些流程中的任何一个进行其他用户控制的连接测试。 31 | 32 | 手动集成流程要求用户在RTL中编写应用程序顶级模块,并手动连接组成应用程序的每个模块的RTL端口。这是最容易出错的流程,必须进行验证。通过使用HLS编译器默认设置并为每个模块端口生成AXI接口,可以减少所需的测试量。 33 | 34 | 对于围绕AXI接口构建的系统,可以通过使用总线功能模型(BFM)验证连接性。BFM提供了Xilinx验证的AXI总线和点对点连接的行为。这些模型可用于流量生成器,作为RTL模拟的一部分,有助于证明HLS生成的模块的正确连接。 35 | 36 | 重要提示:请记住,此模拟的目的仅是检查连接性和通过系统的数据正确流动,这一点很重要。连接验证步骤不验证应用程序的功能正确性。 37 | ### Application Verification 38 | 在FPGA器件上运行应用程序之前,应用程序验证是最后一步。该流程中的先前步骤着重于检查组成一个应用程序的各个算法的质量,以及检查一切是否正确连接。**应用程序验证的重点是检查原始软件模型是否与FPGA实现的结果匹配**。如果应用程序由单个HLS生成的模块组成,则此阶段与模块验证相同。如果应用程序由两个或多个HLS生成的模块组成,则验证过程将从原始软件模型开始。 39 | 40 | 设计人员必须从软件模型中提取应用程序输入和输出测试向量,以用于RTL仿真。由于硬件实现的构造需要分多个阶段进行验证,因此应用程序验证不需要进行详尽的仿真。仿真可以根据需要运行任意数量的测试向量,以使设计人员对FPGA实施充满信心。 41 | 42 | ### Device Validation 43 | 在使用自动或手动集成流程将应用程序组装到RTL中之后,设计将经历一个附加的编译阶段,以生成对FPGA进行编程所需的二进制或比特流。在FPGA设计的术语中,将RTL编译成比特流称为逻辑综合,实现和比特流生成。生成比特流后,即可对FPGA器件进行编程。硬件在设计人员指定的时间内正确运行之后,将对应用程序进行验证。 44 | 45 | ## Processor-Based Systems 46 | 47 | 对于模块和连接性验证阶段,基于处理器的系统的验证流程与独立系统相同。主要区别在于应用程序的一部分正在处理器上运行。在Zynq®-7000SoC中,这意味着应用程序的一部分在嵌入式Arm®Cortex™-A9处理器上运行,并且一部分由HLS编译以在FPGA架构上执行。这种划分带来了验证挑战,可以通过使用以下技术来解决: 48 | - 硬件在环(HIL)验证 49 | - 虚拟平台(VP)验证 50 | 51 | ### Hardware in the Loop Verification 52 | HIL验证是一种验证方法,其中在FPGA架构中对被测系统的**一部分进行仿真**。在Zynq-7000 SoC中,针**对处理器的应用程序代码在设备中实际的Arm Cortex-A9处理器上执行**。使用**HLS编译的代码在RTL仿真中执行**。 53 | 54 | 图9-1概述了Zynq-7000设备的HIL验证。该图中的系统是一个实验设置,包括ZC702评估板(目前是商用板)和Vivado模拟器。该图还介绍了处理系统(PS)和可编程逻辑(PL)单元的概念。PS指的是双Arm Cortex-A9处理器,也称为处理子系统。PL指Zynq-7000器件内部的FPGA逻辑,这是HLS生成的模块映射到的器件部分。 55 | 56 | > 提示:HIL验证需要一块板才能访问处理器,并且该技术可在任何Zynq-7000 SoC板上使用。 57 | 58 | ![](./images/9-1.png) 59 | 60 | HIL验证与验证的主要优点是: 61 | - 处理器模型与实际处理器之间没有仿真矛盾 62 | - 处理器上运行的代码以FPGA器件的速度执行 63 | - 可以通过RTL仿真全面了解每个生成的模块的工作方式 64 | 65 | 使用HIL验证时,记住该技术的性能特征很重要。尽管处理器代码在实际的硬件中运行,但FPGA架构完全在设计人员的工作站上仿真。如第8章“集成多个程序”中所述,RTL模拟是一个相对较慢的过程。因此,仅建议使用HIL验证来**验证处理器与FPGA架构之间的主要交互**,而不是应用程序中的每个用例。使用HIL验证检查的关键应用程序行为是: 66 | - Vivado HLS驱动程序集成到处理器代码中 67 | - 从PS到PL写入配置参数 68 | - 从PL到PS中断 69 | 70 | 与软件算法的RTL实现一起,**Vivado HLS编译器会生成处理器与所生成的硬件模块进行通信所需的软件驱动程序。Vivado HLS的驱动程序处理加速器的启动和停止,配置以及数据传输**。该驱动程序可用于Linux和独立软件应用程序。 71 | 72 | > 注意:独立软件应用程序是一个系统,其中处理器仅执行一个程序,不需要操作系统支持。 73 | 74 | ### Virtual Platform Verification 75 | 虚拟平台技术是一种成熟的软件和硬件开发重叠方法,可用于Zynq-7000 SoC。虚拟平台是对应用程序及其在其上运行的硬件平台的软件模拟。用于设计的PL部分的模型可以是C,C++,SystemC或RTL。该仿真平台可以用作其他推荐的验证阶段的代理,并且对硬件实现的保真度也有所不同。 76 | 77 | 在虚拟平台的最快使用情况下,从提供给Vivado HLS编译器的C/C++源代码模拟针对PL的应用程序模块。此设置会产生功能上正确的仿真,使设计人员可以测试算法以进行正确的计算。当使用Vivado HLS对模块进行优化和编译时,生成的RTL可以替代模块的软件版本,以实现连通性测试和时序驱动器仿真。 78 | 79 | > 重要说明:请记住,添加RTL模块会影响虚拟平台上的运行时并减慢执行速度,这一点很重要。 80 | 81 | ### Device Validation 82 | 设备验证的目的是检查处理器与FPGA架构交互的所有应用用例。与独立执行一样,此过程涉及在Zynq-7000 SoC上运行整个应用程序一定时间。该测试的目的是检查与设计的PS和PL部分之间的交互有关的所有应用特定情况。 -------------------------------------------------------------------------------- /Xilinx/UG998/images/1-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/1-1.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/1-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/1-2.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/2-1.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/2-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/2-10.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/2-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/2-2.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/2-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/2-3.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/2-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/2-4.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/2-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/2-5.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/2-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/2-6.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/2-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/2-7.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/2-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/2-8.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/2-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/2-9.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/3-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/3-1.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/3-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/3-2.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/3-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/3-3.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/3-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/3-4.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/3-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/3-5.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/3-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/3-6.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/4-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/4-1.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/4-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/4-10.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/4-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/4-11.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/4-12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/4-12.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/4-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/4-2.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/4-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/4-3.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/4-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/4-4.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/4-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/4-5.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/4-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/4-6.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/4-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/4-7.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/4-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/4-8.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/4-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/4-9.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/5-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/5-2.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/5-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/5-3.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/5-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/5-4.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/5-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/5-5.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/5-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/5-6.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/5-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/5-7.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/5-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/5-8.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/5-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/5-9.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/6-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/6-1.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/6-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/6-2.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/6-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/6-3.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/6-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/6-4.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/6-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/6-6.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/6-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/6-7.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/6-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/6-8.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/6-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/6-9.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/7-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/7-1.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/7-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/7-2.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/7-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/7-3.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/7-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/7-4.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/7-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/7-5.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/7-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/7-6.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/8-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/8-1.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/8-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/8-10.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/8-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/8-11.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/8-12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/8-12.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/8-13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/8-13.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/8-14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/8-14.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/8-15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/8-15.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/8-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/8-2.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/8-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/8-3.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/8-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/8-4.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/8-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/8-5.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/8-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/8-6.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/8-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/8-7.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/8-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/8-8.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/8-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/8-9.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/9-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/9-1.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/t3-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/t3-1.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/t3-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/t3-2.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/t3-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/t3-3.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/t4-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/t4-1.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/t4-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/t4-2.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/t6-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/t6-1.png -------------------------------------------------------------------------------- /Xilinx/UG998/images/t7-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Inference-and-Optimization/High-Level-Synthesis-Study-Notes/d819ebfe33c6d1ec079b6165a7801991a741d73d/Xilinx/UG998/images/t7-1.png --------------------------------------------------------------------------------