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

    科技2022-07-13  124

    目录

    第一讲 接口综合的基本介绍第二讲 接口综合—对数组的处理第三讲 接口综合—其他案例演示

    本节主要介绍的是《跟Xilinx SAE 学HLS系列视频讲座》第12,13,14节。 跟Xilinx SAE 学HLS系列视频讲座笔记(1) 跟Xilinx SAE 学HLS系列视频讲座笔记(2)—— 编写高效的C Test Bench 跟Xilinx SAE 学HLS系列视频讲座笔记(3)—— 接口综合 跟Xilinx SAE 学HLS系列视频讲座笔记(4)—— For循环优化 跟Xilinx SAE 学HLS系列视频讲座笔记(5)—— 数组优化 跟Xilinx SAE 学HLS系列视频讲座笔记(6)—— 函数优化

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

    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 >_vldap_ack在数据端口port_name的基础上创建一个额外的应答信号指示< port_name >_ackap_hs使用该类型,则会同时创建额外的数据有效信号和应答信号,其效果相当于ap_vld与ap_ack之和

    4. 信号类型以及对应的接口支持

    5.总结 6. DEMO 视频

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

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

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

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

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

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

    默认情况下,只要数组在顶层函数上,就使用的是ap_memory。无论数组是哪种类型(输入,输出,输入/输出),ap_memory都是默认值 Memory接口说明 接口类型输入/输出说明d_i_address0out读地址,外部的memory需要这个模块读取地址信号,获取数据d_i_ce0out片选信号d_i_q0out输入信号,其输入数据来自外部的memoryd_o_address0out写地址,要将数据往某个地址上去写,外部的memory需要有相应的写地址信号d_o_ce0out片选信号d_o_q0out写使能d_o_d0out输出数据,输出到外部的memory

    案例分析:连接到memory接口 案例分析:ap_fifo ap_fifo: 把对数组、指针和参数引用的读写用FIFO的方式来实现。 总结

    默认情况下,顶层函数上的数组将映射到Vivado HLS确定的单端口或双端口RAM。可以根据数据速率要求对数组进行分解(后续数组的优化将会讲到)ap_fifo也是一个用于数组接口方法,但要求数据流先进先出。

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

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

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

    Processed: 0.009, SQL: 8