理解片上网络(Network-on-Chip)的基本概念、发展动机和核心组成,建立NoC的全局认知框架。
片上网络(Network-on-Chip, NoC)是一种在单一芯片内部实现多处理器核之间通信的互联架构。它借鉴了计算机网络的思想,将传统总线(Bus)替换为由路由器节点和链路组成的网络结构,为大规模多核/众核SoC提供可扩展的片上通信方案。
随着半导体工艺进入纳米时代,单芯片上集成的处理器核数量从几个增长到数百甚至上千个。传统的共享总线架构面临带宽瓶颈、可扩展性差、功耗墙等根本性挑战。NoC正是在这种背景下应运而生的解决方案。
单核频率提升遭遇功耗墙(power wall),业界转向多核并行。Intel从Pentium D的双核到Xeon的56核,AMD EPYC达到128核,GPU核数更是数千级别。核间通信需求呈平方级增长。
| 年份 | 典型SoC | 核数 | 互联方式 |
|---|---|---|---|
| 2000 | 单核CPU | 1 | 总线 |
| 2005 | 双核CPU | 2 | 总线+交叉开关 |
| 2010 | Tilera Tile-Gx | 100 | Mesh NoC |
| 2015 | Xeon Phi | 72 | Mesh NoC |
| 2020 | Apple M1 | 16+ | NoC互连 |
| 2024 | NVIDIA H100 | 数千 | NoC+NVLink |
1. 带宽瓶颈:所有核共享同一总线,同一时刻只能有一对核通信。N个核的总线带宽被N个请求方分摊,人均带宽随核数增加而线性下降。
2. 可扩展性差:总线电容随连接设备数增加而增大,信号完整性恶化。一条总线很难驱动超过16个负载。
3. 功耗效率低:广播通信导致每次传输都被所有节点接收,即使大部分节点不需要该数据,造成巨大的动态功耗浪费。
一个完整的NoC由五个核心组件构成:
路由器是NoC的核心交换节点,包含输入缓冲区、路由计算单元、虚拟通道分配器、交叉开关和开关分配器。每个路由器有5个端口:本地(Local)、东(East)、西(West)、南(South)、北(North)。
NI是计算核心与网络的桥梁,负责协议转换:将核心的读写请求打包成网络数据包,将网络数据包解包为核心可识别的响应。NI实现了计算与通信的解耦,使得IP核不需要了解网络内部细节。
链路是路由器间的物理连接通道,包含数据信号和控制信号。可以是单方向/双方向、串行/并行。链路宽度直接影响NoC的面积和功耗。
| 特性 | 共享总线 | 交叉开关 | 片上网络 |
|---|---|---|---|
| 带宽 | 低(共享) | 高(全连接) | 中-高(并行路径) |
| 可扩展性 | 差O(N) | 差O(N²) | 好O(√N) |
| 面积 | 小 | 大 | 中等 |
| 功耗 | 高(广播) | 高(线多) | 低(点对点) |
| 容错 | 无 | 无 | 有(绕行) |
// 基本数据包定义
typedef struct packed {
logic [15:0] src_addr; // 源地址
logic [15:0] dst_addr; // 目的地址
logic [31:0] payload; // 数据载荷
logic valid; // 有效位
logic last; // 尾包标志
} noc_packet_t;
// Valid-Ready握手链路接口
module noc_link_interface #(
parameter DATA_WIDTH = 32,
parameter ADDR_WIDTH = 16
)(
input logic clk,
input logic rst_n,
input logic [DATA_WIDTH-1:0] tx_data,
input logic [ADDR_WIDTH-1:0] tx_dst,
input logic tx_valid,
output logic tx_ready,
output logic [DATA_WIDTH-1:0] rx_data,
output logic [ADDR_WIDTH-1:0] rx_src,
output logic rx_valid,
input logic rx_ready
);
assign tx_ready = rx_ready;
assign rx_data = tx_data;
assign rx_src = tx_dst;
assign rx_valid = tx_valid;
endmodule
// 简单网络节点(含四方向端口+本地注入/弹出)
module noc_node #(
parameter NODE_ID = 0,
parameter DATA_WIDTH = 32,
parameter ADDR_WIDTH = 16
)(
input logic clk, rst_n,
input logic [DATA_WIDTH-1:0] inject_data,
input logic [ADDR_WIDTH-1:0] inject_dst,
input logic inject_valid,
output logic inject_ready,
output logic [DATA_WIDTH-1:0] eject_data,
output logic [ADDR_WIDTH-1:0] eject_src,
output logic eject_valid,
input logic eject_ready,
// 北向端口
input logic [DATA_WIDTH-1:0] north_rx_data,
input logic north_rx_valid,
output logic north_rx_ready,
output logic [DATA_WIDTH-1:0] north_tx_data,
output logic north_tx_valid,
input logic north_tx_ready,
// 东/南/西端口(结构相同)...
// 南向端口
input logic [DATA_WIDTH-1:0] south_rx_data,
input logic south_rx_valid,
output logic south_rx_ready,
output logic [DATA_WIDTH-1:0] south_tx_data,
output logic south_tx_valid,
input logic south_tx_ready
);
// 简化路由: 本地注入→北向转发, 北向接收→本地弹出
assign inject_ready = north_tx_ready;
assign north_tx_data = inject_data;
assign north_tx_valid = inject_valid;
assign eject_data = south_rx_data;
assign eject_valid = south_rx_valid;
assign south_rx_ready = eject_ready;
endmodule
上述Verilog代码已通过 verilator --lint-only 验证。
| 年份 | 里程碑 | 意义 |
|---|---|---|
| 2000 | Dally & Towles提出NoC | 将网络思想引入片上通信 |
| 2004 | Æthereal NoC (Philips) | 首个保证QoS的NoC原型 |
| 2007 | Intel 80-core TeraFLOPS | 首个大规模Mesh NoC芯片 |
| 2012 | Tilera Tile-Gx100 | 100核Mesh NoC处理器 |
| 2017 | ARM CMN-600 | 商用NoC互连IP |
练习1:计算N个核共享总线时,总线带宽为B,每核平均需0.1B,N超过多少时带宽不足?
练习2:修改noc_node模块,增加路由地址比较——目的地址等于本节点ID则弹出,否则转发北向。
练习3:3×3 Mesh中(0,0)到(2,2)有多少条最短路径?
完成本课学习,理解了片上网络的基本概念和发展动机!
📌 下一步:学习网络拓扑结构
设计一个优秀的NoC需要解决以下核心挑战,这些挑战相互关联,需要在设计空间中做出权衡:
降低延迟通常需要更深的流水线或更宽的链路,但这会增加面积和功耗。高吞吐量需要更多并行路径和更大缓冲区,同样增加成本。设计者必须根据应用需求找到平衡点。
例如,对于延迟敏感的Cache一致性消息,可以分配专用虚拟通道和最高优先级;对于吞吐量敏感的大块数据传输,可以使用较宽的链路和批量传输模式。
路由器面积主要由缓冲区和交叉开关决定。在一个16nm工艺的4×4 Mesh NoC中,单个路由器面积约0.01mm²,16个路由器占0.16mm²,占SoC总面积的1-3%。缓冲区深度从4增加到8会使路由器面积增加约40%。
NoC的验证是SoC验证中最困难的部分之一。需要验证:①路由正确性(所有源-目的对的路径);②流控正确性(无数据丢失、无死锁);③性能指标(延迟、吞吐量);④边界条件(缓冲区满/空、多端口同时请求)。
在设计初期,需要快速评估不同NoC配置的性能。常用的性能建模方法:
对于k×k Mesh上的uniform随机流量,使用XY路由:
T_avg = T_router × H_avg + T_queue
其中 T_router 是单跳路由器延迟,H_avg ≈ 2k/3 是平均跳数,T_queue 是排队延迟(与负载率相关)。
NoC的饱和吞吐量受对分带宽限制。对于k×k Mesh,对分带宽为k条链路,每条链路带宽W:
Throughput_max = k × W / N = W / k = W / √N
这是理论最大值,实际吞吐量通常只有理论值的60-80%。
1. 先用分析模型筛选设计方案(快速迭代)
2. 用周期精确仿真验证候选方案(中等精度)
3. 用FPGA原型确认最终方案(高精度)
4. 在流片前进行形式验证(确保正确性)