目录
FPGA的设计有许多不同的层级,我们之前学习使用Verilog等HDL语言进行寄存器传输级(Register Transfer Level,RTL)的硬件描述,这种方法相对于更加底层的逻辑门级可以更快速地描述出我们所需要的硬件电路,我们可以得出几个结论:
- 设计的层次越高,描述越抽象
- 设计的层次越高,开发的速度相对更快
- 设计的层次越高,使用的语言越高级
今天我们就开始学习高层次的综合(High Level Synthesis),简而言之,我们将学习如何使用C/C++/SystemC来设计硬件电路,本文主要参考Xilinx手册UG871的内容以及《The Zynq Book》,并且本文只做学习分享之用,无任何商业目的。
HLS的基本原理
HLS要将C代码转换为我们的硬件电路,其中的过程可以说是十分复杂的,但大体来说其主要步骤还是:
C -- 》RTL --》 底层电路
Vivado HLS的工程层次
我们主要使用Vivado HLS进行一个高层次的开发,就像普通的高级语言那样,Xilinx也为HLS开发提供了很多的库:
这些库的使用大家可以参考Xilinx手册UG902,里面有详细的使用介绍。
我们下面开始捋清工程结构:
其实工程结构很简单,比Vivado简单多了。我们要知道,HLS进行功能实现是一方面,另一方面更加重要的,是对综合后的电路进行优化,这里有两个重要的因素:
- 面积,或者说资源成本 — 用来实现所期望的功能所需要的硬件的数量。
- 速度 , 或者具体来说是吞吐率 — 电路能处理数据的速率。
不同的器件,不同的应用场景,造就了同一个功能代码具有许许多多不同的综合结果。这也就是所谓的“条条大路通罗马” ,因此Vivado hls 使用了同一份C代码,不同的Solution,来实现这个功能。
各种不同的Solution,使用了各个不同的Directive(指令)进行优化,最后我们通过查看综合报告来查看Solution是否符合我们的要求,然后再将它们导出为我们的IP核文件,供Vivado调用。
Vivado HLS界面初识
工程创建
创建工程的细节,网上的教程多如牛毛,但我推荐查看UG871手册进行学习。其中有一个关键的步骤就是确定Top Function,这一步要好生注意,这里的Top Function并不是指你C文件的名字,而是你C文件中顶层函数的名字,如果这步搞错,那么综合时会发生找不到顶层函数的错误。
工程界面
- Project Exploer Pane(工程浏览窗口):用来展示工程的层次。当你进行 验证、综合、打包IP核等操作时,各个操作所产生的文件都将自动地生成到对应文件夹中。
- Information Pane(信息窗口):用来显示文件内容,并且,当一个操作完成时,报告文件将会在这个窗口自动打开。
- Auxiliary Pane(辅助窗口):该窗口的内容和信息窗口密切相关,并且显示的内容也是动态调整的,取决于信息窗口打开的文件内容。
- Console Pane(控制窗口):该窗口用来展示Vivado HLS运行时产生的错误和警告信息。
- Toolbar Buttons(工具按钮):我们可以在这个按钮条中找到最常用的功能。
- Perspectives(视图窗口):视图窗口提供了一个很方便的方式去调整Vivado HLS内的窗口,例如可以在 Debug、Synthesis、Analysis三个窗口进行互换。
HLS设计流
设计输入
HLS的设计输入主要是一个C/C++/SystemC函数,以及一个用C语言写的TestBench,和一个验证结果的“黄金参考”。
试着回想一下从前我们做验证的过程:
- 写Verilog
- 写TestBench
- 仿真,看波形
黄金参考的作用就相当于把“看波形”这一步自动化了,Vivado HLS会自动将测试输出进行比对,并且直接告诉你结果。
功能验证
这就是咱们之前说的,TestBench文件和黄金参考共同作用的过程,当然最开始当然还包含对C代码的语法检查等。
高层综合
即分析和处理基于 C 的代码,通过用户所给的指令和约束,来创建出C函数的 RTL 描述。一旦 HLS 过程完成,就会产生一组输 出文件,包括以所需的 RTL 语言写的设计文件。各种日志、输出文件,测试集、脚本等等也会被创建。
实现的评估
根据综合出的报告查看PL 中所需的资源的数量,设计的延迟、所支持的最高时钟频率等等是否符合要求,要是不符合的话就要重新对C代码进行约束。
C/RTL协同仿真
一旦做好了 HLS,产生了等价的 RTL 模型,就在 Vivado HLS 中通过 C/RTL 协同 仿真来与原本的 C/C++/SystemC 代码做比对。这个过程要重用原本的基于 C 的测试集来给 HLS 所产生的 RTL 版本提供输入,然后拿它的输出与预期的值做比对。重要的是,这样就不再需要产生新的 RTL 测试集。这一步就可以看到输出的波形了。
RTL的输出
将设计打包成IP核,在Vivado的系统设计中进行调用。
设计流程图概述
关于两次仿真的区别和联系
总结
了解了HLS的优点、原理、工程架构、设计流程之后,我们就算是开始入门了HLS了;但是哥们我以一个先飞半米的笨鸟的角度来谈,其实HLS的内容真的是太多了,UG902和UG871加起来就有七八百页,并且还有很多繁杂的接口和库函数,可以说HLS的学习是不容易的。
但是不要气馁,事实上HLS的学习适合于一边做项目一边学习,那么多库,那么多手册,不需要你从头看到尾,只要在项目应用的过程中遇见了,就学习,总结,不出几个月其实这部分内容你一定会很熟悉了!
下一节,我想结合官方给的一个例子,来详细说一下 综合报告怎么看,优化的途径有哪些的问题。