【IC】NoC设计入门 -- NoC 核心理论与架构
在上一节,我们达成了共识:NoC = 放弃“共享高速公路”(总线),改用“城市街道网”。
现在,我们要深入研究:这个“城市街道网”究竟是如何设计和运行的?
这个阶段是 NoC 的灵魂,请准备好消化一些最核心的概念。我们依然会使用“城市交通”的比喻。
🔬 第二阶段:NoC 核心理论与架构
1. NoC 的“三驾马车”:拓扑、路由、流控
这三者共同决定了 NoC 的形态和效率,它们是密不可分的。
A. 拓扑结构 (Topology):城市是如何规划的?
拓扑,就是“路由器”(十字路口)相互连接的“形状”。 它定义了街道的布局。
- 必学:2D Mesh (二维网格)
- 比喻: 曼哈顿或北京的棋盘式街道网。
 - 结构: 每个“十字路口”(Router)都通过“街道”(Link)连接到它东、南、西、北的邻居。同时,每个路口还连接着一个“功能区”(比如一个 CPU 核)。
 - 为什么主流?
- 规整: 在芯片上布线非常容易、非常规整。
 - 可扩展: 城市想从 3x3 扩展到 4x4,只需要在旁边加一排“路口”就行了,对原有结构影响很小。
 
 - 其他拓扑(了解即可):
- Ring (环形): 像城市里的“二环路”。
 - Torus (环面): 像一个“甜甜圈”,Mesh 的首尾相连版。
 
 
 
B. 路由算法 (Routing):GPS 是如何导航的?
路由,就是“数据包”(车队)用来决定“下一跳该走哪个路口”的规则。
- 必学:确定性路由 (Deterministic Routing)
- 比喻: 一种“死板”的导航规则。
 - 含义: 从A点到B点,永远只有一条固定的路径。
 - 最经典的算法:XY 路由 (用于 Mesh 拓扑)
- 规则: “先走X方向(东西),直到X坐标对齐;再走Y方向(南北)。”
 - 举例: 你的车队要从 (0, 0) 的“家”开到 (2, 1) 的“商场”。
 - 路径: (0,0) → (1,0) → (2,0) → (2,1)。绝不允许 (0,0) → (0,1) → (1,1) → (2,1)。
 - 为什么用它? 它超级简单(硬件实现容易),并且有一个天大的好处:能避免死锁 (Deadlock)。
 
 
 
C. 流控 (Flow Control) 与交换 (Switching):交通警察是如何指挥的?
这是 NoC 中最复杂、也是效率最高的部分。它决定了“车队”在“街道”上具体是如何行驶的。
- 
必学:虫洞交换 (Wormhole Switching)
- 背景: 一个“Burst”(突发)数据可能非常大(比如一个100辆车的“大车队”)。我们不能等100辆车都到了路口A,再一起发往路口B(这叫“存储转发”,效率太低)。
 - 虫洞机制:
- 我们将这个“大车队”(Packet,包)拆分成一节一节的“标准车厢”(Flit,流控单元)。
 - 头 Flit (火车头): 包含“导航地址”(比如要去 (2,1))。
 - 体 Flits (中间车厢): 只装“货物”(数据)。
 - 尾 Flit (火车尾): 标记“车队结束”。
 - “虫洞”效应: 当“火车头”到达路口A时,交警(路由器)一看地址,把它指向东边。火车头刚一离开路口A,紧跟在后面的“中间车厢”立刻就跟上,不需要等待!
 - 在同一时刻,这个“车队”(火车)可能同时占据着好几条街道(比如火车头在 (1,0),火车尾还在 (0,0))。它就像一条“贪吃蛇”一样,在网络中“蠕动”前进。
 
 - 优点: 极大地降低了延迟,也减少了路口(路由器)需要“停车场”(缓冲区)的大小。
 
 - 
必学:基于信用的流控 (Credit-Based Flow Control)
- 问题: 在“虫洞”模式下,路口A的“火车头”要发往路口B。如果路口B东向的“停车场”(FIFO 缓冲区)已经满了,怎么办?火车头堵在路口A,它后面的所有车厢都会堵住,引发大塞车。
 - 信用机制(解决方案):
