前言

实验室项目需要,需要将在服务器段跑出的网络参数配置到FPGA上,一种方法是直接利用verilog或者vhdl直接去写一个网络的前向传播模型,另一种就是用 C/C++ 来描述网络的前向传播模型,然后利用Vivado的HLS将其转化为硬件描述语言——verilog或者vhdl。第一种方法资源利用率高,但需要考虑时序和并行性(硬件语言设计的两个重要因素),这一点比较困难;第二种方法相对高效且容易一点;作为一个新手,本着先将流程跑通的想法,我选择了第二种方法作为首次尝试的方法,通过高亚军老师的视频课来学习的,附上链接:https://www.bilibili.com/video/av41246874

先来谈谈CPU、GPU、DSP、FPGA之间的区别:https://blog.csdn.net/Qiuoooooo/article/details/81779583

对于一个软件工程师,应该掌握的程度:

  1. FPGA内部每个单元的功能;
  2. 具体的算法操作和每个单元之间的对应关系;
  3. 算法模型中资源的利用率;
  4. 算法模型的优化方法;

总结起来就一句话“怎样能使得我们用C/C++转化成的HDL代码可以高效运行?

一. Vivado HLS的工作原理

1. History of ESL(Electronic System Level)

 CAD-CAE-EDA- Computer Aided Design- Computer Aided Engineering- Electronic Design Automation

在EDA这个阶段,最典型的特征就是出现了硬件描述语言——VHDL和Verilog;

到了现在,就出现了ESL(电子系统级设计方法)这个概念,它的本质是在说在ESL这个阶段我们希望采用具有更高抽象度的方式去描述系统行为,所以在这个阶段有两个显著特征:

  • 使用高级语言(例如C或者C++),XILINX有Vivado HLS这个工具;
  • 使用基于模型的设计工具——System Generator;

2. High-level Synthesis Benefits

  • 对于硬件工程师,提高项目效率,不需要考虑并行性和时序的问题,直接在算法级考虑优化;
  • 对于软件工程师,可以提高系统性能,原来需要CPU、GPU或者DSP才能实现的算法现在都可以通过FPGA来实现,一方面提高了吞吐率,另一方面也改善了功耗;
  • 在C/C++这个层面开发算法并且验证;
  • 通过优化工具来高效指导转化过程;

在算法描述完成后,需要一个相应文本来测试我们的算法,

3. Vivado HLS的综合流程

  • Scheduling:确定每个时钟周期应该做什么操作,同时这个操作大概需要几个时钟周期完成,以及是否可以并行执行;
  • Control Logic Extraction:控制逻辑的提取通常会生成一个状态机,这个可以在HDL代码中看到;
  • Binding:确定每个操作需要用什么资源去实现,完成这样的一个从操作到资源映射过程;

下面来看一下对于这几个过程的实例:
Scheduling and Binding Example的例子如下,下面这个例子比较简单,所以只有一个状态C0;

扩至逻辑的提取例子,有四个状态,在C0状态执行b+c,C1状态产生x和数组的地址,C2状态执行相应的乘法操作,C3状态将结果写入y数组的对应位,如此循环几次,直到到达循环边界退出循环。需要注意的是,生成的控制状态(左下)和状态机(右下)不是一一对应的,但它们之间非常接近。

4. Vivado HLS设计流程

  • Vivado HLS的设计输入包括Test bench、C/C++和Directives,相应的设计输出有IP(在Vivado的IP Catalog中)、DCP(RTL代码综合后的网表文件)、SysGen(HLS之后的结果可以导入SysGen中使用)。
  • Test bench的作用有两点:一是验证C/C++代码的正确性;二是在与RTL的协同仿真阶段,生成用于RTL级验证的Test bench;
  • 对于一个工程,只可以有一个顶层的函数用于综合,这个函数下面的子函数也可以被综合,通常情况下C/C++综合后的RTL代码的结构和原始的C函数描述的结构一致(除了子函数所需要的逻辑量很小、算法功能很简单时,综合阶段不会单独有这个结构,将HLS INLINE off关掉时就会完全一致)。
  • 并不是所有的C/C++语言风格的代码都能被综合,有两点需要注意:一是动态内存分配,二是操作系统层面
  • 一个C/C++代码最后映射到RTL代码有三大类接口,包括Block-level IO Handshake(握手信号)、C Inputs、C Outputs;

Directives的两种方式

  • 将每个directive以directives.tcl格式作为一个Tcl命令单独存放,以"#"作为标识;
    优势在于:每个solution都有独立的directives,如果这个solution需要重新综合,那么只有这个solution下面的directive会起到作用;不足之处在于:如果C source code文件需要被给到第三方,那么需要将directives.tcl包含其中,对于一个代码需要获得同样的综合结果,那么同样的directives.tcl必不可少。

  • 将每个directive嵌入到C/C++源码中,以pragma格式出现,"%"作为标识;
    优势在于:如果C source code文件需要被给到第三方,不需要单独将directives.tcl交付,对于一个代码需要获得同样的综合结果,也不需要额外的directives.tcl;不足之处在于:如果一个solution需要重新综合,那么所有的directives都要被执行。

几点小技巧

  • 为C/C++代码中的for循环单独创建标签,这会使得在创建directives时非常方便;
  • 最好将directives单独存放,不要将其和源码放在一起;
  • Test bench中的main()函数的返回结果值为int类型,仿真通过返回值为0,不通过才是1;
  • 通常情况下RTL代码的层次和原始的C/C++代码层次一致;

