Versal NoC实战指南:从架构原理到Vivado配置与性能调优

发布时间:2026/9/20 14:51:52
Versal NoC实战指南:从架构原理到Vivado配置与性能调优
1. 为什么NoC是Versal区别于传统FPGA的关键第一次在Vivado里打开Versal的Device视图时很多人会愣一下芯片中间那一大片规整的网格是什么它不像CLB阵列也不像DSP列更不是BRAM。那就是NoCNetwork on Chip片上网络也是Versal和之前所有FPGA系列最本质的分水岭之一。传统FPGA做数据搬运靠的是可编程逻辑里手写的AXI互联、SmartConnect或者自己搭的仲裁逻辑。数据从DDR到PL从PL到AI Engine从PS到PL每一条路径都要消耗LUT、FF和布线资源而且时序收敛的难度随着并发通路数量指数级上升。到了Versal这一代AMD干脆把一块专用的、硬核化的片上网络塞进了芯片让数据搬运这件事从用逻辑搭变成用硬件走。NoC解决的核心问题就一句话把高带宽、低延迟、确定性的数据搬运从可编程逻辑里剥离出来交给专用硬件去干。它提供的是AXI4接口的硬核交换网络支持NMUNoC Master Unit和NSUNoC Slave Unit之间的多对多连接带宽可以做到TB/s级别而且不占用PL的LUT资源。这篇文章适合谁看如果你已经做过几代Xilinx/AMD FPGA正在往Versal平台迁移或者你手上有Versal的板子但一直只用PL和PS、没碰过NoC那这篇内容就是给你准备的。我会从NoC的架构逻辑讲起然后落到Vivado里怎么配、怎么连、怎么仿真、怎么调最后把我踩过的坑和排查经验一并倒出来。全程按我自己的实操顺序来不搞教科书式的罗列。2. Versal NoC的架构逻辑与核心组件拆解2.1 NoC在Versal芯片里的物理位置与角色Versal的NoC是一张横跨芯片的二维网格位于可编程逻辑和硬化IP之间。它不是一个可选的软核而是芯片出厂就固化好的硬核资源。整张网络由若干条水平Horizontal和垂直Vertical的NoC路径组成交叉点上有交换开关Switch数据包在这些开关之间按路由规则跳转。从使用者的角度看你不需要关心它内部怎么路由你只需要关心两端的接口NMU和NSU。NMU是主端负责把来自PL或PS的AXI事务注入NoCNSU是从端负责把NoC里的事务送到目标比如DDR控制器、PL的BRAM、AI Engine等。一个NMU可以连多个NSU一个NSU也可以被多个NMU访问这就是NoC的多对多能力。为什么AMD要这么设计因为在高性能场景里数据搬运的瓶颈往往不在计算而在怎么把数据及时喂给计算单元。传统做法是用AXI SmartConnect搭一个交叉开关但那个交叉开关是跑在PL逻辑里的频率上不去、资源吃得多、时序难收敛。NoC把这些交换逻辑硬化之后频率可以轻松跑到1GHz以上而且延迟是可预测的。2.2 NMU、NSU与AXI接口的对应关系这里必须把概念理清楚否则后面配IP会晕。NMUNoC Master Unit站在NoC的角度它是发起方。它对外暴露的是AXI Slave接口因为要接收来自PL主机的请求对内把请求打包成NoC的flit流控单元发出去。你可以把它理解成一个翻译官把AXI事务翻译成NoC内部协议。NSUNoC Slave Unit站在NoC的角度它是接收方。它对外暴露的是AXI Master接口因为要主动把数据送给下游对内接收NoC的flit并还原成AXI事务。AXI接口NoC对外的接口全部是AXI4支持AXI4 Full和AXI4 Stream两种。注意NoC本身不直接产生AXI StreamStream的转换要靠AXI Stream Protocol Converter或者DMA。我一开始最容易搞混的就是方向。记住一个口诀NMU的AXI口是SlaveNSU的AXI口是Master。因为NMU是被PL访问的NSU是去访问别人的。2.3 NoC的带宽与延迟特性NoC的带宽取决于你配置的位宽和时钟频率。以Versal Prime系列为例单条NoC路径的位宽可以配到512bit甚至1024bit频率在1GHz左右单条路径的理论带宽就是512bit × 1GHz 512 Gbps ≈ 64 GB/s 1024bit × 1GHz 1024 Gbps ≈ 128 GB/s多条路径叠加整芯片的NoC总带宽可以到TB/s量级。这个数字远超传统PL里手搭的AXI互联。延迟方面NoC的延迟是跳数相关的。数据从NMU到NSU经过的Switch越多延迟越大。所以布局的时候要尽量让通信密集的NMU和NSU在物理上靠近。Vivado在综合时会自动做NoC的布局优化但你在分配NMU/NSU位置时也要有意识。注意NoC的带宽是共享的不是每条路径独享。如果多个NMU同时往同一个NSU打数据NSU会成为瓶颈。这一点和AXI互联的仲裁逻辑是一样的道理。3. Vivado里配置NoC IP的完整实操流程3.1 创建NoC IP核与基本参数设置打开Vivado建议2022.1及以上版本Versal支持更完整在Block Design里Add IP搜索NoC。你会看到几个相关的IPNoC IP核心的NoC配置IP用来定义NMU/NSU的连接关系。AXI NoC Master Unit单独例化NMU时用。AXI NoC Slave Unit单独例化NSU时用。NoC DDR Memory ControllerNoC直连DDR控制器的IP。一般流程是先用NoC IP做全局配置然后Vivado会自动生成对应的NMU和NSU。双击NoC IP进入配置界面第一步是选Number of NMU和Number of NSU。这个数字要根据你的实际数据通路来定不是越多越好因为每个NMU/NSU都占NoC的物理资源。我一般会先画一张数据流图哪些主机要发数据PS、PL的DMA、AI Engine哪些从机要收数据DDR、BRAM、AI Engine、PL的寄存器。然后按主机数NMU数从机数NSU数来配。如果某个主机只访问一个从机可以共用NMU。参数里有一个NoC Clock Frequency默认是1GHz。如果你的PL时钟跑不到1GHz可以降频但带宽会等比下降。还有一个Data Width可选128/256/512/1024bit。位宽越大带宽越高但占用的NoC路径资源也越多。3.2 NMU与NSU的连接关系配置配置完数量后进入Connectivity标签页。这里是一个矩阵行是NMU列是NSU勾选表示这两个之间有通路。Vivado会根据你勾选的关系自动生成NoC的路由。这里有个经验不要全勾。全勾意味着每个NMU都能访问每个NSUNoC内部要生成大量的交换逻辑资源占用和延迟都会上升。只勾实际需要的通路。比如PS只访问DDR那就只勾PS对应的NMU到DDR对应的NSU。每个连接还可以配QoSQuality of Service。QoS用来做带宽分配和优先级仲裁。如果你的系统里有实时性要求高的通路比如视频流给它配高QoS后台批量搬运数据配低QoS。QoS的值是0-15数值越大优先级越高。3.3 地址映射与AXI接口参数在Address标签页里你需要给每个NSU分配地址空间。这个地址空间是NoC内部的地址映射和PS的地址空间是两回事。NoC的地址映射决定了NMU发出的AXI事务里的地址如何被路由到正确的NSU。举个例子NSU0连的是DDR地址范围0x0000_0000到0x7FFF_FFFFNSU1连的是PL的BRAM地址范围0x8000_0000到0x8000_FFFF。当NMU发出地址0x8000_1000的请求时NoC会根据地址映射把它路由到NSU1。AXI接口参数里Protocol选AXI4还是AXI4-LiteData Width要和NoC的位宽匹配。如果NMU的AXI口是512bitNoC内部也是512bit那就直接透传如果不匹配Vivado会自动插入位宽转换逻辑但会消耗额外资源。提示地址映射一定要和PS端的地址分配协调好。我见过有人NoC地址映射配了一套PS端Address Editor配了另一套结果PS访问PL时数据全错。两边必须一致。4. NoC数据通路的仿真验证与调试手段4.1 用AXI VIP搭建NoC仿真环境NoC的仿真和普通AXI仿真不太一样因为NoC是硬核行为模型在Vivado的仿真库里。你需要用**AXI VIPVerification IP**来驱动NMU的AXI Slave口并在NSU的AXI Master口上挂一个AXI VIP作为从机来接收数据。在Block Design里NMU的AXI口可以连一个AXI VIP配置为MasterNSU的AXI口连一个AXI VIP配置为Slave。然后写一个简单的testbench让Master VIP发读/写事务Slave VIP响应观察数据是否正确穿过NoC。这里有个坑AXI VIP默认会打印大量transaction信息仿真日志会爆炸。如果你用的是Synopsys的AXI VIP可以在VIP配置里关掉transaction打印或者把verbosity降到LOW。Vivado自带的AXI VIP也有类似选项在VIP的Logging标签里把Transaction Logging关掉。仿真时重点看几个东西握手信号AWVALID/AWREADY、WVALID/WREADY、ARVALID/ARREADY、RVALID/RREADY是否正常握手。背压Backpressure如果NSU端响应慢NoC会不会正确反压NMU端。这个在仿真里要故意制造慢响应来验证。乱序NoC支持不同ID的事务乱序返回仿真时要检查ID是否匹配。4.2 上板调试ILA与NoC Performance Monitor仿真过了不代表上板没问题。上板后第一件事是挂**ILAIntegrated Logic Analyzer**在NMU和NSU的AXI接口上抓握手信号和数据。ILA的触发条件我一般这么设抓AWVALID和AWREADY同时为高的时刻或者抓RVALID为高但RREADY为低的时刻说明有背压。抓到的波形可以直观看到事务是否正常。Versal还有一个专门的NoC Performance Monitor可以通过AXI-Lite接口读取NoC的带宽、延迟、拥塞统计。这个在Vivado的IP Catalog里搜NoC Performance Monitor就能找到。把它连到NoC的调试端口上然后在PS端用软件读取寄存器就能实时监控NoC的运行状态。我实测下来Performance Monitor最有用的是拥塞计数。如果某个NSU的拥塞计数一直涨说明这个NSU是瓶颈要么加QoS要么把数据分流到别的NSU。4.3 常见仿真与调试问题速查问题现象可能原因排查方法仿真卡死无事务完成握手信号未连接或VIP未启动检查AXI VIP的initial delay和reset数据错误地址映射不匹配对比NoC Address和PS Address Editor带宽远低于预期QoS配置过低或位宽不匹配检查QoS值和Data Width上板后NoC无响应NoC时钟未使能或复位未释放检查NoC的clock和reset连接偶发数据丢失背压处理不当用ILA抓背压时刻的波形5. NoC实战中的性能优化与避坑经验5.1 带宽分配与QoS调优NoC的QoS不是配了就完事要根据实际流量调。我一般会先用Performance Monitor跑一遍实际业务看每条通路的实际带宽占用然后按比例分配QoS。举个例子视频通路需要稳定500MB/sDDR后台搬运需要2GB/s但可以容忍波动。那视频通路的QoS配12后台搬运配4。这样在拥塞时NoC会优先保证视频通路的带宽。QoS的仲裁是在NMU端做的每个NMU可以配独立的QoS。如果一个NMU同时承载视频和后台搬运那就要在NMU内部再做一次仲裁这时候QoS的作用就有限了。所以尽量把不同QoS需求的数据流分到不同的NMU。5.2 避免NoC成为系统瓶颈的布局技巧NoC的物理布局会影响延迟和带宽。Vivado在实现时会自动做NoC布局但你可以通过Pblock或者NoC Placement约束来干预。原则是通信密集的NMU和NSU尽量靠近。比如AI Engine和DDR之间的数据流如果AI Engine的NSU和DDR的NMU在物理上相邻延迟会低很多。Vivado的NoC IP配置界面里有一个Placement标签可以手动指定NMU/NSU的物理位置。还有一个技巧不要把所有的NSU都放在芯片的一侧。NoC是二维网格如果所有NSU都在右边左边的NMU访问时就要横穿整个芯片延迟和拥塞都会增加。均匀分布NSU让流量在网格上分散开。5.3 我踩过的三个典型坑第一个坑NoC复位顺序。NoC的复位必须在上游AXI主机复位之前释放否则NoC还没准备好主机就发事务会导致事务丢失。我当时的做法是把NoC的复位和PS的复位分开控制确保NoC先复位完成。第二个坑地址位宽不匹配。NoC的地址位宽默认是64bit但有些IP只支持32bit地址。如果NMU发64bit地址NSU只认32bit高位会被截断导致访问错误。解决办法是在NoC配置里把地址位宽改成和下游IP一致。第三个坑仿真通过但上板失败。仿真时AXI VIP的响应是理想的上板后DDR控制器的响应有延迟NoC的背压逻辑如果没处理好就会丢数据。后来我在NSU端加了一个小的FIFO做缓冲问题解决。经验NoC的调试一定要用Performance Monitor ILA组合。Performance Monitor看宏观带宽和拥塞ILA看微观握手和时序。两者结合基本能定位90%的问题。6. NoC在典型应用场景中的落地方式6.1 视频处理通路中的NoC应用视频处理是NoC最典型的应用场景。以4K视频为例数据率大约是3840 × 2160 × 30fps × 3byteRGB888≈ 746 MB/s如果做多路视频拼接数据率轻松上到几个GB/s。传统PL互联很难稳定跑这个带宽但NoC可以轻松做到。我的做法是视频输入通过MIPI或SDI进入PLPL做去马赛克和预处理后通过NMU注入NoCNSU送到DDR做帧缓冲。然后AI Engine从DDR读数据做分析分析结果再通过NoC送到PL做叠加显示。整条通路全部走NoCPL逻辑只负责接口转换和预处理不参与数据搬运。这样做的结果是PL资源占用大幅下降时序收敛也容易了。以前用SmartConnect搭的视频通路PL占用率能到70%换成NoC后降到40%以下。6.2 AI Engine与DDR之间的高带宽数据搬运AI Engine阵列和DDR之间的数据搬运是另一个NoC的强项。AI Engine本身有AXI Stream接口但Stream到DDR需要经过DMA。传统做法是用PL里的DMA IP但DMA的带宽受限于PL的时钟和位宽。用NoC的话AI Engine的AXI Stream先转成AXI4然后通过NMU注入NoCNSU直连DDR控制器。整条通路是硬核带宽可以跑到几十GB/s。这里要注意AI Engine的Stream位宽和NoC的位宽要匹配。AI Engine的Stream一般是32bit或64bitNoC是512bit中间需要做位宽转换。这个转换可以在PL里做也可以用NoC IP自带的位宽转换功能。6.3 多主机共享DDR的仲裁策略在一个多主机系统里比如PS PL DMA AI Engine都要访问DDRNoC的仲裁策略直接决定了系统性能。我的经验是PS的访问配高QoS因为PS的访问通常是控制流延迟敏感但带宽不大。PL DMA配中等QoS批量搬运可以容忍一定延迟。AI Engine配低QoS但大带宽因为AI Engine的数据流是持续的需要稳定的带宽而不是低延迟。如果DDR的带宽不够分就要考虑加DDR控制器或者把部分数据放到PL的BRAM里减少DDR的访问压力。7. 从传统AXI互联迁移到NoC的注意事项7.1 设计思路的转变从SmartConnect迁移到NoC最大的转变是从逻辑互联到硬件网络。以前你可以在PL里随便加仲裁器、加FIFO、改位宽现在这些都要在NoC的配置里完成灵活性降低了但性能和资源效率提升了。我的建议是先在新项目里用NoC不要在老项目上硬改。老项目的架构是按SmartConnect的思路设计的强行迁移到NoC会很不顺。新项目从一开始就按NoC的思路规划数据流会顺畅很多。7.2 工具链与版本兼容性NoC的IP在Vivado 2020.1之后才比较稳定建议用2022.1或更新的版本。老版本的NoC IP有bug比如QoS配置不生效、地址映射错乱等。另外NoC的仿真库需要单独编译。如果你用的是ModelSim或VCS要在编译仿真库时把NoC的库加进去。Vivado的compile_simlib命令会自动处理但如果你手动编译要确保NoC的库文件被包含。7.3 团队协作与文档沉淀NoC的配置信息NMU/NSU数量、连接关系、地址映射、QoS最好整理成一张表放在项目文档里。因为NoC的配置在Block Design里是图形化的新人接手时很难快速理解。一张清晰的表格能省很多沟通成本。我一般会做三张表NMU/NSU清单、连接矩阵、地址映射表。这三张表配上Block Design的截图基本就能把NoC的配置说清楚。最后再分享一个小技巧NoC的Performance Monitor寄存器地址在Vivado的Address Editor里可以看到但如果你用的是自定义的软件驱动记得把NoC的地址空间加到MMU的映射表里否则PS访问NoC寄存器会报段错误。这个坑我踩过查了半天才发现是MMU的问题。