- 路口B(下游)会不断地“广而告之”路口A(上游):“我东边的停车场还能停 5 辆车(Credits = 5)。”
 - 路口A(上游)每往B发送一辆车(一个 Flit),自己就把B的“信用计数”减 1(现在A认为B还能停 4 辆)。
 - 当A发现B的“信用计数”为 0 时,就立即停止向B发送任何车辆。
 - 当路口B的停车场空出一个位置时(车开走了),它会立刻给A发一个“信用更新”信号:“我又空了 1 个位置!”
 
 - 优点: 这套机制确保了上游永远不会在下游缓冲区满的时候还发送数据,从而从根本上避免了因“停车场满了”导致的交通瘫痪。
 
 
2. NoC 的核心组件(硬件实现)
现在我们把“比喻”翻译成“硬件”。一个 NoC 主要由两部分组成:
- 
A. 路由器 (Router) 微架构(十字路口+交警)
- 输入端口 (Input Ports): 包含“停车场”(FIFO 缓冲区),用来暂存抵达的 Flits(车厢)。
 - 路由逻辑 (Routing Logic): “GPS导航仪”。读取“火车头”(Head Flit)的目标地址,并根据 XY 路由算法,计算出它该从哪个出口走。
 - 仲裁器 (Arbiter): “路口交警”。如果东边和南边的车队都想去北边(抢同一个出口),仲裁器(比如使用“轮流放行”规则)决定谁先走。
 - 交换矩阵 (Switch Fabric / Crossbar): “立交桥”。一个 N x N 的开关矩阵,负责把“输入端口”的车辆实际“切换”到“输出端口”去。
 
 - 
B. 网络接口 (Network Interface, NI)(出入口匝道)
- 这是 NoC 的“翻译官”和“打包站”,它连接着“功能区”(CPU)和“十字路口”(Router)。
 - 功能: 它负责将 CPU 发出的**总线协议(如 AXI)的读写请求(我们第一阶段讲的“高速公路”上的车队),“翻译并打包”**成 NoC “城市路网”能理解的、带地址的 Flits(火车车厢)。反之亦然。
 
 
3. NoC 的关键性能问题
设计 NoC 就是为了解决以下问题,而这些问题也是衡量你设计好坏的标准:
- 
延迟 (Latency) & 吞吐量 (Throughput):
- 延迟: 一辆车(一个数据)从A点到B点要花多久?(越低越好)
 - 吞吐量: 整条街道(整个网络)1秒钟最多能通过多少辆车?(越高越好)
 
 - 
死锁 (Deadlock):
- 比喻: 灾难性的“十字路口环形堵死”。
 - 场景: 想象一个环形路口。A车队想去B,B想去C,C想去D,D想去A。它们各自占了一个路口,同时又在等待下一个路口。所有车队都动弹不得,交通彻底瘫痪。
 - 解决: XY 路由通过“只准先X后Y”的死板规定,在设计上**“打断了环路”**,从而避免了死锁。
 
 - 
队头阻塞 (Head-of-Line Blocking):
- 比喻: “直行车被左转车堵住”。
 - 场景: 在一个路口(路由器的输入端口),排在第一位的“火车头”A想去北边。但北边的路堵了(没信用了)。
 - 排在它后面的“火车头”B,本来想去东边(东边是空的,完全可以走)。
 - 问题: 因为火车头A堵在最前面,火车头B也被迫卡在后面,动弹不得。
 - 解决: 这是 NoC 中最经典的一个性能问题。解决它的高级技术叫做**“虚拟通道” (Virtual Channels)**(我们第五阶段再讲)。
 
 
阶段总结
- NoC 是由路由器 (Router) 和链路 (Link) 按照拓扑 (Topology)(如 Mesh)搭建的。
 - 数据被打包成 Flits(车厢),以虫洞 (Wormhole) 方式在网络中流动。
 - 路径由路由算法 (Routing)(如 XY)决定。
 - 交通由流控 (Flow Control)(如 Credit-Based)来指挥,以避免堵塞。
 - NI(网络接口) 负责在“总线”和“NoC”之间翻译。
 