Vivado HLS(High-level Synthesis)笔记一:HLS基本流程相关推荐

  1. 跟Xilinx SAE 学HLS系列视频讲座笔记(1)

    目录 第一讲 工作机制 第二讲 Vivado HLS设计流程相关的概念 1. 传统的设计流程 2. C的设计流程 第三讲 如何处理任意精度的数据类型 第四讲 数据类型的转换 第五讲 了解HLS中的复合 ...

  2. 跟Xilinx SAE 学HLS系列视频讲座笔记(4)——For循环优化

    跟Xilinx SAE 学HLS系列视频讲座笔记(4)--For循环优化 目录 跟Xilinx SAE 学HLS系列视频讲座笔记(4)--For循环优化 第一讲 For循环优化的性能指标 第二讲 fo ...

  3. 【FFmpeg】警告:[hls] pkt.duration = 0, maybe the hls segment duration will not precise

    1.问题描述 在使用ffmpeg编程生成m3u8文件时,报警告 [hls @ 0x7f26b4181840] pkt->duration = 0, maybe the hls segment d ...

  4. 破解HLS低延时的密匙: HLS+技术解密(一)

    大红大紫的2016直播年已经过去大半,如果盘点网络直播领域重大的技术创新,观止云首创的流式HLS技术(观止云首次提出概念并命名其为HLS+)一定值得大书特书,浓墨重彩.HLS+技术面世后在业内引起了极 ...

  5. 【Linux鸟哥笔记】20-启动流程、模块管理与Loader

    [Linux鸟哥笔记]20-启动流程.模块管理与Loader 目录浏览 章节学习 BIOS加载 内核功能 init进程 内核与内核模块 Boot Loader: Grub initrd 文件 启动过程 ...

  6. HLS(High-Level Synthesis)详解——循环体并行优化

    HLS高级综合能够实现软体代码的硬件加速,主要是因为其对代码中的循环体(for,while)等进行了并行性优化,采用流水,展开,合并,嵌套,数据流等方法,将软体中需要一步步执行的循环体,在硬件电路中实 ...

  7. hls fifo_【正点原子FPGA连载】第一章HLS简介--领航者ZYNQ之HLS 开发指南

    1)摘自[正点原子]领航者ZYNQ之HLS 开发指南 2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761 3)全套实验源码+手 ...

  8. php安卓直播抓取,hls,android_安卓大部分浏览器播放HLS协议直播流会从头开始,hls,android,ffmpeg,m3u8 - phpStudy...

    安卓大部分浏览器播放HLS协议直播流会从头开始 遇到的问题 HLS直播流在iOS系统中表现正常, 但在安卓使用大部分浏览器(UC浏览器除外)播放ffmpeg生成的HLS直播流都会发生从头播放的问题, ...

  9. android播放ts格式文件,android上实现离线缓存播放加密HLS视频和未加密的HLS视频...

    1.首先什么是HLS格式的视频,大家去谷歌下就知道了. 2.我们知道HLS格式的视频,只有安卓4.0以上才支持,目前基本4.0一下的机子基本可以考虑,不兼容了,所以为了减少工作量,就没有打算使用三方的 ...

最新文章

  1. 2022-2028年中国ITO薄膜行业市场全景调查及投资前景趋势报告
  2. Linux下KickStart+PXE无人值守装机服务器的配置
  3. python界面开发工具-python图形界面开发用什么
  4. 实战c++中的vector系列--vectorlt;unique_ptrlt;gt;gt;初始化(全部权转移)
  5. Delphi 与 DirectX 之 DelphiX(46): TDIB.DoAntiAlias;
  6. note_maven的pom.xml部分配置说明
  7. python random模块中的指令_python中random模块的使用
  8. Java回顾之JDBC
  9. es中的高效文件读取方式
  10. mongo db 分享 ppt
  11. [HDU6315]Naive Operations(线段树+树状数组)
  12. 计算机上已安装某个第三方应用程序,防止电脑第三方软件“被”安装 3招彻底屏蔽不明软件...
  13. [笔记]深入解析Windows操作系统《一》概念和工具
  14. 计算机房面积设置气消条件,机房消防设计方案
  15. [WDS]Disconnected!
  16. 解决把一篇word文档复制到另一篇word文档时, 更改标题格式
  17. 超级详细的redis命令大全
  18. 【UI设计No7】单页
  19. python信息检索和评价系统_Python爬虫实现的微信公众号文章下载器
  20. 点云平滑之双边滤波适用性分析

热门文章

  1. CrossApp logo 跨平台app开发引擎
  2. 无法解析的外部符号 __imp____iob_func
  3. MySQL 中的 “My” 是什么意思?
  4. max导出fbx动画模型导入unity后播放会出现局部模型扭曲解决办法总结
  5. forest_train训练文件的生成代码
  6. GitHub 上很火的 7 个项目--架构思想精华
  7. MOOS-ivp 实验一 在linux系统中安装moos-ivp遇到的各种问题汇总
  8. 程序员基础的硬件知识(cpu、主板、显卡、内存条等)
  9. antd table自适应(横向滚动条)
  10. 微信内测推出新功能,朋友圈“修改可见范围”