Xilinx HLS 学习笔记1
本笔记根据《跟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相关推荐
- 3级调度 fpga_Vivado HLS学习笔记——1.了解FPGA架构
本篇文章为本人学习Xilinx的Vivado HLS教程记录的学习笔记,仅供学习参考. Vivado HLS官方视频教程: 优酷视频v.youku.com 目录: Vivado HLS课程简介 FP ...
- xilinx AXI-CDMA 学习笔记
此文是笔者记录的 AXI Central Direct Memory Access (CDMA)相关学习笔记及参考例程仿真说明. 仿真环境 win10 64bit vivado 2017.4 mode ...
- vivadohlsdsp_Vivado HLS学习笔记
实验室项目需要,需要将在服务器段跑出的网络参数配置到FPGA上,一种方法是直接利用verilog或者vhdl直接去写一个网络的前向传播模型,另一种就是用 C/C++ 来描述网络的前向传播模型,然后利用 ...
- xilinx SoC学习笔记之PetaLinux
一. PetaLinux概述 PetaLinux 工具提供在 Xilinx 处理系统上定制.构建和调配嵌入式 Linux 解决方案所需的所有组件.该解决方案旨在提升设计生产力,可与 Xilinx 硬件 ...
- XILINX GTX学习笔记
关于GTX接口网上理论的介绍有很多,以及IP核的配置介绍也有,但是没有人介绍说怎么封装用户的接口,我这里简单的说一种方法: 下面是网上搜集的一些GTX的相关资料链接: https://blog.csd ...
- xilinx fpga学习笔记5:Xst综合属性
第六章:设计综合和行为仿真 6.1 设计综合 本节将详细介绍设计综合的概念,综合属性的设置,综合过程的实现,并且通过查看原理图符号更加直观的建立HDL高级描述和FPGA底层源语之间的联系. 6.1.1 ...
- xilinx fpga学习笔记2
第二章:Xilinx FPGA的结构和分类 目前主流的FPGA都采用基于SRAM工艺的查找表结构,也有一些军品和宇航级FPGA采用Flash或者熔丝与反熔丝工艺的查找表结构. 1.查找表的结构和功能 ...
- xilinx soc学习笔记之在Ubuntu上安装Qt 5
介绍 这是将Qt 5.7.0安装到Ubuntu 12.10的教程.它可能用于某些较新版本的Qt和Ubuntu.作为反例,Ubuntu 16.04 LTS使用独立的系统来控制Qt版本.遵循以下针对Ubu ...
- 小梅哥Xilinx FPGA学习笔记2——三八译码器
三八译码器 〇.功能介绍 1.功能描述 2.真值表 一.代码编写 1.设计文件 2.激励文件 3.仿真图 二.总结 三.课后作业 1.设计文件 2.激励文件 3.仿真图 〇.功能介绍 1.功能描述 译 ...
- 小梅哥Xilinx FPGA学习笔记1——二选一多路器
二选一多路器 〇.功能介绍 1.功能描述 2.原理图 一.代码编写 1.设计文件 2.激励文件 3.仿真图 二.总结 〇.功能介绍 1.功能描述 sl为控制信号,a,b为两个输入信号,out为输出信号 ...
最新文章
- 软件工程白盒测试的流图怎么画_功能安全理论 | 黑盒 与 白盒
- Android事件传递(分发)机制
- AngularJS快速入门指南14:数据验证
- Kernel Newbies内核开发新手的资源
- idea 开启Run DashBoard
- python安卓开发实例_python服务器与android客户端socket通信实例
- 我的世界服务器怎么在计分板上面显示,我的世界计分板指令教程 计分板指令怎么使用...
- 感觉越来越多的人开始向往农村生活,你怎么看?
- C语言pop_back用法,【C语言】单链表的所有操作的实现(包括PopBack、PushBack、PopFront、PushFront、Insert)...
- Apache+Tomcat实现动静分离
- L1W3 用1层隐藏层的神经网络分类二维数据
- C# ActionT 委托
- python去除空行_python中去掉空行的问题
- Java高级特性 集合框架、泛型和Collection(一)(第二十三天)
- 能ping通百度,但是上不了网的解决方法
- 古代平朔历法基本算法
- 博客样式(动态背景线条跟随鼠标移动)
- Python:模拟邮箱登陆
- 【上市啦】“Python 之父” 力荐的蓝皮书,你知道是哪本吗?
- 【STM32】 直插晶振