2. Versal器件架构与异构计算资源
Versal 是 AMD 面向自适应计算推出的异构 SoC 平台,它的核心思想不是把更多逻辑门堆在一起,而是把不同“计算性格”的引擎放进同一颗芯片,让它们各司其职、按需协作。理解 Versal,关键不是记住某个模块的名字,而是建立一张“谁负责什么、数据怎么走、谁指挥谁”的资源地图。本节围绕这张地图展开,重点讲清 PS、PL、NoC、DSP58、AI Engine 之间的分工与协同。
一、自适应 SoC 的整体分层
Versal 从结构上可以分成三层来看。最上层是处理系统(PS),它包含 Arm Cortex-A72 应用核、Cortex-R5F 实时核、DDR 控制器、外设接口和平台管理单元(PMU)。PS 负责运行操作系统、协议栈、任务调度和系统级控制,是整颗芯片的“大脑”。中间层是可编程逻辑(PL),由可配置逻辑块、Block RAM、UltraRAM 和 DSP58 切片组成,负责高速接口、时序逻辑、数据搬运和确定性流水线。最下层是AI Engine(AIE)阵列,它由大量 VLIW 向量处理器、本地存储器和 AXI 流接口构成,专门处理高吞吐、规则性强的向量与矩阵运算。
这三层不是简单堆叠,而是通过 NoC(Network on Chip) 和 AXI 互联连接成一个整体。NoC 是 Versal 区别于传统 FPGA 的关键:它是一条片上高速数据网络,把 PS 的 DDR、PL 的接口、AIE 阵列和各类硬核 IP 连接起来,让数据不必全部绕经可编程逻辑布线,从而降低拥塞、提高带宽可预测性。
二、NoC:被低估的“数据高速公路”
在传统 FPGA 中,数据从一个模块搬到另一个模块,往往要占用可编程逻辑的布线资源,模块一多就容易出现布线拥塞和时序收敛困难。Versal 的 NoC 把这件事从“逻辑布线”变成了“网络路由”。NoC 由 NMU(Network Master Unit)、NSU(Network Switch Unit)、NCR(Network Coupler/Route)和 NID(Network Slave Unit)等组件构成,支持 AXI4 和 AXI Stream 两种事务类型,并可按 QoS 等级分配带宽。
实际使用中,NoC 的价值体现在三个场景。第一,PS 的 DDR 到 PL 的高速数据搬运,可以走 NoC 而不占用 PL 逻辑;第二,PL 采集的高速数据直接通过 NoC 写入 DDR,再由 AIE 从 DDR 读取,形成“采集—存储—计算”的解耦;第三,多个 AIE 阵列之间或 AIE 与 PL 之间的流式数据,可以通过 NoC 的 AXI Stream 通道传输。配置 NoC 时,需要关注带宽预算、QoS 等级和连接拓扑,避免某条路径成为瓶颈。
三、DSP58 与 AI Engine 的分工
DSP58 是 PL 中的硬核乘加单元,支持 27×18 位乘法、复数乘法和累加,适合做滤波器、混频、FFT 蝶形运算等确定性强的信号处理。它的优势是延迟确定、与 PL 逻辑紧密耦合,适合放在数据流的前端。AI Engine 则是阵列化的 VLIW 向量处理器,每个 AIE Tile 包含向量核、标量核和本地存储器,通过 AXI Stream 与邻居级联,适合做大规模并行、规则性强的运算,比如矩阵乘法、卷积、波束形成和神经网络推理。
一个典型的协同分工是:PL 用 DSP58 完成数字下变频和抽取滤波,把数据率降下来;AIE 阵列接手做 FFT、脉冲压缩或目标检测;PS 负责参数配置、结果汇总和对外通信。这样既发挥了 DSP58 的低延迟,又利用了 AIE 的高吞吐。
四、协同关系中的关键约束
异构协同不是“把任务随便丢给某个引擎”就行,实际工程中有几个硬约束需要提前考虑。第一是数据搬运成本:数据每经过一次 DDR 往返,都会增加延迟和功耗,能流式传递的就不要落 DDR。第二是接口匹配:PL 的 AXI4 接口与 AIE 的 AXI Stream 接口之间需要做位宽、时钟域和握手协议的转换。第三是同步与触发:PS 通过 PL 的寄存器或 AIE 的 GMIO 接口下发参数,需要保证配置在数据到达之前生效。第四是资源预算:AIE 阵列的 Tile 数量、PL 的 DSP58 数量和 NoC 的带宽都是有限资源,需要在设计初期做分配。
五、一个简化的协同示例
假设系统需要处理 1 GSPS、12 位 ADC 采集的数据,做 1024 点 FFT 和简单门限检测。一种合理的映射是:ADC 数据先进入 PL,由 DSP58 完成 4 倍抽取和数字下变频,输出 250 MSPS 的复数数据;然后通过 AXI Stream 送入 AIE 阵列,由多个 AIE Tile 并行完成 1024 点 FFT;FFT 结果在 AIE 内做模值计算和门限比较,只把超过门限的峰值信息通过 NoC 写入 DDR;PS 定期读取 DDR 中的峰值列表,做进一步处理和上报。这个例子里,PL 负责“降速和预处理”,AIE 负责“密集计算”,PS 负责“决策和通信”,NoC 负责“搬运”,四者各司其职。
理解 Versal 的异构架构,最终要落到“什么任务放在哪个引擎、数据怎么在引擎之间流动、瓶颈可能出现在哪里”这三个问题上。把这三个问题想清楚,后续的硬件设计、软件划分和性能优化才有稳定的基础。