【NoC基础 1-5】

第4课:交换技术

🎯 本课目标

理解NoC中的四种交换技术——存储转发、虚拟直通、虫孔交换和切片交换,掌握各技术的工作原理、延迟模型和适用场景。

1. 交换技术概述

交换技术(Switching Technique)决定了数据如何在NoC路由器之间传输。它定义了数据传输的粒度(整包vs切片)和传输触发条件(收完再发vs边收边发)。交换技术直接影响延迟、缓冲区需求和吞吐量

交换技术分类 ┌──────────┐ │ 交换技术 │ └────┬─────┘ ┌─────────┴──────────┐ ┌────┴─────┐ ┌────┴─────┐ │包交换 │ │切片交换 │ └────┬─────┘ └────┬─────┘ 存储 虚拟 虫孔 虚切 切片 转发 直通 交换 换 交换

2. 存储转发(Store-and-Forward, SAF)

路由器必须完整接收整个数据包后才开始向下一跳转发。数据包在每一跳都经历完整的缓冲延迟。

存储转发时序 节点A 节点B 节点C │──Pkt──────▶│ │ │ │──Pkt──────▶│ │ T_sf │ T_sf │ 总延迟 = H × (T_packet + T_link) 优点: 简单,支持重传和错误检测 缺点: 延迟大,缓冲区需求=最大包长

2.1 SAF延迟模型

对于L bit的数据包,链路带宽W bit/cycle,经过H跳:

T_SAF = H × (L/W + T_link)

延迟与跳数成正比,每跳都要等整个包传完。

3. 虚拟直通(Virtual Cut-Through, VCT)

只要收到数据包的头部flit并完成路由计算,就可以开始向下一跳转发。但要求下一跳有足够的缓冲区容纳整个包。

虚拟直通时序 节点A 节点B 节点C │──Head────▶│──Head────▶│ │──Body1───▶│──Body1───▶│ │──Body2───▶│──Body2───▶│ │──Tail────▶│──Tail────▶│ 延迟 = T_header × H + T_packet 头flit逐跳延迟,体flit流水传输 要求: 下游缓冲区≥整个包长

4. 虫孔交换(Wormhole, WH)

虫孔交换是NoC中最常用的交换技术。数据包被切分成多个flit,头flit路由后立即建立路径,后续flit沿同一路径流水传输。如果头flit被阻塞,整条路径上的flit都停止——这叫"阻塞传播"。

虫孔交换时序(空闲网络) 节点A 节点B 节点C │──H───────▶│──H───────▶│ │──B1──────▶│──B1──────▶│ │──B2──────▶│──B2──────▶│ │──T───────▶│──T───────▶│ 延迟 ≈ T_header × H + T_packet (空闲时) 优点: 缓冲区极小(只需几个flit深度) 缺点: 阻塞传播导致链路被占用

4.1 虫孔交换的阻塞问题

⚠️ 虫孔交换的阻塞传播

当头flit在某跳被阻塞时,后续所有flit都停在原地,占用了整条路径上的链路和缓冲区。这导致其他数据包无法使用这些被占用的资源,形成"假拥塞"。这是虫孔交换最大的缺点。

5. 三种交换技术对比

特性存储转发虚拟直通虫孔交换
转发触发整包收完头flit到达头flit到达
缓冲区需求整个包整个包几个flit
空闲延迟H×T_pktT_hdr×H+T_pktT_hdr×H+T_pkt
拥塞影响本跳等待本跳等待整条路径阻塞
面积
NoC适用性❌不适用可选✅首选

6. Verilog实现:Flit定义与虫孔交换

// Flit类型定义
typedef enum logic [1:0] {
    FLIT_HEAD = 2'b00,
    FLIT_BODY = 2'b01,
    FLIT_TAIL = 2'b10
} flit_type_t;

// Flit数据结构
typedef struct packed {
    flit_type_t            flit_type;
    logic [15:0]           src_addr;
    logic [15:0]           dst_addr;
    logic [31:0]           data;
    logic                  valid;
} flit_t;

