控制逻辑提取和 I/O 端口实现示例 - 2023.2 简体中文

Vitis 高层次综合用户指南 (UG1399)

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 简体中文

下图显示了对应此代码示例的控制逻辑的提取和 I/O 端口的实现过程:


void foo(int in[3], char a, char b, char c, int out[3]) {
  int x,y;
  for(int i = 0; i < 3; i++) {
    x = in[i]; 
    y = a*x + b + c; 
    out[i] = y;
  }
}
图 1. 控制逻辑提取和 I/O 端口实现示例

此代码示例执行的运算与前述示例相同。但它在 for 循环内执行运算,且 2 个函数实参为阵列。调度此代码后,生成的设计在 for 循环内执行 3 次该逻辑。高层次综合会从 C 语言代码自动提取控制逻辑,并在 RTL 设计中创建 FSM 以对这些运算进行排序。顶层函数实参在最终 RTL 设计中变为端口。类型为 char 的标量变量将映射到标准 8 位数据总线端口。阵列实参(如 inout)包含完整数据集合。

在高层次综合中,阵列默认综合到块 RAM 中,但有其他选项可供选择,例如,FIFO、分布式 RAM 和独立寄存器。使用阵列作为顶层函数中的实参时,高层次综合假定块 RAM 位于顶层函数外,并自动创建端口以访问位于设计外的块 RAM,例如,数据端口、地址端口和任何必需的芯片使能信号或写使能信号。

FSM 用于控制寄存器何时存储数据并控制任意 I/O 控制信号的状态。FSM 启动状态为 C0。在下一个时钟上,它会按顺序依次进入 C1 状态、C2 状态和 C3 状态。它会返回 C1C2C3 状态总计 3 次,最后返回 C0 状态。

注释: 这与 C 语言代码中 for 循环的控制结构非常相似。状态的完整顺序为:C0{C1, C2, C3}{C1, C2, C3}{C1, C2, C3},然后返回 C0

设计要求仅添加 1 次 bc。高层次综合会将运算移出 for 循环,并移入 C0 状态。每次设计进入 C3 状态时,都会复用加法的结果。

设计会从 in 读取数据,并将数据存储到 x 中。FSM 会为处于 C1 状态的首个元素生成地址。此外,在 C1 状态中,加法器会递增以记录设计必须围绕 C1C2C3 状态进行迭代的次数。在 C2 状态下,块 RAM 会返回 in 的数据,并将其存储在 x 变量中。

高层次综合会从含其他值的 a 端口读取数据,以执行计算,并生成首个 y 输出。FSM 可确保生成正确的地址和控制信号,以将该值存储在块范围外。随后,设计会返回 C1 状态以从阵列/块 RAM in 读取下一个值。此进程将持续直至写完所有输出为止。随后,设计会返回 C0 状态,以读取 bc 的下一个值,以重新开始此进程。