Xilinx HLS基础介绍(一)——HLS概念以及接口管理

本文介绍了Vitis HLS的概念及其开发流程,包括C/C++仿真、C综合、C/RTL协同仿真和IP导出等环节。此外,还详细阐述了HLS接口管理中的块级和端口级I/O协议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本期主题:
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中再讲;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值