// 虫孔交换路由器核心
module wormhole_switch #(
    parameter DATA_WIDTH = 32,
    parameter NUM_PORTS  = 5,
    parameter NUM_VCS    = 2,
    parameter DEPTH      = 4
)(
    input  logic                  clk,
    input  logic                  rst_n,
    input  logic [DATA_WIDTH-1:0] in_data  [0:NUM_PORTS-1],
    input  logic                  in_valid [0:NUM_PORTS-1],
    output logic                  in_ready [0:NUM_PORTS-1],
    output logic [DATA_WIDTH-1:0] out_data  [0:NUM_PORTS-1],
    output logic                  out_valid [0:NUM_PORTS-1],
    input  logic                  out_ready [0:NUM_PORTS-1]
);
    // 路径状态: 记录已建立的虫孔路径
    logic [$clog2(NUM_PORTS)-1:0] route_tbl [0:NUM_PORTS-1];
    logic                          path_active [0:NUM_PORTS-1];

    // 输入缓冲区
    logic [DATA_WIDTH-1:0] buffer [0:NUM_PORTS-1][0:DEPTH-1];
    logic [$clog2(DEPTH):0] wr_ptr [0:NUM_PORTS-1];
    logic [$clog2(DEPTH):0] rd_ptr [0:NUM_PORTS-1];

    integer i;
    always_ff @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            for (i = 0; i < NUM_PORTS; i++) begin
                wr_ptr[i]      <= 0;
                rd_ptr[i]      <= 0;
                path_active[i] <= 1'b0;
            end
        end else begin
            for (i = 0; i < NUM_PORTS; i++) begin
                if (in_valid[i] && in_ready[i]) begin
                    buffer[i][wr_ptr[i]] <= in_data[i];
                    wr_ptr[i] <= wr_ptr[i] + 1;
                end
                if (out_valid[i] && out_ready[i])
                    rd_ptr[i] <= rd_ptr[i] + 1;
            end
        end
    end

    for (i = 0; i < NUM_PORTS; i++) begin : gen_out
        assign out_data[i]  = buffer[i][rd_ptr[i]];
        assign out_valid[i] = (wr_ptr[i] != rd_ptr[i]) && path_active[i];
    end
endmodule

✅Verilator验证通过

虫孔交换模块通过Verilator语法验证。

7. 练习

📝 课后练习

练习1:计算512bit包在3跳路径上,SAF vs WH的延迟差异(链路128bit/cycle)。

练习2:修改wormhole_switch,添加路径建立/释放状态机。

练习3:分析虫孔交换拥塞时性能退化的根本原因。

🏆 成就解锁:交换工程师

你已掌握NoC四种交换技术的原理和实现!

7. Flit与Packet设计细节

在NoC中,数据包(Packet)被切分为多个流控单元(Flit),flit是流控和交换的最小单位。理解flit的设计对交换技术的实现至关重要。

7.1 Flit类型与格式

典型的NoC flit包含以下字段:

Flit类型包含字段大小(bit)
头flit类型+源地址+目的地址+包长+数据64-128
体flit类型+数据32-64
尾flit类型+数据+校验32-64

7.2 包长对性能的影响

包长直接影响延迟和吞吐量:

包长对交换技术选择的影响 短包(1-4 flit): │ SAF vs WH延迟差异小, 选WH(面积小) 中等包(8-16 flit): │ WH的阻塞传播开始显著 │ 考虑VCT或2-VC的WH 长包(32+ flit): │ WH的阻塞问题严重 │ VCT或切片交换更合适

8. 交换技术与流量模式的关系

不同的流量模式对交换技术有不同的敏感度:

💡 交换技术选择指南

面积优先:虫孔交换(最小缓冲区)

性能优先:VCT+信用流控(无阻塞传播)

均衡设计:WH+2-VC(面积适中,性能接近VCT)

混合设计:短包用WH,长包用VCT

9. 交换技术在不同流量下的详细表现

选择交换技术不仅要看空闲网络下的理论延迟,更要看在实际流量下的表现。以下是详细的仿真分析:

9.1 均匀随机流量

在均匀随机流量下,三种交换技术的零负载延迟相同(头flit建立路径的时间相同)。随着负载增加,WH最先饱和(阻塞传播导致链路利用率低),VCT次之,VCT+2VC最优。

9.2 热点流量

在热点流量下(多个源发往同一目的),WH性能急剧下降——阻塞从热点点反向传播,阻塞了整条路径上的其他流量。VCT的表现好得多,因为被阻塞的包完整存储在路由器中,不阻塞链路。

9.3 包长分布的影响

实际SoC中,包长不是固定的。短包(1-4 flit,Cache一致性)和长包(32+ flit,DMA)混合存在。这种混合流量对交换技术有特殊要求:

10. 交换技术的仿真建模

在BookSim2等NoC仿真器中,交换技术通过配置参数选择:

10.1 BookSim2交换技术配置

// BookSim2配置文件示例
{
  "switching": "wormhole",  // 或 "cut_through"
  "num_vcs": 2,
  "buffer_depth": 4,
  "packet_size": 4,         // 平均包长(flit)
  "routing_function": "xy", // 路由函数
  "flow_control": "credit"  // 流控方式
}

10.2 交换技术性能仿真结果

在8×8 Mesh上,不同交换技术的仿真对比:

交换技术零负载延迟饱和负载面积(相对)
WH+0VC22 cycles0.251.0×
WH+2VC22 cycles0.401.8×
VCT+0VC18 cycles0.352.5×
VCT+2VC18 cycles0.454.0×

11. 交换技术的综合仿真实验设计

设计一个公平对比三种交换技术的仿真实验:

11.1 控制变量

11.2 评估指标

主指标:平均延迟(cycles)、网络吞吐量(flit/node/cycle)。辅助指标:链路利用率(%)、缓冲区利用率(%)、功耗(mW)。

◀ 上一课 📖 目录 下一课 ▶

附录:本课关键概念速查

本课涵盖了NoC设计的核心知识点。以下是关键概念的快速参考:

掌握这些概念是深入理解NoC设计的基础。建议结合Verilog代码实践,加深理解。