跟Xilinx SAE 学HLS系列视频讲座笔记(3)——接口综合

本节主要介绍的是《跟Xilinx SAE 学HLS系列视频讲座》第13,14,15节。
跟Xilinx SAE 学HLS系列视频讲座笔记(1)
跟Xilinx SAE 学HLS系列视频讲座笔记(2)——编写高效的C Test Bench
跟Xilinx SAE 学HLS系列视频讲座笔记(3)——接口综合

第一讲 接口综合的基本介绍

1. Interface synthesis Overview
跟Xilinx SAE 学HLS系列视频讲座笔记(3)——接口综合
从图中的蓝色部分我们可以了解到,一共要4个参数,in1,in2,in3和return。这些被称为port-level interface protocol。而列表中还包含了几个我们在代码中看不见的接口参数(vivado根据接口类型自动生成的),分别是ap_start、ap_done、ap_idle、ap_ready(下面会讲分别是什么),这些参数被称为block-level interface protocol。(interface protocol表示接口协议)
2. Block-level Interface Protocol
block-level interface protocol只能作用于函数或者函数的返回值

三种可用的协议

  • ap_ctrl_hs。ap_start, ap_ready, ap_idle, ap_done这四个信号将产生。
  • ap_ctrl_none。没有任何块级I / O协议
  • ap_ctr_chain。与ap_ctrl_hs类似,但具有一个附加的输入端口ap_continue,该端口提供来自消耗该块数据提供back pressure。

ap_ctrl hs vs. ap_ctrl_none
ap_ctrl_hs会生成相应的block-level 的接口信号,而ap_ctrl_none则不会生成。3
跟Xilinx SAE 学HLS系列视频讲座笔记(3)——接口综合
Block-level Signals之间的关系

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

跟Xilinx SAE 学HLS系列视频讲座笔记(3)——接口综合
3. Port-level Interface Protocol
跟Xilinx SAE 学HLS系列视频讲座笔记(3)——接口综合

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

对于指针来说,是有输入和输出的。ap_ovld就是一个双向的接口。

对应参数 说明
输入信号 其效果与ap_none是一样的
输出信号 其效果与ap_vld是一样的
双向(in-out)信号 输入使用ap_none处理,输出使用ap_vld处理

其他接口信号

接口信号 说明
ap_vld 在数据端口port_name的基础上创建一个额外的数据有效信号指示< port_name >_vld
ap_ack 在数据端口port_name的基础上创建一个额外的应答信号指示< port_name >_ack
ap_hs 使用该类型,则会同时创建额外的数据有效信号和应答信号,其效果相当于ap_vld与ap_ack之和

跟Xilinx SAE 学HLS系列视频讲座笔记(3)——接口综合
4. 信号类型以及对应的接口支持
跟Xilinx SAE 学HLS系列视频讲座笔记(3)——接口综合
跟Xilinx SAE 学HLS系列视频讲座笔记(3)——接口综合

5.总结
跟Xilinx SAE 学HLS系列视频讲座笔记(3)——接口综合
6. DEMO
视频

第二讲 接口综合—对数组的处理

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

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

我们也可以通过指令,采用其他的选择。

  • 使用单端口或双端口RAM接口
  • 使用FIFO接口
  • 分解为离散接口

案例分析:默认情况下的内存接口

  • 默认情况下,只要数组在顶层函数上,就使用的是ap_memory
  • 无论数组是哪种类型(输入,输出,输入/输出),ap_memory都是默认值
    跟Xilinx SAE 学HLS系列视频讲座笔记(3)——接口综合
    Memory接口说明
接口类型 输入/输出 说明
d_i_address0 out 读地址,外部的memory需要这个模块读取地址信号,获取数据
d_i_ce0 out 片选信号
d_i_q0 out 输入信号,其输入数据来自外部的memory
d_o_address0 out 写地址,要将数据往某个地址上去写,外部的memory需要有相应的写地址信号
d_o_ce0 out 片选信号
d_o_q0 out 写使能
d_o_d0 out 输出数据,输出到外部的memory

跟Xilinx SAE 学HLS系列视频讲座笔记(3)——接口综合
案例分析:连接到memory接口
跟Xilinx SAE 学HLS系列视频讲座笔记(3)——接口综合
案例分析:ap_fifo
ap_fifo: 把对数组、指针和参数引用的读写用FIFO的方式来实现。
跟Xilinx SAE 学HLS系列视频讲座笔记(3)——接口综合
跟Xilinx SAE 学HLS系列视频讲座笔记(3)——接口综合总结

  • 默认情况下,顶层函数上的数组将映射到Vivado HLS确定的单端口或双端口RAM。
  • 可以根据数据速率要求对数组进行分解(后续数组的优化将会讲到)
  • ap_fifo也是一个用于数组接口方法,但要求数据流先进先出。
    跟Xilinx SAE 学HLS系列视频讲座笔记(3)——接口综合

第三讲 接口综合—其他案例演示

1. 如何对输入输出端口添加寄存器
通过向设计的每个数据端口(输入输出端口)添加的寄存器,是解决时序收敛的有效方式,默认情况下Vivado HLS不会添加寄存器。
案例分析:
这个案例执行的是 a ∗ b + c a*b+c ab+c,通过return得到最终的结果。
跟Xilinx SAE 学HLS系列视频讲座笔记(3)——接口综合
跟Xilinx SAE 学HLS系列视频讲座笔记(3)——接口综合
需要强调的是,再添加IO寄存器,需要保证接口为ap_ctrl_hs
2. 如何对设计添加全局的时钟使能信号(Global CE)
全局使能确保时钟稳定后才开始运行,前期时钟不稳定,频率相位会有偏差,对程序有影响。
一但添加这个信号,在综合的端口报告中会出现一个ap_ce这样的信号。在默认的情况下是不会添加这个clock_enable信号的,clock_enable的意思是所有的电路在这个信号使能的情况下,才可以工作。这个可以通过选择目标解决方案并单击Solution Setting来完成。
跟Xilinx SAE 学HLS系列视频讲座笔记(3)——接口综合
3. 案例分析:控制设计IO的数量
以下C函数为两个矩阵的相加,我们的目标是采用更低的延迟和更少的IO数量。
要获得较低的延迟:我们可以采用为 "for-loop’设置pipeline。
跟Xilinx SAE 学HLS系列视频讲座笔记(3)——接口综合
跟Xilinx SAE 学HLS系列视频讲座笔记(3)——接口综合
从以上例子我门可以发现采用Pipeline for-loop可以明显减少latency,但是由于单端口变成的双端口,显然这时候IO的个数是增加的。那么我们如何那获得较少的IO个数,在这之间得到一个平衡点,得到两者的折中。
我们可以对数组进行资源的约束,是它还以单端口的形式出现。
跟Xilinx SAE 学HLS系列视频讲座笔记(3)——接口综合
4.总结
跟Xilinx SAE 学HLS系列视频讲座笔记(3)——接口综合
5. DEMO演示

跟Xilinx SAE 学HLS系列视频讲座-高亚军