【NoC基础 1-5】

第1课:片上网络概述

🎯 本课目标

理解片上网络(Network-on-Chip)的基本概念、发展动机和核心组成,建立NoC的全局认知框架。

1. 什么是片上网络?

片上网络(Network-on-Chip, NoC)是一种在单一芯片内部实现多处理器核之间通信的互联架构。它借鉴了计算机网络的思想,将传统总线(Bus)替换为由路由器节点和链路组成的网络结构,为大规模多核/众核SoC提供可扩展的片上通信方案。

随着半导体工艺进入纳米时代,单芯片上集成的处理器核数量从几个增长到数百甚至上千个。传统的共享总线架构面临带宽瓶颈、可扩展性差、功耗墙等根本性挑战。NoC正是在这种背景下应运而生的解决方案。

传统总线 vs 片上网络 【总线架构】 【NoC架构】 ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐ │P0 │ │P1 │ │P2 │ │P3 │ │P0 │───│P1 │ └─┬─┘ └─┬─┘ └─┬─┘ └─┬─┘ └─┬─┘ └─┬─┘ │ │ │ │ │ │ ══╪═════╪═════╪═════╪══ ┌┴─┐ ┌─┴┐ │ 共享总线 │ │R0│───│R1│ │ │ │ └┬─┘ └─┬┘ ┌───┐ ┌───┐ │P2 │───│P3 │ └─┬─┘ └─┬─┘ │ │ ┌┴─┐ ┌─┴┐ │R2│───│R3│ └──┘ └──┘

2. NoC的发展动机

2.1 摩尔定律与多核趋势

单核频率提升遭遇功耗墙(power wall),业界转向多核并行。Intel从Pentium D的双核到Xeon的56核,AMD EPYC达到128核,GPU核数更是数千级别。核间通信需求呈平方级增长

年份典型SoC核数互联方式
2000单核CPU1总线
2005双核CPU2总线+交叉开关
2010Tilera Tile-Gx100Mesh NoC
2015Xeon Phi72Mesh NoC
2020Apple M116+NoC互连
2024NVIDIA H100数千NoC+NVLink

2.2 总线架构的三大瓶颈

⚠️ 总线的根本问题

1. 带宽瓶颈:所有核共享同一总线,同一时刻只能有一对核通信。N个核的总线带宽被N个请求方分摊,人均带宽随核数增加而线性下降。

2. 可扩展性差:总线电容随连接设备数增加而增大,信号完整性恶化。一条总线很难驱动超过16个负载。

3. 功耗效率低:广播通信导致每次传输都被所有节点接收,即使大部分节点不需要该数据,造成巨大的动态功耗浪费。

3. NoC的核心组成

一个完整的NoC由五个核心组件构成:

NoC核心架构 ┌──────────────────────────────────────┐ │ ┌──────┐ ┌──────┐ ┌──────┐ │ │ │Router│────│Router│────│Router│ │ │ └──┬───┘ └──┬───┘ └──┬───┘ │ │ │ │ │ │ │ ┌──┴───┐ ┌──┴───┐ ┌──┴───┐ │ │ │ NI │ │ NI │ │ NI │ │ │ └──┬───┘ └──┬───┘ └──┬───┘ │ │ ┌──┴───┐ ┌──┴───┐ ┌──┴───┐ │ │ │ Core │ │ Core │ │ Core │ │ │ └──────┘ └──────┘ └──────┘ │ └──────────────────────────────────────┘ ① Router - 路由器: 数据包转发决策 ② NI - 网络接口: 协议转换 ③ Link - 链路: 物理连接 ④ Core - IP核: 计算单元 ⑤ Flow Ctrl - 流控: 拥塞管理

3.1 路由器(Router)

路由器是NoC的核心交换节点,包含输入缓冲区、路由计算单元、虚拟通道分配器、交叉开关和开关分配器。每个路由器有5个端口:本地(Local)、东(East)、西(West)、南(South)、北(North)。

3.2 网络接口(NI)

NI是计算核心与网络的桥梁,负责协议转换:将核心的读写请求打包成网络数据包,将网络数据包解包为核心可识别的响应。NI实现了计算与通信的解耦,使得IP核不需要了解网络内部细节。

3.3 链路(Link)

链路是路由器间的物理连接通道,包含数据信号和控制信号。可以是单方向/双方向、串行/并行。链路宽度直接影响NoC的面积和功耗。

4. NoC vs 传统互联对比

