• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Xilinx HLS基础一——HLS概念以和接口管理

武飞扬头像
浪矢杂谈
帮助1

本期主题:
HLS的基础介绍



1.HLS是什么

  • Vitis HLS (High Level Synthesis)是一种高层次综合工具,支持将 C、C 和 OpenCL 函数硬连线到器件逻辑互连结构和 RAM/DSP 块上。(即可以用这些方式来设计IP);
  • Vitis HLS 可在Vitis 应用加速开发流程中实现硬件内核,并使用 C/C 语言代码在 Vivado® Design Suite 中为赛灵思
    器件设计开发 RTL IP;
  • 使用这种方式有很多现成的库,开发效率比RTL更高;

2.HLS开发流程

总体可以将HLS开发流程概括为4个步骤:

  1. C/C 仿真: 添加一个顶层函数,这个函数将来就会映射成RTL电路,之后用一个C testbench对这个函数功能进行验证,在算法层面,检验我们的函数是否能够正常工作
  2. C综合: 综合实际是把C/C 源码综合成RTL实现,产生对应的电路,综合阶段会对各种接口的约束(Directive)十分关心,不同的约束会导致在生成电路时的不同实现;
  3. C/RTL协同仿真: 目的是为了确认C的逻辑和RTL的逻辑是否一致,所以这一步会将RTL仿真的生成结果跟第一步的C仿真结果进行对比;
  4. 导出IP: 最后一步就是export导出IP了

3.HLS接口管理

HLS设计的顶层函数的所有实参都需要综合到端口和接口内,在 RTL 设计中,同样这些输入和输出操作必须通过设计接口中的端口来执行,并且通常使用特定 I/O(输入/输出)协议来进行操作。
对顶层函数进行综合时,函数的实参(或参数)将综合到RTL端口中,此流程称为接口综合(interface synthesis)

看一个简单的例子:

#include "sum_io.h"
dout_t sum_io(din_t in1, din_t in2, dio_t *sum) {
	dout_t temp;
	*sum = in1   in2   *sum;
	temp = in1   in2;
	return temp
}

以上示例包括:

  • 2个输入:in1、in2,这两个输入是按值传递(pass-by-value)
  • 可以进行读取和写入的指针 sum
  • 返回temp
    经过默认接口综合,综合到RTL中,得到结果:
    学新通

其中 HLS 会在 RTL 设计上创建 3 种类型的端口:

  • 时钟和复位端口(clock and reset interface)这种我们一般是改不了,暂时先不用关心;
  • 块级接口协议(block level interface): ap_start、ap_done、ap_ready、ap_idle;
  • 端口级接口协议(port level interface):针对顶层函数和返回值的每个实参而创建的,包括:in1、in2、sum_i、sum_o、sum_o_ap_vld、ap_return;

1.块级I/O协议

Vivado HLS 使用接口类型 ap_ctrl_none、ap_ctrl_hs 和 ap_ctrl_chain 来指定是否使用块级握手信号实现
RTL。
块级握手信号的作用:

  • 表明设计何时开始执行操作;
  • 表明设计操作何时终止;
  • 表明设计何时处于空闲状态,并且何时准备好处理新输入;

其中块级I/O协议有 ap_start、ap_ready、ap_idle、ap_done 端口,这些端口的作用如下:

  • ap_start:用于控制块开始处理数据的时间;
  • ap_ready:用于指示是否已经准备好开始接受输入;
  • ap_idle:用于指示设计是否是处于空闲状态;
  • ap_done:是否已完成操作;

以 ap_ctrl_hs的接口类型为例,来讲解:
学新通
复位后,该IP将会执行以下操作逻辑:

  1. 首先会等待 ap_start 信号变为高,然后才开始操作;
  2. 当 ap_start 变为高时,ap_idle 立即变为低,表明设计此时不再处于空闲状态;
  3. ap_start 信号保持高电平状态,直至 ap_ready变为高,当ap_ready达到高电平后:如果 ap_start为高,则开始下一次的输入传输,如果ap_start为低,则完成当前的传输,然后停止操作
  4. 读取输入端口上的数据;
  5. 将数据写出到输出端口;
  6. 设计操作完成后,ap_done 输出会变为高电平;

2.端口级I/O协议

创建的端口I/O取决于顶层函数的参数类型以及默认值,端口级IO协议用于对进出块的数据进行排序。

根据前面的例子,得出一些结论:

  1. 默认的输入情况下:如果是按值传递(pass-by-value)的实参和指针,都使用简单线性端口来实现,无关联的握手信号,例如前面例子中的in1和in2;
  2. 默认的输出情况下:如果是用指针来实现的输出,需要指示输出数据何时有效,因此有一个关联的输出有效端口 (sum_o_ap_vld)
  3. 同时支持读取和写入的实参:例如前面例子中的sum,就需要将其拆分成独立的输入端口和输出端口
  4. 如果函数具有返回值,实现输出端口ap_return来提供返回值;

端口级I/O协议包括了:

  • AXI4接口
  • 无I/O协议
  • 有线握手
  • 内存接口

这些内容较多,我们在下一篇blog中再讲;

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfjbcjf
系列文章
更多 icon
同类精品
更多 icon
继续加载