ug902-ch1&ch4:Managing Interfaces

本文详细介绍了Vivado HLS中的接口综合概念,包括块级和端口级接口协议,如ap_ctrl_hs、ap_hs等,以及AXI4系列接口的使用方法。通过实例解释了不同接口模式的应用场景,如ap_memory、ap_fifo、ap_bus等,并强调了在设计中正确指定接口的重要性。

Managing Interfaces(ug902 ch1_High-Level Synthesis)

1. Interface synthesis

综合顶级函数时,该函数的参数arguments(或参数parameters)将综合到RTL端口中。 此过程称为接口综合。

Interface Synthesis Overview

#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;
}

上面的示例包括:

  • 两个按值传递的输入in1和in2。
  • 一个指针sum,双向读取和写入。
  • 一个函数返回,temp的值
    使用默认的接口综合设置,将设计综合为一个RTL块,其端口如下图所示
    在这里插入图片描述
    Vivado HLS在RTL设计上创建了三种类型的端口
  • Clock and Reset ports: ap_clk and ap_rst.
  • Block-Level interface protocol. These are shown expanded in the preceding figure: ap_start, ap_done, ap_ready, and ap_idle.
  • Port Level interface protocols. These are created for each argument in the top-level function and the function return (if the function returns a value). In this example, these ports are: in1, in2, sum_i, sum_o, sum_o_ap_vld, and ap_return
块级接口协议

默认情况下,将向设计中添加块级接口协议。这些信号控制块,独立于任何端口级I/O协议。这些端口控制块何时可以开始处理数据(ap_start),何时可以接受新输入(ap_ready),以及设计是否空闲(ap_idle)或完成了操作(ap_done)。

端口级别接口协议

最终一组信号是数据端口。创建的I/O协议取决于C参数的类型和默认值。在使用块级协议启动块的操作之后,使用端口级IO协议将数据按顺序输入和输出块。
默认情况下,按值传递参数和指针的输入被实现为简单的连接端口,没有相关的握手信号。在上面的例子中,输入端口是在没有I/O协议的情况下实现的,只有一个数据端口。如果端口没有I/O协议,(默认或设计)输入数据必须保持稳定,直到读取它。
默认情况下,输出指针是带有一个输出有效信号vld来实现的,以指示输出数据何时有效。如果没有与输出端口相关联的I/O协议,则很难知道何时读取数据。
同时读取和写入的函数自变量被拆分为单独的输入和输出端口。

如果函数有返回值,则使用输出端口ap_return来提供返回值。当设计完成一个事务时(这相当于C函数的一次执行)块级协议指示该函数已使用ap_done信号完成。这还表明端口ap_return上的数据是有效的,可以读取。
注意:顶级函数的返回值不能是指针。 Note: The return value to the top-level function cannot be a pointer
在这里插入图片描述

Interface Synthesis I/O Protocols

通过接口综合创建的接口类型取决于C参数的类型,默认接口模式和INTERFACE优化指令。
在这里插入图片描述

Interface Synthesis Reference包含接口协议的完整细节,包括波形图。以下提供了每种接口模式的概述。

Block-Level Interface Protocols

块级接口协议是ap_ctrl_none、ap_ctrl_hs和ap_ctrl_chain。这些是指定的,并且只能在函数或函数返回上指定。当指令在GUI中指定时,它将把这些协议应用于函数返回。即使函数不使用返回值,也可以在函数返回时指定块级协议。
前面示例中描述的ap_ctrl_hs模式是默认协议。ap_ctrl_chain协议类似于ap_ctrl_hs,但是有一个额外的输入端口ap_continue,它提供来自使用这个块中的数据的块的反压。如果函数完成时ap_continue端口为逻辑0,则块将停止操作,下一个事务将不继续进行。只有当ap_continue被断言为逻辑1时,下一个事务才会继续。
ap_ctrl_none模式实现了没有任何块级I/O协议的设计。
如果函数返回也指定为AXI4-Lite接口(s_axilite),则块级接口中的所有端口都分组到AXI4-Lite接口中。当使用另一个设备(如CPU)来配置和控制这个块何时启动和停止操作时,这是一种常见的实践。

Port-Level Interface Protocols: AXI4 Interfaces

Vivado HLS支持的AXI4接口包括AXI4- stream (axis)、AXI4- lite (s_axilite)和AXI4 master (m_axi)接口,可以这样指定:
AXI4- stream接口:仅指定输入参数或输出参数,而不指定输入/输出参数。
AXI4-Lite接口:指定除流之外的任何类型的参数。您可以将多个参数分组到同一个AXI4-Lite接口中。
AXI4 master接口:仅指定数组和指针(以及c++中的引用)。您可以将多个参数分组到同一个AXI4接口中。

Port-Level Interface Protocols: No I/O Protocol

ap_none和ap_stable模式不向端口添加I/O协议

Port-Level Interface Protocols: Wire Handshakes

ap_hs、ap_vld、ap_ovld
模式ap_hs包括一个带有数据端口的双向握手信号。
模式ap_vld只有一个有效端口,ap_ack只有一个确认端口。
模式ap_ovld与in-out参数一起使用。当in-out被分割为单独的输入和输出端口时,模式ap_none应用于输入端口,ap_vld应用于输出端口。这是读&写指针参数的默认值。
ap_hs模式可以应用于按顺序读写的数组。如果Vivado HLS可以确定读或写访问不是顺序的,它将停止合成与一个错误。如果无法确定访问顺序,Vivado HLS将发出警告。

Port-Level Interface Protocols: Memory Interfaces

默认情况下,数组参数作为ap_memory接口实现。这是一个标准的块RAM接口,具有数据、地址、芯片启用和写启用端口。

ap_memory可以实现为双端口或单端口 。如果Vivado HLS能够确定使用双端口接口将缩短初始间隔II,则会自动实现双端口接口。RESOURCE指令用于指定存储资源,如果该指令数组呗指定a single-port block RAM,则将实现单端口接口。相反,如果使用RESOURCE指令指定了一个双端口接口,如果Vivado HLS确定这个接口没有任何好处,那么它将自动实现一个单端口接口。
bram接口模式的功能与ap_memory接口相同。唯一的不同是在Vivado IP Integrator中如何实现端口:

  • ap_memory接口显示为多个单独的端口。
  • bram接口显示为单个分组端口,可以使用a single point-to-point 连接到Xilinx块RAM。

如果以顺序方式访问数组,则可以使用ap_fifo接口。与ap_hs接口一样,如果Vivado HLS确定数据访问不是顺序的,它将停止访问;如果Vivado HLS无法确定访问是否是顺序的,则报告警告;如果Vivado HLS确定访问是顺序的,则不发出消息。ap_fifo接口只能用于读或写,不能同时用于读和写。
ap_bus接口可以与总线桥进行通信。该接口不遵循任何特定的总线标准,但足够通用,可以与总线桥接一起使用,而总线桥接又与系统总线进行仲裁。总线桥必须能够缓存所有的突发写。

Interface Synthesis and Structs

默认情况

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值