Vivado_HLS 学习笔记2-接口综合
常见的模块接口
如果设计的模块有IO的协议要求,应该尽早地在设计过程中进行设置.
-
数组Port
- 设置为单端口的RAM: Directive-> Resource -> core: RAM_1P_BRAM. : RTL中最终不会包括该外部的BRAM, 而是需要你在vivado中添加一个RAM以和该设计IP连接;
- 多端口RAM(一般把输入端口设置为多端口):ap_memory 注意必须进行循环展开,否则一个循环只会读取一个RTL端口的数据,就算directive指定了多端口也没用.
- 设置为FIFO接口(一般把输出端口设置为FIFO) ap_fifo;
- 数组分块(循环展开时): 输出端口Directive-> ARRAY_PARTITION-> type: block, factor:4; 若输入为双口RAM,则输入端口Directive-> ARRAY_PARTITION-> type: block, factor:2;
可以学习ug871的Ch4 lab3 and lab4.
-
Scalar Port(传值的形参)
- 添加输入有效vld信号: Directive-> Interface -> mode: ap_vld. 当port_vld为高,模块内才会读port.
- 添加输出应答ack信号: Directive-> Interface -> mode: ap_ack. 当模块读port,port_ack才会拉高.
- 添加握手(以上两个) : Directive-> Interface -> mode: ap_hs.
- 不需要添加控制端口: Directive-> Interface -> mode: ap_none.
-
双向IO(传指针的形参):
- 添加有效vld信号: Directive-> Interface -> mode: ap_vld.
- 添加应答ack信号: Directive-> Interface -> mode: ap_ack.
- 添加握手(以上两个): Directive-> Interface -> mode: ap_hs.
- 不需要添加控制端口: Directive-> Interface -> mode: ap_none.
- 添加输出有效ovld信号: Directive-> Interface -> mode: ap_ovld. 输入无vld信号
- 添加FIFO接口: Directive-> Interface -> mode: ap_fifo,包括输出的写使能和输入的FIFO满信号;
- 添加HLS总线协议: Directive-> Interface -> mode: ap_bus
-
Block-level Protocol: 用于模块的控制端口的协议设计
- 当模块内消耗多于1个时钟周期,ap_clk和ap_rst会被自动添加;
- 对顶层模块进行Directive -> Interface -> mode: s_axilite, m_axi等
- Block-level的控制协议只有4种: ap_ctrl_none(无附加端口的协议), ap_ctrl_hs(default), ap_ctrl_chain, s_axilite(SoC常用);
- ap_ctrl_none(无附加端口的协议)只能用于组合逻辑电路,仅消耗1个时钟周期的pipeline任务,数组流或hls_stream接口.
- ap_ctrl_hs中, ap_start,ap_done,ap_idle, ap_ready是控制端口,有了它, RTL模块可以被除IO口外的其他端口控制.
- ap_start: 拉高1,并至少维持到ap_ready拉高.ap_ready拉高后,ap_start如果拉低到0,表示C函数将停止运行;如果保持高,则表示C函数将继续运行.
- ap_ready: 可以接收新的数据输入;
- ap_done: 模块计算结束,此时如果有ap_return,则是该数据的有效标志;
- ap_idle: 空闲状态;
- 返回值 ap_return 的接口协议为: ap_ctrl_hs
- clock_enable端口:必须保证是ap_ctrl_hs协议的端口,才可以添加: 选择targeted solution, 右键solution setting-> config_interface -> 勾选clock_enable
- 对输入输出添加寄存器: 必须保证是ap_ctrl_hs协议的端口,才可以添加;
- 设置RTL属性: 右键sollution setting-> config_rtl-> 设置rst_en.
- s_axilite: 使控制端口可被CPU使用.
-
注意一般IO协议一旦设定好,就不会再改变. 因此此类directive应放置到C Source文件中,而不是Driective文件.
结构体struct作为接口
结构体应该在header 文件中定义.
- Data_Pack Mode: 降低latency, 升高Throughput
在directive中定义:
field_level: 每个field会扩展到8-bit;
struct_level: 实际位宽被保留,整体位宽被扩展到8-bit对齐;
枚举类型作为接口
- enum 枚举类型
枚举类型中每个数根据枚举列表顺序,被自动实现为一个integer: 0,1,2...
typedef enum
{
M_INIT,
M_ADD,
M_SUB,
M_HOLD
} mymode_t;
mymode_t mode;