4、片上网络(NoC)架构:NoC基本概念、路由节点设计、网络接口、NoC vs 传统总线
各位同学,今天我们来聊聊片上网络。说实话,我刚入行那会儿,芯片里互联的主流还是总线。但随着多核数量从几个涨到几十个,总线那套东西就开始吃力了。我记得第一次接触NoC是在一个16核的AI加速器项目里,当时总线仲裁器的面积都快赶上一个小核了——这显然不是长久之计。
4.1 NoC基本概念
NoC,全称Network-on-Chip,说白了就是把计算机网络那套思想搬到芯片内部。你想想看,城市里交通拥堵了怎么办?修更多路、建立交桥、搞交通管制。NoC的思路类似——用路由节点和链路组成网络,让数据包在芯片里“跑”起来。
核心组件其实就三样:
- 路由节点(Router):相当于十字路口的交警,决定数据往哪走
- 网络接口(NI):把IP核的请求“翻译”成网络能懂的数据包
- 链路(Link):物理连线,数据在上面跑
我习惯把NoC比作一个快递系统。IP核是发货方和收货方,网络接口是快递站,路由节点是分拣中心,链路就是运输路线。数据包就是包裹,里面装着地址信息和数据内容。
关键指标:延迟(Latency)、吞吐量(Throughput)、功耗(Power)、面积(Area)。这四个指标往往互相制约,没有完美的NoC,只有最适合你应用场景的NoC。
为什么会用NoC?因为传统总线在核数超过8个时,性能就开始断崖式下跌。我曾经在一个12核的SoC项目里,总线协议光握手就要好几个周期,更别提仲裁带来的额外延迟了。
4.2 路由节点设计
路由节点是NoC的心脏。我建议你把它想象成一个五口交换机——东、南、西、北四个方向连邻居,还有一个口连本地IP核。每个口都有输入缓冲、路由计算、交换分配和交叉开关这几部分。
设计路由节点时,有几个关键点要注意:
- 路由算法:决定数据包走哪条路。最简单的就是维序路由(Dimension Order Routing),比如先走X方向再走Y方向。我项目中用过XY路由,实现简单,但遇到拥塞就傻眼了。
- 流控机制:防止数据包把缓冲区撑爆。常用的是信用制(Credit-based)和握手制(Handshake)。
- 仲裁策略:多个输入口都想用同一个输出口时,谁先走?轮询(Round Robin)最公平,优先级仲裁适合实时性要求高的场景。
我的经验:路由节点的缓冲区大小很讲究。太大浪费面积,太小容易丢包。我一般先做性能仿真,找到延迟和面积的平衡点。曾经有个项目,缓冲区从4个flit减到2个,面积省了30%,延迟只增加了5%。
下面是一个简单的路由节点内部结构图,我手绘了一个:
4.3 网络接口(NI)
网络接口是IP核和NoC之间的“翻译官”。IP核不懂什么数据包、flit,它只知道发请求、收响应。NI要做的事情就是:把IP核的请求打包成数据包,加上路由信息,然后扔进网络;反过来,从网络收到数据包后,解包,提取数据,再交给IP核。
我建议NI设计时重点关注以下几点:
- 协议转换:把AXI、AHB这些总线协议转成NoC内部协议。这个转换逻辑写起来挺烦的,但必须做对。
- 打包/解包:数据包格式要设计好。我习惯用头flit带路由信息,体flit带数据,尾flit带校验。
- 缓冲管理:IP核和NoC速度不匹配时,NI里的缓冲就派上用场了。
避坑指南:我曾经在一个项目里,NI的打包逻辑写错了,导致数据包的路由信息被覆盖。结果数据在网络上乱窜,最后跑到一个完全不相关的核里去了。排查了整整两天才找到问题。所以,NI的验证一定要做充分,特别是边界情况。
4.4 NoC vs 传统总线
这个问题我经常被问到。直接上对比表吧:
| 对比维度 | 传统总线 | NoC |
|---|---|---|
| 可扩展性 | 差,8核以上性能骤降 | 好,支持几十到上百核 |
| 带宽 | 共享带宽,竞争激烈 | 分布式带宽,并行传输 |
| 延迟 | 短距离低,长距离高 | 跳数决定,可预测 |
| 功耗 | 全局连线长,功耗高 | 分段连线,局部化 |
| 设计复杂度 | 简单,成熟 | 较高,需要网络知识 |
| 适用场景 | 小规模SoC(4-8核) | 大规模多核/众核 |
说白了,总线就像一条单车道公路,车多了就堵。NoC就像城市路网,有主干道、支路、立交桥,车再多也能分流。但NoC也不是万能的——如果只有两三个核,用NoC反而浪费面积和功耗。
我个人的经验是:8核以下用总线,8-16核可以考虑混合架构(局部总线+全局NoC),16核以上就老老实实用NoC吧。这个分界线不是绝对的,还得看你的应用场景。比如实时性要求高的系统,NoC的延迟抖动可能是个问题。
总结一下:NoC的核心优势在于可扩展性和并行性。路由节点是性能关键,NI是协议适配的关键。选不选NoC,看你的核数、带宽需求和延迟要求。没有最好的架构,只有最合适的架构。
好了,这一章就到这里。下一章我们会深入NoC的拓扑结构,看看Mesh、Torus、Fat Tree这些拓扑到底有什么区别,各自适合什么场景。
公众号:蓝海资料掘金营,微信deep3321