第一讲 接口综合的基本介绍
1. Interface synthesis Overview
从图中的蓝色部分我们可以了解到,一共要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
Block-level Signals之间的关系
ap_start
为高,表示该块可以开始处理数据。ap_idle
:高电位表示该模块当前为空闲状态。ap_ready
为高,表示该模块可以接受新数据。ap_done
为高,表示该模块操作已完成(与ap_ready同步)。
3. Port-level Interface Protocol
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之和 |
4. 信号类型以及对应的接口支持
5.总结
6. DEMO
第二讲 接口综合—对数组的处理
如何将数组映射为相应的RTL接口。这里所说的数组为顶层函数的形参,不是子函数的形参。
在默认情况下,数组参数将综合到RAM端口,HLS可以将RAM接口指定为单端口或双端口。
如果没有选择单端口或者双端口,Vivado HLS会自动分析设计并选择端口数量以最大化数据率。
如果指定了双端口RAM,但Vivado HLS可以确定仅需要一个端口,则它将使用一个单端口来代替你设置的双端口规则。
我们也可以通过指令,采用其他的选择。
使用单端口或双端口RAM接口
使用FIFO接口
分解为离散接口
案例分析:默认情况下的内存接口
默认情况下,只要数组在顶层函数上,就使用的是ap_memory。
无论数组是哪种类型(输入,输出,输入/输出),ap_memory都是默认值
- 无论数组是哪种类型(输入,输出,输入/输出),
ap_memory
都是默认值
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 |
案例分析:连接到memory接口
案例分析:ap_fifo
ap_fifo: 把对数组、指针和参数引用的读写用FIFO的方式来实现。
总结
- 默认情况下,顶层函数上的数组将映射到Vivado HLS确定的单端口或双端口RAM。
- 可以根据数据速率要求对数组进行分解(后续数组的优化将会讲到)
ap_fifo
也是一个用于数组接口方法,但要求数据流先进先出。