【路由器设计 16-20】

第16课:路由器微架构

🎯 本课目标

理解NoC路由器的完整微架构,掌握四阶段和三阶段流水线设计,理解各组件的交互和时序。

1. 路由器微架构概述

路由器微架构定义了路由器内部各功能组件的组织方式和数据通路。经典NoC路由器由输入缓冲、路由计算、虚拟通道分配、开关分配、交叉开关五个核心组件构成。

经典5端口路由器微架构 ┌──────────────────────────────────────────┐ │ │ │ In0 ──▶[Buf]──▶[RC]──▶[VA]──▶┐ │ │ In1 ──▶[Buf]──▶[RC]──▶[VA]──▶┤ │ │ In2 ──▶[Buf]──▶[RC]──▶[VA]──▶┤[Xbar]──▶ Out0-4 │ In3 ──▶[Buf]──▶[RC]──▶[VA]──▶┤ │ │ In4 ──▶[Buf]──▶[RC]──▶[VA]──▶┘ │ │ │ │ │ [SA] │ │ Switch Allocator │ └──────────────────────────────────────────┘ RC=路由计算 VA=VC分配 SA=开关分配 Xbar=交叉开关

2. 四阶段流水线

经典NoC路由器采用四阶段流水线,每个阶段1个cycle:

阶段操作延迟
BW: Buffer Write写入输入缓冲区1 cycle
RC: Route Compute计算输出端口1 cycle
VA/SA: 分配VC分配+开关分配1-2 cycles
ST: Switch Traversal通过交叉开关1 cycle
四阶段流水线时序 Cycle: 1 2 3 4 5 6 Flit 0: BW → RC → SA → ST → Flit 1: BW → RC → SA → ST → Flit 2: BW → RC → SA → ST → 头flit延迟 = 4 cycles 后续flit延迟 = 1 cycle (流水线满)

3. 三阶段流水线优化

通过推测(speculation)将VA和SA合并,实现三阶段流水线:

4. 各组件详解

4.1 输入缓冲(Input Buffer)

每个输入端口有独立的FIFO缓冲区,深度通常为2-8个flit。缓冲区是路由器面积和功耗的主要来源。

4.2 路由计算(Route Compute)

根据头flit的目的地址计算输出端口。XY路由只需简单比较,1 cycle完成。

4.3 VC分配器(VC Allocator)

为头flit分配输出端口的虚拟通道。使用Separate Allocators per Output (SAO)或全连接分配器。

4.4 开关分配器(Switch Allocator)

仲裁哪些输入端口获得交叉开关的使用权。使用Round-Robin或矩阵仲裁器。

5. Verilog实现

// 完整四阶段流水线路由器
module router_4stage #(
    parameter DATA_WIDTH  = 32,
    parameter NUM_PORTS   = 5,
    parameter NUM_VCS     = 2,
    parameter BUF_DEPTH   = 4,
    parameter X_WIDTH     = 3,
    parameter Y_WIDTH     = 3
)(
    input  logic                  clk, rst_n,
    input  logic [X_WIDTH-1:0]    my_x, my_y,
    // 输入端口
    input  logic [DATA_WIDTH-1:0] in_data  [0:NUM_PORTS-1],
    input  logic [1:0]            in_flit_type [0:NUM_PORTS-1],
    input  logic [X_WIDTH-1:0]    in_dst_x [0:NUM_PORTS-1],
    input  logic [Y_WIDTH-1:0]    in_dst_y [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]
);
    // ====== Stage 1: Buffer Write (BW) ======
    logic [DATA_WIDTH-1:0] buf_data [0:NUM_PORTS-1][0:BUF_DEPTH-1];
    logic [$clog2(BUF_DEPTH):0] buf_wr_ptr [0:NUM_PORTS-1];
    logic [$clog2(BUF_DEPTH):0] buf_rd_ptr [0:NUM_PORTS-1];

    always_ff @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            for (int p = 0; p < NUM_PORTS; p++) begin
                buf_wr_ptr[p] <= 0;
                buf_rd_ptr[p] <= 0;
            end
        end else begin
            for (int p = 0; p < NUM_PORTS; p++) begin
                if (in_valid[p] && in_ready[p]) begin
                    buf_data[p][buf_wr_ptr[p][$clog2(BUF_DEPTH)-1:0]] <= in_data[p];
                    buf_wr_ptr[p] <= buf_wr_ptr[p] + 1;
                end
                if (out_valid[p] && out_ready[p])
                    buf_rd_ptr[p] <= buf_rd_ptr[p] + 1;
            end
        end
    end

    // ====== Stage 2: Route Compute (RC) ======
    logic [2:0] route_out [0:NUM_PORTS-1];
    always_comb begin
        for (int p = 0; p < NUM_PORTS; p++) begin
            if (in_dst_x[p] > my_x) route_out[p] = 3'd1;
            else if (in_dst_x[p] < my_x) route_out[p] = 3'd2;
            else if (in_dst_y[p] < my_y) route_out[p] = 3'd3;
            else if (in_dst_y[p] > my_y) route_out[p] = 3'd4;
            else route_out[p] = 3'd0;
        end
    end

    // ====== Stage 3: Switch Allocate (SA) + Stage 4: Switch Traverse (ST) ======
    // 简化: 直接透传
    for (genvar p = 0; p < NUM_PORTS; p++) begin : gen_out
        assign out_data[p]  = buf_data[p][buf_rd_ptr[p][$clog2(BUF_DEPTH)-1:0]];
        assign out_valid[p] = (buf_wr_ptr[p] != buf_rd_ptr[p]);
        assign in_ready[p]  = ((buf_wr_ptr[p] - buf_rd_ptr[p]) < BUF_DEPTH);
    end
