下图显示了对应此代码示例的控制逻辑的提取和 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;
}
}
此代码示例执行的运算与前述示例相同。但它在 for 循环内执行运算,且 2 个函数实参为阵列。调度此代码后,生成的设计在 for 循环内执行 3 次该逻辑。高层次综合会从 C 语言代码自动提取控制逻辑,并在 RTL 设计中创建 FSM 以对这些运算进行排序。顶层函数实参在最终 RTL 设计中变为端口。类型为 char
的标量变量将映射到标准 8 位数据总线端口。阵列实参(如 in
和 out
)包含完整数据集合。
在高层次综合中,阵列默认综合到块 RAM 中,但有其他选项可供选择,例如,FIFO、分布式 RAM 和独立寄存器。使用阵列作为顶层函数中的实参时,高层次综合假定块 RAM 位于顶层函数外,并自动创建端口以访问位于设计外的块 RAM,例如,数据端口、地址端口和任何必需的芯片使能信号或写使能信号。
FSM 用于控制寄存器何时存储数据并控制任意 I/O 控制信号的状态。FSM 启动状态为 C0
。在下一个时钟上,它会按顺序依次进入 C1
状态、C2
状态和 C3
状态。它会返回 C1
、C2
和 C3
状态总计 3 次,最后返回 C0
状态。
C0
、{C1, C2,
C3}
、{C1, C2, C3}
、{C1,
C2, C3}
,然后返回 C0
。设计要求仅添加 1 次 b
和 c
。高层次综合会将运算移出 for 循环,并移入 C0
状态。每次设计进入 C3
状态时,都会复用加法的结果。
设计会从 in
读取数据,并将数据存储到 x
中。FSM 会为处于 C1
状态的首个元素生成地址。此外,在 C1
状态中,加法器会递增以记录设计必须围绕 C1
、C2
和 C3
状态进行迭代的次数。在 C2
状态下,块 RAM 会返回 in 的数据,并将其存储在 x
变量中。
高层次综合会从含其他值的 a
端口读取数据,以执行计算,并生成首个 y
输出。FSM 可确保生成正确的地址和控制信号,以将该值存储在块范围外。随后,设计会返回 C1
状态以从阵列/块 RAM in
读取下一个值。此进程将持续直至写完所有输出为止。随后,设计会返回 C0
状态,以读取 b
和 c
的下一个值,以重新开始此进程。