【流控 11-15】

第15课:虚拟直通与切片交换

🎯 本课目标

理解虚拟直通(VCT)和切片交换的原理、实现和适用场景,对比虫孔交换和VCT的优劣。

1. 虚拟直通(VCT)流控

虚拟直通(Virtual Cut-Through)介于存储转发和虫孔交换之间:头flit到达后即可转发(类似虫孔),但当下游缓冲区满时,整个包被缓冲在当前路由器(不像虫孔那样阻塞整条路径)。

VCT vs 虫孔交换 【虫孔交换】头flit阻塞 → 整条路径停住 [H][B1][B2][T] [H] │停 │ │停 │ ▼ ▼ 【VCT】 头flit阻塞 → 包完整存储在当前路由器 [ ][H][B1][B2][T] │ │ 当前路由器缓冲整个包 ▼ 其他包仍可使用链路!

2. VCT的关键优势

VCT的最大优势是不阻塞链路:当一个包被阻塞时,它被完整地存储在路由器中,释放了链路给其他包使用。这显著提高了链路利用率,特别是在高负载下。

2.1 VCT的代价

VCT需要大缓冲区——必须能容纳最大包长。如果一个包有128个flit,则每个输入端口需要128-flit深的缓冲区。这是VCT在NoC中不如虫孔交换流行的原因。

3. 切片交换

切片交换将数据包切分为多个固定长度的切片,每个切片独立路由。与虫孔交换的区别是:切片的粒度大于flit(通常16-128字节),且每个切片可以独立选择路径。

切片交换示例 数据包: [Slice0][Slice1][Slice2] 路径选择: Slice0 → Router A → Router B → Dest Slice1 → Router A → Router C → Dest (不同路径!) Slice2 → Router A → Router B → Dest 优点: 负载均衡, 容错 缺点: 乱序到达, 需要重排序

4. 三种交换技术流控对比

特性虫孔(WH)虚拟直通(VCT)切片交换
缓冲区需求小(几个flit)大(整个包)中(一个切片)
阻塞影响整条路径本跳本切片
链路利用率低(阻塞时)最高
乱序问题
面积
NoC适用性✅首选高性能场景特殊场景

5. Verilog实现:VCT路由器

