第一讲 工作机制
HLS高层次语言开发,高层次语言可以提高生产力,(时序和并行性)时序设计比较困难,并行性实际是vhdl的硬件语言,我们采用c或者c+z主要关心的是算法,对于软件工程师可以提高性能,我们可以通过fpga实现,可以提高性能,改善功能,在c或者c+在这个层面进行开发。
我们做好c和c++算法之后,也还需要有一个测试文本(用c或c++)用于验证。符合我们期望的要求。所以hls生成的hdl的代码,不是让我们看懂的,也不是让我们看的(可读行不高)。所以我们主要是对c或者c++进行优化。vivado将c–>hdl有几个阶段。
第一个阶段 :
scheduling(调度)和control logic extraction(控制逻辑的提取)。完成的是每个时钟周期应该做什么操作,和这个操作需要几个周期来完成以及是否这个操作可以并行执行。
第二阶段:binding。这个阶段主要说明每个操作要用什么样的资源去实现,完成的是一个映射的过程。
总结:
- 了解Vivado HLS的两个阶段scheduling(调度)和control logic extraction(控制逻辑的提取)。
- 了解算法流程图,对Vivado HLS生成的控制状态很有帮助。控制状态在Vivado hls内部去控制那个操作在那个时钟周期去执行。
困惑:
采用这种高级工具就可以转换,这种方法靠谱吗?其实我们需要在原理上清楚,这个是类似于根据算法流程图往有限状态机,通过有限状态机控制算法的进程。后续讲解Vivado HLS设计流程,说明其可行性。
第二讲 Vivado HLS设计流程相关的概念
1. 传统的设计流程
我们需要用硬件描述语言VHDL或verilog等描述我们的算法和测试激励(test batch i.e. 测试文件)。之后执行RTL行为级仿真(这个过程是一个迭代的过程,以验证硬件描述的装确性)。之后执行综合和布局布线,在这个阶段实现设计的收敛(latency,timing,resource)。
2. C的设计流程
我们使用C或者C++来描述我们算法个测试激励(test batch i.e. 测试文件),这个过程也是一个迭代的过程。
然后通过高级综合工具完成C到RTL的转换,在这个阶段实现设计的收敛(latency,timing,resource)。
后续跟传统的RTL一致。之后执行综合和布局布线,综合测试。
第三讲 如何处理任意精度的数据类型
使用编程语言进行编程时,需要用到各种变量来存储各种信息。变量保留的是它所存储的值的内存位置。这意味着,当您创建一个变量时,就会在内存中保留一些空间。您可能需要存储各种数据类型(比如字符型、宽字符型、整型、浮点型、双浮点型、布尔型等)的信息,操作系统会根据变量的数据类型,来分配内存和决定在保留内存中存储什么。下图是基于C++的数据类型。
怎么定义任意精度数据类型的变量
Arbitrary Precision Fixed Point Types的缩写就是ap_fixed
,任意精度定点数类型。
我们采用任意精度的数据类型,我们可以了解到,其各项指标都有了较好的进步。
采用sizeof()返回数据类型(一个变量)。
我们做一些相应的设定就可以了
总结
- Vivado HLS从C / C ++继承基于C的本机数据类型,包括har,short,int,float和double
- Vivado HLS引入了新的数据类型Arbitrary Precision,可提高硬件效率
- 在头文件中定义数据类型是一种更好的做法