# 11-1\_基于HLS的加速器Overlay设计实例 - 快速生成硬件IP

## 介绍

本章节介绍了HLS的基本操作流程，你将熟悉HLS工程的创建、仿真、综合与实现流程。

## 目标

* ​       使用Vivado HLS工具创建工程
* ​       对设计进行仿真
* ​        对设计进行综合
* ​        对设计进行实现
* ​        使用Vivado HLS分析工具对工程进行分析

## 步骤1:创建新的工程

### 1.     创建一个适用于PYNQ-Z2的HLS工程

**1.1** 将lab1\_src目录下的3个源文件拷贝到**C:\xup\hls\_labs\lab1**目录下；

![](https://8526760-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Luk3T3QoKyS_b-1joBV%2F-Luk3tukeoHpawWbVABz%2F-Luk4J5nqB9MskO2cx4O%2F01.png?generation=1574912215826254\&alt=media)

**1.2** 启动 Vivado HLS工具: **Start > Xilinx Design Tools > Vivado HLS 2018.2；**

![](https://8526760-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Luk3T3QoKyS_b-1joBV%2F-Luk3tukeoHpawWbVABz%2F-Luk4J5rKJJuHUoLuBsw%2F02.png?generation=1574912216051998\&alt=media)

**1.3** 点击 **Create New Project**创建新的HLS工程；

**1.4** 点击**Browse…**&#x9009;择工程目录到为 **：C:\xup\hls\_labs\lab1** ,项目名称填写为：**matrixmul** ，点击**Next**；

**注：**&#x5DE5;程目录与工程名称可自己定义

![](https://8526760-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Luk3T3QoKyS_b-1joBV%2F-Luk3tukeoHpawWbVABz%2F-Luk4J5tmN1I7L1phkrq%2F03.png?generation=1574912215761305\&alt=media)

**1.5** 点击 **Add Files…** 按钮，添加**C:\xup\hls\_labs\lab1**目录下的matrixmul.cpp 文件到工程中，**Top Function**栏内填写**matrixmul**；

**注：**&#x6D;atrixmul为源文件matrixmul.cpp内的函数名，本lab将会把该函数综合为可在Vivado中调用的硬件IP。

![](https://8526760-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Luk3T3QoKyS_b-1joBV%2F-Luk3tukeoHpawWbVABz%2F-Luk4J5vL2GO4UgH5p-9%2F04.png?generation=1574912215788964\&alt=media)

**1.6** 点击 **Next** 按钮；

**1.7** 点击**Add Files…** 按钮, 添加**C:\xup\hls\_labs\lab1** 目录下的 **matrixmul\_test.cpp** 到工程中；

![](https://8526760-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Luk3T3QoKyS_b-1joBV%2F-Luk3tukeoHpawWbVABz%2F-Luk4J5xHL15XDmZ0bZi%2F05.png?generation=1574912215846788\&alt=media)

**1.8** 选中 matrixmul\_test.cpp文件，然后点击 **Edit CFLAG…** 按钮, 输入 **-DHW\_COSIM**, 点击**OK**；

**注：**&#x8BE5;flag会在后续的流程中使用到

![](https://8526760-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Luk3T3QoKyS_b-1joBV%2F-Luk3tukeoHpawWbVABz%2F-Luk4J5zeAUKRsByeM1B%2F06.png?generation=1574912215971562\&alt=media)

**1.9** 点击 **Next**；

**1.10** 时钟周期设置为10ns，器件选择为**xc7z020clg400-1**

![](https://8526760-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Luk3T3QoKyS_b-1joBV%2F-Luk3tukeoHpawWbVABz%2F-Luk4J60amYw5c-BeTn4%2F07.png?generation=1574912215750842\&alt=media)

**1.11** 点击 **Finish**按钮，完成工程创建；

![](https://8526760-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Luk3T3QoKyS_b-1joBV%2F-Luk3tukeoHpawWbVABz%2F-Luk4J625Lf5-rrUtz0I%2F08.png?generation=1574912215774931\&alt=media)

**1.12** 双击 **matrixmul.cpp**文件查看源代码内容；

![](https://8526760-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Luk3T3QoKyS_b-1joBV%2F-Luk3tukeoHpawWbVABz%2F-Luk4J64iJk7OcYM8edB%2F09.png?generation=1574912215791140\&alt=media)

## 步骤 2:运行 C 代码仿真 （可跳过该步骤）

​

### 2.运行C代码仿真，检查C代码是否正确

**2.1** 点击 **Project > Run C Simulation** 或者直接点击工具栏的![](https://c/Users/ARTHURLI/Desktop/PYNQ%20DOCS/PynqDocs/images/Chapter_11/73.png) 按钮, 然后点击 **OK** 开始C代码仿真；

*可以在* *Console* *窗口观察源代码编译过程与测试结果*

![](https://c/Users/ARTHURLI/Desktop/PYNQ%20DOCS/PynqDocs/images/Chapter_11/10.png)

**2.2** 双击 **matrixmul\_test.cpp** **文件可以观察测试代码**

**注：**&#x56E0;为我们在之前的步骤中对**HW\_COSIM**进行了定义，所以**matrixmul\_test** 的主函数会调用matrixmul 函数，对matrixmul函数的输出结果与软件计算结果进行比较并打印出来。

如果没有对**HW\_COSIM**进行定义，则只会打印出计算结果，不会判断自定义函数是否正确。

## 步骤 3:C代码调试（可跳过该步骤）

### 3. 让代码在调试模式下运行

**3.1** 点击 **Project > Run C Simulation** 或者直接点击工具栏的 ![](https://c/Users/ARTHURLI/Desktop/PYNQ%20DOCS/PynqDocs/images/Chapter_11/73.png) 按钮, 在弹出的窗口中勾选**Launch Debugger**，然后点击 **OK**；

![](https://c/Users/ARTHURLI/Desktop/PYNQ%20DOCS/PynqDocs/images/Chapter_11/11.png)

**注：**&#x4EE3;码在编译过程中会增加-g选项，使得可执行代码中包含调试信息。

**3.2** Debug窗口将被自动打开，程序停留在main() 函数入口；

![](https://8526760-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Luk3T3QoKyS_b-1joBV%2F-Luk3tukeoHpawWbVABz%2F-Luk4J66CdObS9CA5lcV%2F12.png?generation=1574912215928362\&alt=media)

**3.3** 在代码的第105行，输出“{“ 的位置，双击鼠标，在该位置添加断点；

![](https://8526760-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Luk3T3QoKyS_b-1joBV%2F-Luk3tukeoHpawWbVABz%2F-Luk4J68Cr1Lvs2VeHzD%2F13.png?generation=1574912215747807\&alt=media)

**3.4** 在101行，调用matrixmul() 函数的位置处添加一个断点；

**3.5** 点击 **Step Over (F6)** 按钮 ( ![](https://c/Users/ARTHURLI/Desktop/PYNQ%20DOCS/PynqDocs/images/Chapter_11/74.png) ), 观察代码执行过程中变量的变化；

![](https://8526760-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Luk3T3QoKyS_b-1joBV%2F-Luk3tukeoHpawWbVABz%2F-Luk4J6AvG0l1q0c2XWN%2F14.png?generation=1574912215869130\&alt=media)

![](https://8526760-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Luk3T3QoKyS_b-1joBV%2F-Luk3tukeoHpawWbVABz%2F-Luk4J6CKhXjFViQpu5Q%2F15.png?generation=1574912215919005\&alt=media)

**3.6** 点击 **Resume** ( ![](https://c/Users/ARTHURLI/Desktop/PYNQ%20DOCS/PynqDocs/images/Chapter_11/75.png) ) 按钮或者按**F8\*\***，\*\*代码将执行到 第101行；

可以观察到软件计算的结果，如下图所示；

![](https://8526760-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Luk3T3QoKyS_b-1joBV%2F-Luk3tukeoHpawWbVABz%2F-Luk4J6E1hkBvC5oHjZY%2F16.png?generation=1574912215813044\&alt=media)

**3.7** 点击 工具栏**Step Into (F5)** 按钮(![](https://c/Users/ARTHURLI/Desktop/PYNQ%20DOCS/PynqDocs/images/Chapter_11/76.png) ) 会跳转到 **matrixmul** 函数；

**3.8** 点击 工具栏**Step Over (F6)** **几次，观察运算过程，**&#x7136;后点击工具栏 **Step Return (F7)** 按钮可以返回到调用它的测试代码主程序内；

**3.9** 代码将停留在 105 行的断点处. 观察软件计算与硬件计算结果。

![](https://8526760-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Luk3T3QoKyS_b-1joBV%2F-Luk3tukeoHpawWbVABz%2F-Luk4J6GXmFhv6Rta5xa%2F17.png?generation=1574912215751386\&alt=media)

**3.10** 在第134行设置断点 (**return err\_cnt;**&#x4F4D;置)，点击**Resume** 按钮；

在Console窗口打印仿真结果。

**3.11** 点击工具栏 **Resume**按钮或者**Terminate**按钮结束调试会话。

## 步骤4：设计综合

#### 4.切换到综合 (Synthesis) 界面，观察综合过程。

**4.1** 点击右上角的 ![](https://c/Users/ARTHURLI/Desktop/PYNQ%20DOCS/PynqDocs/images/Chapter_11/77.png) ，切换到综合（Synthesis）界面；

**4.2** 点击 **Solution > Run C Synthesis > Active Solution** 或者工具栏的 ![](https://c/Users/ARTHURLI/Desktop/PYNQ%20DOCS/PynqDocs/images/Chapter_11/78.png) 按钮开始综合；

**4.3** 综合完成后会显示综合报告，报告中包含了性能与资源预估，以及设计的延时信息；

![](https://8526760-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Luk3T3QoKyS_b-1joBV%2F-Luk3tukeoHpawWbVABz%2F-Luk4J6IbKBsjeo1Y2C6%2F19.png?generation=1574912215870782\&alt=media)

**4.4** 综合后生成的文件如下所示；

![](https://8526760-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Luk3T3QoKyS_b-1joBV%2F-Luk3tukeoHpawWbVABz%2F-Luk4J6KNddd9TPsmpP8%2F20.png?generation=1574912215820968\&alt=media)

**4.5** 报告中还包含了顶层接口信号

![](https://8526760-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Luk3T3QoKyS_b-1joBV%2F-Luk3tukeoHpawWbVABz%2F-Luk4J6Mpqy7mrggXLv9%2F21.png?generation=1574912215757425\&alt=media)

​

## 步骤5：  运行C/RTL 协同仿真，会调用Verilog/VHDL仿真工具进行仿真。

**5.1** 点击 **Solution > Run C/RTL Cosimulation\*\***，打开软件协同仿真工具；\*\*

![](https://8526760-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Luk3T3QoKyS_b-1joBV%2F-Luk3tukeoHpawWbVABz%2F-Luk4J6OgtwnIQZ3qaOS%2F22.png?generation=1574912215800405\&alt=media)

**5.2** 设置仿真工具为**Vivado Simulator**，语言为**Verilog**，Dunp Trace选择为**all**；

![](https://8526760-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Luk3T3QoKyS_b-1joBV%2F-Luk3tukeoHpawWbVABz%2F-Luk4J6QPie6zXgqBNuH%2F23.png?generation=1574912215797688\&alt=media)

**5.3** 仿真报告如下所示；

![](https://8526760-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Luk3T3QoKyS_b-1joBV%2F-Luk3tukeoHpawWbVABz%2F-Luk4J6STY83MZpv0Vs9%2F24.png?generation=1574912215755026\&alt=media)

**5.4** 点击工具栏的**Open Wave Viewer…**&#x67E5;看硬件仿真波形；

![](https://8526760-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Luk3T3QoKyS_b-1joBV%2F-Luk3tukeoHpawWbVABz%2F-Luk4J6UJzoRTwZVSI4q%2F25.png?generation=1574912215712094\&alt=media)

## 步骤6：导出 RTL代码与实现结果

### 在 Vivado HLS, 选择Verilog，导出硬件设计, and run the implementation by selecting Evaluate option.

**6.1** 选择 **Solution > Export RTL** 或者点击工具栏 ![](https://c/Users/ARTHURLI/Desktop/PYNQ%20DOCS/PynqDocs/images/Chapter_11/79.png) 按钮；

**6.2** 选中 *Vivado synthesis, place and route* 复选框来运行实现（implementation） 工具

![](https://8526760-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Luk3T3QoKyS_b-1joBV%2F-Luk3tukeoHpawWbVABz%2F-Luk4J6W-xi0bS2L86ET%2F28.png?generation=1574912215759835\&alt=media)

**6.3** 点击 **OK** ，设计实现将开始运行，完成后的设计实现报告如下；

![](https://8526760-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Luk3T3QoKyS_b-1joBV%2F-Luk3tukeoHpawWbVABz%2F-Luk4J6Yk9R92VjTSI-4%2F29.png?generation=1574912215805099\&alt=media)

**6.4** 生成的IP被以zip file格式存放到了impl\ip目录下.

![](https://8526760-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Luk3T3QoKyS_b-1joBV%2F-Luk3tukeoHpawWbVABz%2F-Luk4J6_zDxieMg3fOto%2F30.png?generation=1574912215767995\&alt=media)

\
**6.5** 点击**File > Exit**，关闭HLS工具