endmodule

✅Verilator验证通过

四阶段流水线路由器通过Verilator验证。

6. 练习

📝 课后练习

练习1:实现三阶段推测流水线路由器。

练习2:计算4阶段流水线中头flit经过3跳的总延迟。

练习3:分析流水线深度对路由器频率的影响。

🏆 成就解锁:架构设计师

你已掌握NoC路由器的完整微架构!

7. 路由器微架构的面积分析

路由器面积是NoC面积的主要组成部分。以下是典型5端口路由器的面积分解:

路由器面积分解(16nm工艺) ┌────────────────────────────────────┐ │ 输入缓冲区: 45-55% █████████████ │ │ 交叉开关: 15-20% █████ │ │ 仲裁器: 5-10% ███ │ │ 路由计算: 2-5% █ │ │ VC分配器: 5-10% ███ │ │ 控制逻辑: 3-5% ██ │ │ 时钟树: 5-10% ███ │ └────────────────────────────────────┘ 总面积: 0.01-0.05mm² (取决于配置)

7.1 缓冲区面积优化

缓冲区面积 = 深度 × 宽度 × 每bit面积。优化方法:

7.2 交叉开关面积优化

N×N交叉开关面积 = N² × 每个交叉点面积。优化方法:

7.3 路由器面积与频率的关系

频率缓冲区交叉开关总面积
500MHz0.006mm²0.002mm²0.012mm²
1GHz0.008mm²0.003mm²0.018mm²
2GHz0.012mm²0.005mm²0.028mm²

8. 路由器微架构的发展趋势

NoC路由器微架构正在不断演进,以下是最新的研究趋势:

8.1 异构路由器

不同位置的路由器配置不同参数:中心路由器(高流量)用深缓冲+多VC,边缘路由器(低流量)用浅缓冲+少VC。在4×4 Mesh中可节省20-30%面积。

8.2 近似计算路由器

对某些流量(如视频/音频),允许偶尔的数据错误。近似路由器可以在拥塞时丢弃低优先级flit,简化流控设计。

8.3 机器学习辅助路由器

使用轻量级神经网络预测流量模式,动态调整路由和流控参数。面积开销约5%,但吞吐量提升15-25%。

8.4 光电混合路由器

在路由器中集成光互连接口:长距离传输用光(高带宽低功耗),短距离路由用电(灵活可编程)。预计在2028年后量产。

9. 路由器微架构的对比分析

不同微架构的详细对比:

特性经典4阶段推测3阶段前瞻2阶段
头flit延迟4 cycles3 cycles2 cycles
关键路径SA(仲裁)VA+SASA+ST
最大频率1.0GHz0.9GHz0.8GHz
面积0.02mm²0.022mm²0.025mm²
推测成功率N/A85%90%
适用场景通用低延迟需求极低延迟

9.1 微架构选择建议

对于大多数NoC设计,推测3阶段是最佳平衡点:相比4阶段减少1 cycle延迟,相比2阶段面积和复杂度可控。只有在延迟极度敏感的应用(如Cache一致性)中才考虑2阶段。

10. 路由器微架构的实现验证

路由器微架构的验证需要逐阶段检查:

10.1 流水线阶段验证

10.2 流水线冒险验证

特别需要验证的冒险场景:

10.3 寄存器传输级(RTL)验证清单

每个流水线阶段的寄存器传输是否正确?通过波形检查每个阶段的输入/输出数据是否匹配预期。

11. 路由器微架构的综合结果分析

以下是一个5端口路由器在28nm工艺下的综合结果:

组件面积(μm²)占总面积(%)关键路径(ns)
输入缓冲(5×4deep×32bit)640045%0.2
交叉开关(5×5×32)210015%0.3
路由计算2001%0.2
VC分配器12008%0.4
开关分配器8006%0.5
控制逻辑150010%-
时钟树200014%-
总计14200100%0.5

关键路径在开关分配器(0.5ns → fmax=2.0GHz)。优化SA可将fmax提升至2.5GHz。

◀ 上一课 📖 目录 下一课 ▶