资讯详情

高端FPGA为何集体转向NoC?从总线瓶颈到片上网络实战解析

📅 2026/9/19 5:13:51 | 华诺云谱 👁 阅读
高端FPGA为何集体转向NoC?从总线瓶颈到片上网络实战解析
1. 从总线到网络为什么高端FPGA开始集体转向NoC如果你最近两年关注过高端FPGA的选型应该会注意到一个明显的变化AMD Versal、Intel Agilex、Achronix Speedster7t 这些器件的数据手册里除了传统的逻辑资源、DSP、BRAM 之外都开始重点标注一个叫NoCNetwork-on-Chip片上网络的东西。几年前这个词还主要出现在多核处理器和 SoC 的学术论文里现在已经成了高端 FPGA 的标配卖点。这件事的背景其实不复杂。传统 FPGA 内部各模块之间的数据交换靠的是分段式的总线互连——你可以把它理解成一片老城区里的单车道马路谁要用路谁就占着别人只能等。当设计规模小、模块少的时候这种结构简单直接综合工具也好处理。但到了今天一颗高端 FPGA 上可能同时跑着 AI 推理加速器、400G 以太网 MAC、DDR 控制器、视频处理流水线每个模块都在抢带宽总线互连就成了瓶颈布线拥塞、时序收敛困难、功耗飙升工程师花在“让设计能跑起来”上的时间甚至超过了算法本身。NoC 的思路是把计算机网络那套东西搬到芯片内部不再是一条公共马路而是修一张由路由节点和链路组成的网格化交通网数据被打包成固定格式的“包”按地址在网格里逐跳转发。每个模块通过一个网络接口接入互不干扰带宽可以做到很高而且延迟是可预测的。这篇文章我打算把 NoC 这件事讲透它到底解决了什么问题、内部是怎么工作的、在高端 FPGA 上具体怎么用、和传统总线方案比有哪些实打实的优势以及我在实际项目里踩过的坑。不管你是刚接触 FPGA 的新手还是正在做高端器件选型的老手应该都能从中找到对自己有用的部分。2. NoC 到底解决了什么问题传统互连的四个死结2.1 布线拥塞当“连线”比“逻辑”更值钱在传统 FPGA 设计里模块间通信靠的是可编程互连资源。你写 RTL 的时候感觉只是连了几根线但综合布线工具要在有限的金属层上把这些连接实际铺出来。模块一多跨芯片的连线就会指数级增长。我做过一个视频处理项目四个 4K 通道并行处理每个通道有自己的缩放、去噪、色彩空间转换模块最后要汇总到一路输出。用传统 AXI 总线互连的时候布线工具跑了六个多小时最后报告里一片红色——时序不收敛关键路径延迟远超预期。后来把互连改成 NoC 方案同样的逻辑功能布线时间降到四十分钟时序余量还多了 15%。原因很简单NoC 把“任意模块到任意模块”的复杂连线简化成了“每个模块到最近路由节点”的短连线长距离通信交给 NoC 自己的规则化网格去走布线工具的压力小了一个数量级。2.2 时序收敛跨时钟域和长路径的双重折磨传统总线互连还有一个老大难问题跨时钟域。不同模块往往跑在不同频率下总线要做时钟域转换握手信号、FIFO、同步器一大堆每加一个模块就要重新验证一遍。而且总线本身是一段长组合逻辑路径频率上不去想提频就得插流水线插了流水线又增加延迟来回折腾。NoC 天然是多时钟域友好的。每个网络接口可以独立配置时钟数据包在进入 NoC 的时候做一次时钟域转换之后在网格里以 NoC 自己的时钟同步传输到了目的地再转回目标模块的时钟。这样每个模块只需要关心自己和 NoC 接口这一处的时序不用管全局。我在一个多传感器融合项目里六个传感器接口频率从 25MHz 到 200MHz 不等用 NoC 之后时序收敛一次通过这在传统总线方案里几乎不敢想。2.3 带宽争抢QoS 缺失导致的“饿死”现象总线互连的带宽是共享的谁抢到谁用。这在模块少的时候没问题但模块一多就会出现“饿死”一个高优先级的数据流比如实时视频可能被后台的大批量数据搬运比如 DDR 读写堵死导致画面撕裂或者丢帧。NoC 支持QoS服务质量机制可以给不同的数据流分配优先级和带宽保证。比如你可以规定视频流走虚拟通道 0保证最低 2Gbps 带宽DDR 搬运走虚拟通道 1用剩余带宽。这样即使系统负载很高关键业务也不会被影响。这个特性在汽车电子、工业视觉这类对实时性要求高的场景里特别重要。2.4 功耗与面积长连线是功耗大户FPGA 的动态功耗里互连功耗占比很高尤其是长距离的跨芯片连线。NoC 用规则化的短链路加路由节点替代了杂乱的长连线虽然增加了一些路由逻辑但总体上互连功耗是下降的。根据公开的测试数据在同等带宽下NoC 方案的互连功耗比传统总线低 30% 到 50%。面积方面NoC 的规则结构也更利于布局不会像总线那样在芯片中间形成一大块布线“堵点”。3. NoC 的内部构造路由、打包、虚拟通道三件套3.1 路由节点芯片里的“十字路口”NoC 的基本单元是路由节点Router通常按二维网格排列每个节点连接上下左右四个邻居外加一个本地端口连接计算或存储模块。数据从源节点出发经过一系列路由节点的转发最终到达目的节点。路由算法决定了数据走哪条路。最常见的是XY 路由先沿 X 方向走到目标列再沿 Y 方向走到目标行。这种算法简单、无死锁、硬件开销小缺点是流量不均匀时可能不够优。更高级的还有自适应路由会根据当前网络拥塞情况动态选路但实现复杂度高FPGA 上一般用 XY 路由就够了。每个路由节点内部有输入缓冲、仲裁器、交叉开关和输出缓冲。输入缓冲暂存到达的数据包仲裁器决定哪个输入端口的数据优先转发交叉开关把数据从输入端口连到输出端口。这些逻辑看起来简单但要做得高频、低延迟设计上有很多讲究。3.2 数据打包把“消息”切成“包裹”NoC 传输的不是原始信号而是数据包Packet。一个数据包由包头Header、数据载荷Payload和包尾Tail组成。包头里包含目的地址、优先级、包类型等信息载荷是要传的实际数据包尾标记包的结束。为什么要打包因为打包之后网络只需要处理统一格式的包不用关心里面装的是什么。这就像快递公司只负责送包裹不关心包裹里是衣服还是书。打包也方便做流量控制和错误检测。代价是增加了打包和解包的开销对于很小的数据传输这个开销可能不划算所以 NoC 一般适合传输较大的数据块。包的大小可以配置。包太小包头开销占比高有效带宽低包太大一个包占用网络时间长影响其他包的延迟。实际项目里我一般把包大小设在 64 到 256 字节之间具体看数据流的特性。3.3 虚拟通道一条物理线跑出多条逻辑线虚拟通道Virtual Channel是 NoC 里很关键的一个概念。物理上两个路由节点之间只有一组线但通过分时复用可以在这组线上跑多个逻辑通道。每个虚拟通道有自己的缓冲队列互相独立。虚拟通道解决两个问题一是死锁避免不同方向的数据走不同虚拟通道不会互相堵死二是QoS高优先级数据走专用虚拟通道不会被低优先级数据阻塞。在 FPGA 上虚拟通道的数量一般配置为 2 到 8 个太多会消耗大量 BRAM 做缓冲太少又不够用需要根据实际流量权衡。4. 高端 FPGA 上的 NoC 实现以 Versal 和 Agilex 为例4.1 AMD Versal 的 NoC从 DDR 到逻辑的“高速公路”AMD Versal 系列里的 NoC 是一个独立的硬核子系统位于可编程逻辑和 DDR 控制器、PCIe 控制器等硬核 IP 之间。它的主要作用是让逻辑部分访问外部存储和高速接口时不再需要自己搭一套 AXI 互连而是直接通过 NoC 走。Versal NoC 的网格规模根据器件型号不同从几乘几到十几乘十几不等。每个逻辑模块通过 AXI 接口接入 NoC 的网络接口NoC 负责把请求路由到对应的 DDR 控制器或 PCIe 硬核。这样做的好处是逻辑部分的布线压力大大减轻因为到 DDR 的路径不再需要占用可编程互连资源带宽也更有保障NoC 可以做到接近 DDR 理论带宽的利用率。我在 Versal 上做过一个数据采集项目八通道 ADC 同时采样数据要实时写入 DDR 再读出做处理。用传统 AXI 互连的时候DDR 带宽利用率只有 60% 左右而且逻辑布线很紧张。改用 NoC 之后带宽利用率提到 85% 以上逻辑部分的时序也宽松了很多。4.2 Intel Agilex 的 NoC面向异构计算的互连骨架Intel Agilex 的 NoC 设计思路和 Versal 类似也是把硬核 IP 和逻辑部分通过 NoC 连接起来。Agilex 的 NoC 支持 AXI-4 和 AXI-Stream 两种接口可以灵活适配不同的数据流。它的一个特点是支持多播一个数据包可以同时发给多个目的节点这在广播场景下能省不少带宽。Agilex 的 NoC 还和 HBM高带宽内存紧密配合。HBM 的带宽极高但需要很多条并行通道传统互连很难高效利用。NoC 的网格结构天然适合连接 HBM 的多个通道可以把数据均匀分布到各个通道上充分发挥 HBM 的性能。4.3 Achronix Speedster7tNoC 作为核心卖点Achronix 的 Speedster7t 系列直接把 NoC 做成了核心卖点。它的 NoC 是一个二维网格覆盖整个芯片每个逻辑模块和硬核 IP 都接入 NoC。Speedster7t 的 NoC 支持 2D 环面Torus拓扑比普通网格多了边缘回环降低了平均跳数延迟更小。Speedster7t 的 NoC 还支持分段路由数据包可以指定经过哪些中间节点这在做数据流水线的时候很有用。比如你可以让数据先经过一个处理节点再经过一个存储节点最后到达输出节点整个路径在 NoC 里一次配置好不用逻辑部分干预。5. 实操在 FPGA 项目里用起 NoC5.1 选型阶段什么时候该上 NoC不是所有项目都需要 NoC。我的经验是满足以下条件中的两条以上就值得考虑 NoC 方案模块数量超过 6 个且模块间通信频繁有多个高速数据流比如多路视频、多通道 ADC需要同时传输需要访问 DDR 或 HBM且带宽要求超过理论值的 70%时序收敛困难布线时间超过两小时对实时性有要求不能容忍数据流被阻塞如果只是几个模块简单互连传统 AXI 总线或者直接连线更简单没必要为了 NoC 而 NoC。5.2 配置 NoC以 Versal 为例的实操步骤在 Versal 上配置 NoC一般通过 Vivado 的 NoC 配置工具来做。大致步骤如下确定网络接口位置根据逻辑模块的布局选择最近的 NoC 接入点。Vivado 会自动推荐但你可以手动调整原则是让每个模块走最短路径到 NoC。配置带宽和 QoS给每个网络接口分配带宽和优先级。视频流这类实时数据给高优先级和保证带宽后台搬运给低优先级和尽力而为带宽。设置包大小和虚拟通道根据数据流特性设置。大块数据传输用大包小块控制信息用小包。虚拟通道数量根据优先级种类来定一般 4 个够用。生成 NoC 配置Vivado 会生成 NoC 的配置文件综合时会自动例化 NoC 硬核。验证用 Vivado 的 NoC 仿真模型做功能验证确认数据能正确路由带宽和延迟符合预期。这里有个坑要注意NoC 的配置一旦生成修改起来比较麻烦尤其是带宽和 QoS 的调整可能需要重新综合。所以前期规划要尽量准确别等到实现阶段才发现带宽不够。5.3 数据流设计让 NoC 跑满带宽的几个技巧NoC 的带宽很高但要跑满并不容易。我总结了几条经验数据要连续NoC 喜欢大块连续数据零散的小数据传输效率低。如果数据源是零散的先用 FIFO 或 BRAM 攒成块再发。地址要对齐NoC 的传输效率对地址对齐敏感尽量让数据包的起始地址对齐到包大小的整数倍。避免拥塞多个数据流尽量走不同的虚拟通道避免在同一个路由节点上打架。如果发现某个区域拥塞可以调整模块布局把流量分散开。监控带宽Versal 和 Agilex 都提供了 NoC 性能监控接口可以实时读取各通道的带宽利用率。调试阶段一定要用起来别凭感觉猜。6. 常见问题与排查技巧实录6.1 NoC 配置后时序不收敛怎么办这是最常见的问题。NoC 本身是硬核时序是固定的问题一般出在逻辑模块到 NoC 接口这一段。排查思路检查接口时钟是否匹配。NoC 接口有自己的时钟要求逻辑模块的时钟如果和 NoC 时钟差距太大跨时钟域逻辑会很难收敛。检查接口逻辑是否太复杂。有些工程师喜欢在接口上做很多处理比如位宽转换、协议转换这些逻辑如果太长会成为关键路径。建议把接口逻辑简化复杂处理放到 NoC 之后做。用 Vivado 的时序报告定位具体路径如果是接口路径考虑插流水线。6.2 带宽达不到预期怎么调先确认理论带宽和实际带宽的差距。如果差距在 20% 以内一般是正常开销如果差距很大检查以下几点包大小是否太小。包太小包头开销占比高有效带宽低。试着增大包大小。是否有拥塞。用性能监控看各路由节点的利用率如果某个节点接近 100%说明那里是瓶颈调整路由或模块布局。虚拟通道是否够用。如果所有数据都挤在一个虚拟通道里即使物理带宽够也会因为缓冲不足而丢包重传降低有效带宽。6.3 NoC 和逻辑模块的复位顺序NoC 是硬核复位和逻辑模块的复位是独立的。如果复位顺序不对可能出现 NoC 还没准备好逻辑模块就开始发数据导致数据丢失。正确的顺序是先复位 NoC等 NoC 就绪信号拉高再释放逻辑模块的复位。这个细节在文档里往往一笔带过但实际项目中很容易踩坑。6.4 常见问题速查表问题现象可能原因排查方法解决措施时序不收敛接口逻辑太长看时序报告关键路径简化接口逻辑插流水线带宽不足包太小或拥塞看性能监控增大包大小调整路由数据丢失复位顺序不对检查复位时序先复位 NoC 再放逻辑延迟过大路由跳数太多看数据包路径调整模块布局减少跳数功耗偏高虚拟通道太多看功耗报告减少虚拟通道数量7. 我踩过的坑和几条实在建议第一个坑是过度设计。刚开始用 NoC 的时候我给每个模块都配了最高优先级和最大带宽结果 NoC 配置复杂得要命资源消耗也大实际跑起来发现根本用不到那么多带宽。后来学乖了先按最低配置来不够再加反而更稳。第二个坑是忽视仿真。NoC 的仿真模型跑起来比较慢我一开始偷懒跳过仿真直接上板结果数据路由错了查了两天才发现是目的地址配错了。后来老老实实做仿真虽然花时间但省了更多调试时间。第三个坑是模块布局随意。NoC 的性能和模块在芯片上的物理位置关系很大。我一开始没在意把两个通信频繁的模块放在芯片两端数据要穿过整个 NoC 网格延迟很大。后来调整布局把相关模块放在相邻区域延迟降了一半。几条实在建议NoC 的配置要留余量带宽用到 70% 左右就该考虑扩容调试阶段一定要用性能监控数据比感觉可靠模块布局要提前规划别等实现阶段再调复位顺序这种细节要写进设计规范别靠记忆。8. 从 NoC 看 FPGA 的演进方向NoC 在高端 FPGA 上的普及反映了一个更大的趋势FPGA 正在从“可编程逻辑器件”变成“可编程异构计算平台”。芯片上不只有逻辑资源还有硬核处理器、AI 引擎、高速接口、大容量存储这些资源之间的高效互连成了关键。NoC 就是解决这个问题的答案。对工程师来说这意味着技能栈要更新。以前会写 RTL、会做时序约束就够了现在还要懂 NoC 配置、QoS 管理、异构资源调度。这些知识在传统 FPGA 教材里很少涉及得靠项目里一点点积累。我个人的体会是NoC 并没有让设计变简单而是把复杂度从“布线时序”转移到了“架构规划”。以前是工具帮你解决互连问题现在是你自己要在架构层面想清楚数据怎么流。这个转变对工程师的要求更高了但也更有意思——你不再只是写代码的人而是系统架构的设计者。后续如果要做更深入的研究可以关注 NoC 的容错机制和动态重构。FPGA 的可重构特性加上 NoC 的灵活路由理论上可以做到运行时动态调整数据通路这在自适应计算场景里很有想象空间。不过目前工具链的支持还不够成熟实际落地还有距离。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。