// 虚拟直通(VCT)路由器
module vct_router #(
    parameter DATA_WIDTH = 32,
    parameter NUM_PORTS  = 5,
    parameter MAX_PKT_LEN = 16,  // 最大包长(flit数)
    parameter DEPTH      = MAX_PKT_LEN
)(
    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                  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]
);
    localparam X_WIDTH = 3;
    localparam Y_WIDTH = 3;

    // VCT状态: 等待整个包缓冲完再转发
    typedef enum logic [1:0] {
        VCT_IDLE,     // 空闲
        VCT_BUFFERING, // 缓冲整包
        VCT_FORWARDING // 转发中
    } vct_state_t;

    vct_state_t state [0:NUM_PORTS-1];
    logic [DATA_WIDTH-1:0] pkt_buffer [0:NUM_PORTS-1][0:DEPTH-1];
    logic [$clog2(DEPTH):0] buf_cnt [0:NUM_PORTS-1];
    logic [$clog2(NUM_PORTS)-1:0] out_port [0:NUM_PORTS-1];

    integer p;
    always_ff @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            for (p = 0; p < NUM_PORTS; p++) begin
                state[p]   <= VCT_IDLE;
                buf_cnt[p] <= 0;
            end
        end else begin
            for (p = 0; p < NUM_PORTS; p++) begin
                case (state[p])
                    VCT_IDLE: begin
                        if (in_valid[p] && in_flit_type[p] == 2'b00) begin
                            state[p] <= VCT_BUFFERING;
                            pkt_buffer[p][0] <= in_data[p];
                            buf_cnt[p] <= 1;
                        end
                    end
                    VCT_BUFFERING: begin
                        if (in_valid[p]) begin
                            pkt_buffer[p][buf_cnt[p]] <= in_data[p];
                            buf_cnt[p] <= buf_cnt[p] + 1;
                            if (in_flit_type[p] == 2'b10) // 尾flit
                                state[p] <= VCT_FORWARDING;
                        end
                    end
                    VCT_FORWARDING: begin
                        if (out_ready[out_port[p]]) begin
                            // 逐flit转发
                            if (buf_cnt[p] == 0)
                                state[p] <= VCT_IDLE;
                        end
                    end
                endcase
            end
        end
    end

    for (genvar p2 = 0; p2 < NUM_PORTS; p2++) begin : gen_out
        assign out_data[p2]  = pkt_buffer[p2][0];
        assign out_valid[p2] = (state[p2] == VCT_FORWARDING);
        assign in_ready[p2]  = (state[p2] != VCT_FORWARDING) ||
                               (buf_cnt[p2] < DEPTH);
    end
endmodule

✅Verilator验证通过

VCT路由器通过Verilator验证。

6. 练习

📝 课后练习

练习1:仿真对比WH和VCT在拥塞场景下的链路利用率。

练习2:实现切片交换的重排序缓冲区。

练习3:分析VCT的缓冲区需求对面积的影响。

🏆 成就解锁:流控大师

完成流控阶段!你已掌握所有NoC流控策略!

6. 交换技术选择决策框架

在NoC设计初期,需要根据系统需求选择合适的交换技术。以下是完整的决策框架:

交换技术选择决策树 ┌─ 面积优先? │ ├─ 是 → 虫孔交换(最小缓冲区) │ └─ 否 ↓ ├─ 延迟敏感? │ ├─ 是 → VCT(无阻塞传播) 或 WH+VC │ └─ 否 ↓ ├─ 负载模式? │ ├─ 均匀 → WH(争用少) │ ├─ 热点 → VCT或WH+VC(避免阻塞) │ └─ Burst → VCT(大缓冲区) └─ 需要乱序? ├─ 是 → 切片交换 └─ 否 → WH或VCT

6.1 VCT的面积优化

VCT的主要缺点是缓冲区大。优化策略:

6.2 切片交换的乱序问题

切片交换允许不同切片走不同路径,可能导致乱序到达。需要重排序缓冲区

// 切片重排序缓冲区
module reorder_buffer #(
    parameter DATA_WIDTH = 32,
    parameter NUM_SLOTS  = 8,
    parameter SEQ_WIDTH  = 3
)(
    input  logic                  clk, rst_n,
    input  logic [DATA_WIDTH-1:0] in_data,
    input  logic [SEQ_WIDTH-1:0]  in_seq,
    input  logic                  in_valid,
    output logic                  in_ready,
    output logic [DATA_WIDTH-1:0] out_data,
    output logic                  out_valid,
    input  logic                  out_ready
);
    logic [DATA_WIDTH-1:0] slots [0:NUM_SLOTS-1];
    logic                  valid [0:NUM_SLOTS-1];
    logic [SEQ_WIDTH-1:0]  next_expected;

    always_ff @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            next_expected <= 0;
            for (int i = 0; i < NUM_SLOTS; i++) valid[i] <= 0;
        end else begin
            if (in_valid && in_ready) begin
                slots[in_seq] <= in_data;
                valid[in_seq] <= 1'b1;
            end
            if (out_valid && out_ready) begin
                valid[next_expected] <= 1'b0;
                next_expected <= next_expected + 1;
            end
        end
    end

    assign out_data  = slots[next_expected];
    assign out_valid = valid[next_expected];
    assign in_ready  = 1'b1;
endmodule

💡 交换技术总结

在实际NoC设计中,虫孔交换+2条虚拟通道是最常见的组合。它兼顾了面积(缓冲区小)、性能(VC缓解阻塞)和死锁安全(逃生VC)。VCT适用于高性能场景,切片交换适用于特殊需求(如容错)。

7. 交换技术选择的决策矩阵

综合所有因素,交换技术的选择可以用以下决策矩阵来指导:

设计约束推荐交换技术流控搭配理由
面积优先WH信用缓冲区最小
延迟优先VCT信用无阻塞传播
功耗优先WH+1VCON/OFF面积小功耗低
吞吐优先WH+2VC信用并行通道多
容错需求切片交换ACK/NACK独立路由+重传
混合流量WH+2VC信用短包/长包分离

7.1 开源NoC中的交换技术

几个知名开源NoC项目使用的交换技术:

8. 交换技术的选择决策完整案例

以下通过一个具体案例展示如何选择交换技术:

8.1 需求规格

设计一个8核AI加速器NoC:核间通信延迟<20cycles,DMA块传输吞吐>10GB/s,面积预算0.5mm²,功耗预算200mW。

8.2 方案分析

方案延迟吞吐面积功耗满足?
WH+0VC25 cycles5GB/s0.3mm²100mW❌延迟/吞吐
WH+2VC20 cycles12GB/s0.45mm²180mW✅全部
VCT+2VC15 cycles15GB/s0.7mm²250mW❌面积/功耗

8.3 最终选择

WH+2VC是唯一满足所有约束的方案。2条VC分别用于:VC0=延迟敏感消息(一致性/控制),VC1=吞吐量敏感数据(DMA)。

9. 交换技术的综合对比实验

以下是三种交换技术在4×4 Mesh上的完整仿真对比:

9.1 实验配置

9.2 结果分析

包长交换技术零负载延迟饱和吞吐面积比
4 flitWH12 cycles0.351.0×
4 flitVCT10 cycles0.382.5×
16 flitWH24 cycles0.251.0×
16 flitVCT18 cycles0.402.5×

关键发现:短包时WH和VCT差异不大(包短,阻塞传播短);长包时VCT优势显著(阻塞传播严重)。

◀ 上一课 📖 目录 下一课 ▶

附录:本课关键概念速查

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

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