特性共享总线交叉开关片上网络
带宽低(共享)高(全连接)中-高(并行路径)
可扩展性差O(N)差O(N²)好O(√N)
面积中等
功耗高(广播)高(线多)低(点对点)
容错有(绕行)

5. NoC设计空间

NoC设计空间 ┌──────────┐ │ 拓扑结构 │ └────┬─────┘ ┌────────────┼────────────┐ ┌────┴───┐ ┌────┴───┐ ┌────┴───┐ │路由算法 │ │流控策略 │ │路由器 │ │XY/自适应│ │虫孔/信用│ │微架构 │ └────┬───┘ └────┬───┘ └────┬───┘ └────────────┼────────────┘ ┌──────┴──────┐ │ 性能指标 │ │延迟/吞吐/功耗│ └─────────────┘

6. Verilog实现:NoC基本组件

// 基本数据包定义
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

6.2 网络节点模块

// 简单网络节点(含四方向端口+本地注入/弹出)
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

✅Verilator验证通过

上述Verilog代码已通过 verilator --lint-only 验证。

7. NoC发展里程碑

年份里程碑意义
2000Dally & Towles提出NoC将网络思想引入片上通信
2004Æthereal NoC (Philips)首个保证QoS的NoC原型
2007Intel 80-core TeraFLOPS首个大规模Mesh NoC芯片
2012Tilera Tile-Gx100100核Mesh NoC处理器
2017ARM CMN-600商用NoC互连IP

8. 练习

📝 课后练习

练习1:计算N个核共享总线时,总线带宽为B,每核平均需0.1B,N超过多少时带宽不足?

练习2:修改noc_node模块,增加路由地址比较——目的地址等于本节点ID则弹出,否则转发北向。

练习3:3×3 Mesh中(0,0)到(2,2)有多少条最短路径?

🏆 成就解锁:NoC初探者

完成本课学习,理解了片上网络的基本概念和发展动机!

📌 下一步:学习网络拓扑结构

9. NoC的关键设计挑战

设计一个优秀的NoC需要解决以下核心挑战,这些挑战相互关联,需要在设计空间中做出权衡:

9.1 延迟与吞吐量的权衡

降低延迟通常需要更深的流水线或更宽的链路,但这会增加面积和功耗。高吞吐量需要更多并行路径和更大缓冲区,同样增加成本。设计者必须根据应用需求找到平衡点。

例如,对于延迟敏感的Cache一致性消息,可以分配专用虚拟通道和最高优先级;对于吞吐量敏感的大块数据传输,可以使用较宽的链路和批量传输模式。

9.2 面积与功耗的约束

路由器面积主要由缓冲区和交叉开关决定。在一个16nm工艺的4×4 Mesh NoC中,单个路由器面积约0.01mm²,16个路由器占0.16mm²,占SoC总面积的1-3%。缓冲区深度从4增加到8会使路由器面积增加约40%。

9.3 验证复杂度

NoC的验证是SoC验证中最困难的部分之一。需要验证:①路由正确性(所有源-目的对的路径);②流控正确性(无数据丢失、无死锁);③性能指标(延迟、吞吐量);④边界条件(缓冲区满/空、多端口同时请求)。

NoC验证挑战 ┌──────────────────────────────────┐ │ 状态空间爆炸 │ │ 16节点 × 5端口 × 2VC × 4深度 │ │ = 640个独立缓冲区状态 │ │ 总状态数 ≈ 2^6400 │ │ │ │ 需要形式验证 + 仿真 + FPGA验证 │ └──────────────────────────────────┘

10. NoC性能建模

在设计初期,需要快速评估不同NoC配置的性能。常用的性能建模方法:

10.1 平均延迟估算

对于k×k Mesh上的uniform随机流量,使用XY路由:

T_avg = T_router × H_avg + T_queue

其中 T_router 是单跳路由器延迟,H_avg ≈ 2k/3 是平均跳数,T_queue 是排队延迟(与负载率相关)。

10.2 吞吐量上界

NoC的饱和吞吐量受对分带宽限制。对于k×k Mesh,对分带宽为k条链路,每条链路带宽W:

Throughput_max = k × W / N = W / k = W / √N

这是理论最大值,实际吞吐量通常只有理论值的60-80%。

💡 性能建模最佳实践

1. 先用分析模型筛选设计方案(快速迭代)

2. 用周期精确仿真验证候选方案(中等精度)

3. 用FPGA原型确认最终方案(高精度)

4. 在流片前进行形式验证(确保正确性)

◀ 已是第一课 📖 目录 下一课 ▶