在 S_AXILITE 示例 中,所有函数实参均组合到单一 s_axilite
接口适配器内,该接口适配器由 INTERFACE 编译指示中的 bundle=BUS_A
选项来指定。bundle
选项支持您直接将端口组合到同一个接口内。
在 Vitis 内核流程中,应仅有单个接口捆绑,通常工具将其命名为
s_axi_control
。因此,您在该流程中不应指定 bundle
选项,否则综合期间可能会出错。但是,在 Vivado IP 流程中,您可使用 s_axilite
接口来指定多个捆绑,这样将为您定义的每个捆绑创建一个独立的接口适配器。如以下示例所示:void example(char *a, char *b, char *c)
{
#pragma HLS INTERFACE mode=s_axilite port=a bundle=BUS_A
#pragma HLS INTERFACE mode=s_axilite port=b bundle=BUS_A
#pragma HLS INTERFACE mode=s_axilite port=c bundle=OUT
#pragma HLS INTERFACE mode=s_axilite port=return bundle=BUS_A
#pragma HLS INTERFACE mode=ap_vld port=b
*c += *a + *b;
}
综合完成后,Synthesis Summary(综合汇总)报告会提供有关生成的 s_axilite
适配器数量的反馈。此报告的SW-to-HW Mapping(软件到硬件映射)部分包含硬件信息,可显示每个端口的控制寄存器偏移和地址范围。
但捆绑与 s_axilite
接口的搭配使用存在一些规则。
- 默认捆绑名称:此规则将不含捆绑名称的所有接口端口都显式组合到同一个 AXI4‑Lite 接口端口中,并使用工具默认捆绑名称,通常将 RTL 端口命名为
s_axi_<default>
(一般采用s_axi_control
)。在此示例中,所有端口均映射到默认捆绑:void top(char *a, char *b, char *c) { #pragma HLS INTERFACE mode=s_axilite port=a #pragma HLS INTERFACE mode=s_axilite port=b #pragma HLS INTERFACE mode=s_axilite port=c *c += *a + *b; }
- 用户指定的捆绑名称:此规则将具有相同
bundle
名称的所有接口端口都显式组合到同一个 AXI4‑Lite 接口端口中,并以s_axi_<string>
指定的值来命名 RTL 端口。以下示例生成的接口分别名为s_axi_BUS_A
、s_axi_BUS_B
和s_axi_OUT
:void example(char *a, char *b, char *c) { #pragma HLS INTERFACE mode=s_axilite port=a bundle=BUS_A #pragma HLS INTERFACE mode=s_axilite port=b bundle=BUS_B #pragma HLS INTERFACE mode=s_axilite port=c bundle=OUT #pragma HLS INTERFACE mode=s_axilite port=return bundle=OUT #pragma HLS INTERFACE mode=ap_vld port=b *c += *a + *b; }
- 部分指定的捆绑名称:如果您为部分实参指定
bundle
名称,但其他实参则保留不分配,那么该工具会按如下方式来捆绑这些实参:- 按 INTERFACE 编译指示的要求将所有端口组合到指定捆绑内。
- 将不含捆绑分配的所有端口都组合到一个采用默认命名的捆绑内。默认名称可以是标准工具默认名称,如果用户已指定工具默认名称,那么也可采用备用默认名称。
在以下示例中,用户已指定
bundle=control
,即工具默认名称。在此情况下,端口 c 将根据用户指定分配到s_axi_control
,剩余端口将捆绑到s_axi_control_r
下,即工具使用的备用默认名称。void top(char *a, char *b, char *c) { #pragma HLS INTERFACE mode=s_axilite port=a #pragma HLS INTERFACE mode=s_axilite port=b #pragma HLS INTERFACE mode=s_axilite port=c bundle=control }