本笔记根据《跟Xilinx SAE 学HLS系列视频讲座-高亚军》课程进行学习,仅作为本人学习笔记使用,暂不公开。
相关学习笔记参考了’安静到无声‘同学的博客,在此表示感谢
https://blog.csdn.net/lihuanyu520/article/details/108926806

0、先验知识


软件可编程芯片主要分为几大类:
CPU:管理和调度
DSP:算法上加强,做一些递归算法
DPU:高度并行,适合大数据的流处理

在面对大量计算时,有两种方法:
1、提高主频,即提高CPU的时钟频率,但提升有限
2、增加运算核心,以此提高并行度
但会出现功耗的问题

FPGA
1、内部包含大量的乘法单元
2、SoC,将ARM融合
3、与CPU相比,功耗更优
下图:传统FPGA资源:可编程逻辑、可编程IO、布线资源

随着技术发展,目前FPGA内部的单元越来越多,我们主要关注:存储单元,逻辑单元,算数逻辑单元

逻辑单元:

主要包含查找表(LUT)、MUX、Carry Chain(进位链)

算数逻辑单元

存储单元

大量数据用Block RAM
小数据用LUTin SLICEM

1、软件工程师需要关注什么

优化与资源占用率

2、HLS工作原理

HLS好处有哪些

1、提高系统的性能,以往采用CPU现在可以使用FPGA实现
2、关注算法本身,采用C或C++实现算法,通过工具去转换
3、提升开发效率,指导综合工具,提高转换后的效率
4、用C/C++进行开发和验证,需要做两端

转换过程
上下两图结合看

例子1:

for循环例子

C0状态:先执行“b+c”操作,因为这两个变量求和是固定的数值
C1状态:产生X数组、Y数据的地址
C2:执行相应乘加操作
C3:将结果写入到Y数组

矩阵加法例子

3、与传统流程对比





具体流程
STEP1:C仿真
STEP2:C综合
STEP3:C与RTL协同仿真
STEP4:打包IP
5:查看综合报告
6:查看仿真波形

Solution(解决方案)

波形查看器


总结:

4、HLS设计流程(实操)


实操阶段
PS:可参考7020文件夹下:***16_HLS高级综合工具学习入门***文件进行学习
PS:源文件与TestBench文件,在仿真阶段需要匹配才行

实操暂时留空,各个功能的主要作用暂不清楚

5、任意精度数据类型

5.1、传统C语言数据类型


从硬件角度来看到传统数据类型

5.2、任意精度数据类型


任意精度有点:速度更快(更高的时钟频率),资源占用更少,相同精度

在头文件中申明数据类型,定义的数据会在Outline中进行显示

5.3、sizeof函数查看所占用字节

使用sizeof()函数返回相应的数据类型/变量名,返回其所占用的字节

用法示例

总结:
继承了传统C的数据类型
任意精度,提升硬件效率
定义时,声明在头文件里

6、数据类型的转换(未理解,留坑)

初始化定义

7、HLS中的基本运算



在HLS中,需要定义常数的数据类型




例子:欧几里得算法

HLS不支持递归,需要注意

总结

8、如何高效设计TestBench

1、概念介绍

TB用于验证模型的正确性。Reference Model参考模型的输出结果是正确的,也被称为gold value。

C语言开发tb相较于RTL语言效率更高。

起了两个作用,算法验证与验证RTL的设计(C\RTL协同仿真时)

高效的TB,需要具有以下几点,首先我们得待测函数需要多次执行,多进行遍历,提高代码的覆盖;函数输出需要与我们得参考模型输出的结果进行对比,如果结果正确,返回0,错误返回非0值。

示例:
左侧可视为TB的测试激励stimulus,其reference model即为正确的计算结果。而右侧for循环的,则是调用待测模型函数DUT,进行计算,而后进入计分板进行对比。


C TB在HLS中扮演着重要角色。它可以验证C函数的正确性并验证RTL设计的正确性。

2、测试激励(Stimulus)

定义初始化变量、数组,相对简单
硬入外部文件,相对复杂

读取外部文件


3、输出监测与格式控制

什么是scoreboard,对比DUT 与 golden value

使用if比较,我们允许一定的偏差,我们采用绝对误差的方式进行比较

if ( abs(a-b) < ABSOLUTE ERROR)


如何写数据到外部文件

输出控制符

不同进制的数据输出:整数部分

定点数部分


浮点数部分

总结

9、接口综合

详见官方文档https://www.xilinx.com/html_docs/xilinx2017_4/sdaccel_doc/jit1504034365862.html

1、基本概念

Block-level Interface Protocol
只能作用于函数或者函数的返回值;
三种类型的可用协议包含如下三种
ap_ctrl_none。没有任何块级I / O协议
ap_ctr_chain。与ap_ctrl_hs类似,但具有一个附加的输入端口ap_continue,该端口提供来自消耗该块数据提供back pressure。
**ap_ctrl_hs:**将产生start、ready、idle、done等四种信号

差异在于四个ap信号

通过时序图分析可知
**ap_start:**为高,表示该块可以开始处理数据。
**ap_idle:**高电位表示该模块当前为空闲状态。
**ap_ready:**为高,表示该模块可以接受新数据。
**ap_done:**为高,表示该模块操作已完成(与ap_ready同步)。

端口级接口协议(1)无I/O协议
即ap_none接口是标量输入的默认设置。指定不应将任何I / O协议添加到端口。此端口的参数被实现为没有其他关联信号的数据端口。
ap_stable模式用于配置输入,仅当设备处于复位模式时才会更改。

端口级接口协议(2)Wire Handshakes(有线握手)

其中指针又即为输入,也为输出,同时还有一输出状态位

从下图可以看出ap_ovld的作用

端口级接口协议(3)Wire Handshakes 其他接口


信号对应表



2、对数组的处理

这里所说的数组为顶层函数的形参,不是子函数的形参。
在默认情况下,数组参数将综合到RAM端口,HLS可以将RAM接口指定为单端口或双端口。

  • 如果没有选择单端口或者双端口,Vivado HLS会自动分析设计并选择端口数量以最大化数据率。
  • 如果指定了双端口RAM,但Vivado HLS可以确定仅需要一个端口,则它将使用一个单端口来代替你设置的双端口规则。

也可通过指令,设置其他选项的端口

  • 分解为多种端口
  • 使用FIFO接口
  • 使用双端口或单端口

    示例:
    默认为ap_memory



    示例1:连接到memory接口

    示例2:ap_fifo

把对数组、指针和参数引用的读写用FIFO的方式来实现。

总结:
默认情况下,顶层函数上的数组将映射到Vivado HLS确定的单端口或双端口RAM。
可以根据数据速率要求对数组进行分解(后续数组的优化将会讲到)
ap_fifo也是一个用于数组接口方法,但要求数据流先进先出。

3、其他案例演示

1、对输入输出端口添加寄存器
这种方法可以用来时序收敛

下表1 bi_V_0_data_reg代表形参的ai bi ci都添加了寄存器
下表2 FF代表使用了44个寄存器、
需要强调的是,再添加IO寄存器,需要保证接口为ap_ctrl_hs

2、添加全局的时钟使能信号(Global CE)

全局使能确保时钟稳定后才开始运行,前期时钟不稳定,频率相位会有偏差,对程序有影响。一但添加这个信号,在综合的端口报告中会出现一个ap_ce这样的信号。在默认的情况下是不会添加这个clock_enable信号的,clock_enable的意思是所有的电路在这个信号使能的情况下,才可以工作。这个可以通过选择目标 解决方案 并单击Solution Setting来完成。



3、控制IO个数
以下C函数为两个矩阵的相加,我们的目标是采用更低的延迟和更少的IO数量。
要获得较低的延迟:我们可以采用为 "for-loop’设置pipeline。

从以上例子我门可以发现采用Pipeline for-loop可以明显减少latency,但是由于单端口变成的双端口,显然这时候IO的个数是增加的。那么我们如何那获得较少的IO个数,在这之间得到一个平衡点,得到两者的折中。

我们可以对数组进行资源的约束,是它还以单端口的形式出现。下图红框的应该是for-loop+SPR此处反了


总结:
添加IO寄存器
添加全局时钟使能
设置复位的属性
对IO个数的控制

Xilinx HLS 学习笔记1相关推荐

  1. 3级调度 fpga_Vivado HLS学习笔记——1.了解FPGA架构

    本篇文章为本人学习Xilinx的Vivado HLS教程记录的学习笔记,仅供学习参考. Vivado HLS官方视频教程: 优酷视频​v.youku.com 目录: Vivado HLS课程简介 FP ...

  2. xilinx AXI-CDMA 学习笔记

    此文是笔者记录的 AXI Central Direct Memory Access (CDMA)相关学习笔记及参考例程仿真说明. 仿真环境 win10 64bit vivado 2017.4 mode ...

  3. vivadohlsdsp_Vivado HLS学习笔记

    实验室项目需要,需要将在服务器段跑出的网络参数配置到FPGA上,一种方法是直接利用verilog或者vhdl直接去写一个网络的前向传播模型,另一种就是用 C/C++ 来描述网络的前向传播模型,然后利用 ...

  4. xilinx SoC学习笔记之PetaLinux

    一. PetaLinux概述 PetaLinux 工具提供在 Xilinx 处理系统上定制.构建和调配嵌入式 Linux 解决方案所需的所有组件.该解决方案旨在提升设计生产力,可与 Xilinx 硬件 ...

  5. XILINX GTX学习笔记

    关于GTX接口网上理论的介绍有很多,以及IP核的配置介绍也有,但是没有人介绍说怎么封装用户的接口,我这里简单的说一种方法: 下面是网上搜集的一些GTX的相关资料链接: https://blog.csd ...

  6. xilinx fpga学习笔记5:Xst综合属性

    第六章:设计综合和行为仿真 6.1 设计综合 本节将详细介绍设计综合的概念,综合属性的设置,综合过程的实现,并且通过查看原理图符号更加直观的建立HDL高级描述和FPGA底层源语之间的联系. 6.1.1 ...

  7. xilinx fpga学习笔记2

    第二章:Xilinx FPGA的结构和分类 目前主流的FPGA都采用基于SRAM工艺的查找表结构,也有一些军品和宇航级FPGA采用Flash或者熔丝与反熔丝工艺的查找表结构. 1.查找表的结构和功能 ...

  8. xilinx soc学习笔记之在Ubuntu上安装Qt 5

    介绍 这是将Qt 5.7.0安装到Ubuntu 12.10的教程.它可能用于某些较新版本的Qt和Ubuntu.作为反例,Ubuntu 16.04 LTS使用独立的系统来控制Qt版本.遵循以下针对Ubu ...

  9. 小梅哥Xilinx FPGA学习笔记2——三八译码器

    三八译码器 〇.功能介绍 1.功能描述 2.真值表 一.代码编写 1.设计文件 2.激励文件 3.仿真图 二.总结 三.课后作业 1.设计文件 2.激励文件 3.仿真图 〇.功能介绍 1.功能描述 译 ...

  10. 小梅哥Xilinx FPGA学习笔记1——二选一多路器

    二选一多路器 〇.功能介绍 1.功能描述 2.原理图 一.代码编写 1.设计文件 2.激励文件 3.仿真图 二.总结 〇.功能介绍 1.功能描述 sl为控制信号,a,b为两个输入信号,out为输出信号 ...

最新文章

  1. 软件工程白盒测试的流图怎么画_功能安全理论 | 黑盒 与 白盒
  2. Android事件传递(分发)机制
  3. AngularJS快速入门指南14:数据验证
  4. Kernel Newbies内核开发新手的资源
  5. idea 开启Run DashBoard
  6. python安卓开发实例_python服务器与android客户端socket通信实例
  7. 我的世界服务器怎么在计分板上面显示,我的世界计分板指令教程 计分板指令怎么使用...
  8. 感觉越来越多的人开始向往农村生活,你怎么看?
  9. C语言pop_back用法,【C语言】单链表的所有操作的实现(包括PopBack、PushBack、PopFront、PushFront、Insert)...
  10. Apache+Tomcat实现动静分离
  11. L1W3 用1层隐藏层的神经网络分类二维数据
  12. C# ActionT 委托
  13. python去除空行_python中去掉空行的问题
  14. Java高级特性 集合框架、泛型和Collection(一)(第二十三天)
  15. 能ping通百度,但是上不了网的解决方法
  16. 古代平朔历法基本算法
  17. 博客样式(动态背景线条跟随鼠标移动)
  18. Python:模拟邮箱登陆
  19. 【上市啦】“Python 之父” 力荐的蓝皮书,你知道是哪本吗?
  20. 【STM32】 直插晶振

热门文章

  1. linux pipe 缓冲大小,linux下,pipe的容量的讨论与查看
  2. lighttpd支持AJAX吗,lighttpd配置https
  3. PAT乙级做题部分总结
  4. H5页面跳转到微信公众号首页
  5. 移动端网页字体过多时,字体被自动放大问题
  6. YY/T 0316风险管理对医疗器械得应用学习分享(一)
  7. Teamcenter Item
  8. windows11没有ie浏览器解决办法
  9. 速卖通奇门+聚石塔流程
  10. 9月【笔耕不辍】勋章活动获奖名单公布