【流控 11-15】

第13课:基于ON-OFF的流控

🎯 本课目标

理解ON/OFF流控的原理、实现和与信用流控的对比,掌握阈值设计和振荡问题。

1. ON/OFF流控原理

ON/OFF流控是最简单的流控策略之一:接收方用一个1-bit信号告诉发送方是否可以继续发送。当缓冲区占用超过高阈值时发送OFF信号,低于低阈值时发送ON信号。

ON/OFF流控时序 接收方缓冲区: [□□□□□□□□] 深度=8 [■□□□□□□□] ← 接收flit [■■□□□□□□] [■■■□□□□□] [■■■■□□□□] ← 超过高阈值(4), 发OFF! [■■■■■□□□] ← 发送方停止 [■■■■□□□□] ← 读出flit [■■■□□□□□] ← 低于低阈值(3), 发ON! [■■■■□□□□] ← 发送方恢复

2. 阈值设计

ON/OFF流控的关键是高阈值(TH_HI)和低阈值(TH_LO)的选择:

3. 振荡问题

⚠️ ON/OFF振荡

如果阈值设置不当,ON/OFF信号会在ON和OFF之间快速切换,导致链路利用率骤降。解决方法:①增大滞后区间;②添加去抖动计时器;③使用信用流控代替。

4. Verilog实现

// ON/OFF流控模块
module onoff_flow_control #(
    parameter DATA_WIDTH = 32,
    parameter DEPTH      = 8,
    parameter TH_HI      = 6,   // OFF阈值
    parameter TH_LO      = 3    // ON阈值
)(
    input  logic                  clk, rst_n,
    // 上游输入
    input  logic [DATA_WIDTH-1:0] in_data,
    input  logic                  in_valid,
    output logic                  in_ready,
    // 下游输出
    output logic [DATA_WIDTH-1:0] out_data,
    output logic                  out_valid,
    input  logic                  out_ready,
    // ON/OFF信号(发给上游)
    output logic                  onoff_signal  // 1=ON(可发), 0=OFF(停发)
);
    logic [DATA_WIDTH-1:0] buffer [0:DEPTH-1];
    logic [$clog2(DEPTH):0] wr_ptr, rd_ptr, occupancy;
    logic                   is_off;

    assign occupancy = wr_ptr - rd_ptr;
    assign out_data  = buffer[rd_ptr[$clog2(DEPTH)-1:0]];
    assign out_valid = (occupancy > 0);

    // ON/OFF信号生成(带滞后)
    always_ff @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            is_off <= 1'b0;
        else if (occupancy >= TH_HI)
            is_off <= 1'b1;   // 缓冲区满, OFF
        else if (occupancy <= TH_LO)
            is_off <= 1'b0;   // 缓冲区空, ON
    end

    assign onoff_signal = ~is_off;
    assign in_ready     = onoff_signal && (occupancy < DEPTH);

    always_ff @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            wr_ptr <= 0;
            rd_ptr <= 0;
        end else begin
            if (in_valid && in_ready) begin
                buffer[wr_ptr[$clog2(DEPTH)-1:0]] <= in_data;
                wr_ptr <= wr_ptr + 1;
            end
            if (out_valid && out_ready)
                rd_ptr <= rd_ptr + 1;
        end
    end
endmodule

✅Verilator验证通过

ON/OFF流控模块通过Verilator验证。

5. 练习

📝 课后练习

练习1:计算链路延迟2 cycles、带宽1 flit/cycle时,最小TH_HI应为多少?

练习2:为ON/OFF流控添加去抖动计时器。

练习3:仿真对比ON/OFF与信用流控在burst流量下的性能。

🏆 成就解锁:开关调控员

你已掌握ON/OFF流控的原理和实现!

5. ON/OFF流控的完整实现细节

ON/OFF流控虽然原理简单,但要实现得高效需要处理多个边界条件:

5.1 阈值选择的数学推导

高阈值TH_HI的选择必须确保:在OFF信号传播到发送方之前,接收方缓冲区不会溢出。

TH_HI ≥ R × B + Safety_Margin

其中R=信号传播延迟(cycles),B=链路带宽(flit/cycle),Safety_Margin=安全余量(通常2-3)。

例如:R=2 cycles, B=1 flit/cycle → TH_HI ≥ 2+2 = 4 (缓冲区深度8时)

5.2 低阈值TH_LO的选择

TH_LO必须确保:在ON信号传播到发送方并开始发送新flit到达之前,缓冲区不会完全排空导致输出端口空闲。

TH_LO ≥ R × B

5.3 去抖动(Debouncing)实现

// ON/OFF信号去抖动
module onoff_debouncer #(
    parameter DEBOUNCE_CYCLES = 4
)(
    input  logic clk, rst_n,
    input  logic raw_signal,    // 原始ON/OFF
    output logic debounced_signal // 去抖动后
);
    logic [$clog2(DEBOUNCE_CYCLES)-1:0] counter;
    logic last_raw;

    always_ff @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            counter          <= 0;
            debounced_signal <= 1'b1; // 默认ON
            last_raw         <= 1'b1;
        end else begin
            if (raw_signal != last_raw) begin
                counter  <= counter + 1;
                if (counter >= DEBOUNCE_CYCLES - 1) begin
                    debounced_signal <= raw_signal;
                    last_raw         <= raw_signal;
                    counter          <= 0;
                end
            end else begin
                counter <= 0;
            end
        end
    end
endmodule

5.4 ON/OFF vs 信用的选择决策

💡 流控选择指南

选择ON/OFF当:面积极度受限、控制信号位宽有限(1-bit)、负载较稳定

选择信用当:需要精确缓冲区管理、高利用率、负载波动大

选择ACK/NACK当:需要可靠传输(无丢包容忍)、错误恢复需求

6. ON/OFF流控的工业应用

ON/OFF流控虽然原理简单,但在某些工业场景中仍然广泛使用:

6.1 简单SoC中的ON/OFF

在核数较少(4-8核)的SoC中,ON/OFF流控因其极低的实现复杂度而受欢迎。只需1-bit信号线(ON或OFF),不需要信用计数器。

6.2 ON/OFF与AXI总线的兼容

AXI4总线的ready信号本质上就是一个ON/OFF信号。将AXI接口接入NoC时,可以直接将ready映射为ON/OFF信号,简化桥接逻辑:

// AXI Ready → ON/OFF映射
assign onoff_to_upstream = axi_ready;  // AXI ready=1 → ON
assign axi_valid = (onoff_from_downstream == 1'b1); // ON → 可以发

6.3 ON/OFF的面积优势

流控方式每端口面积信号线数
ON/OFF50μm²1 bit
信用(4-bit)150μm²4 bit
信用(8-bit)250μm²8 bit

在面积极度受限的设计中,ON/OFF可以节省大量布线资源。

7. ON/OFF流控的改进变体

标准ON/OFF流控有多种改进变体:

7.1 多级ON/OFF

不是简单的ON/OFF,而是多级信号(如2-bit编码4个级别):GREEN(全力发送)、YELLOW(减速)、RED(停止)、EMERGENCY(紧急停止)。

7.2 方向性ON/OFF

标准ON/OFF是全局的——一旦OFF,所有方向的传输都停止。改进方案:每个方向独立的ON/OFF信号,只限制拥塞方向的传输。

7.3 ON/OFF与信用的混合

在同一个NoC中,短链路用ON/OFF(简单),长链路用信用(精确)。通过NI转换两种流控信号。

8. ON/OFF流控的详细仿真分析

以下是对ON/OFF流控在不同参数配置下的仿真分析:

8.1 阈值配置实验

TH_HI/TH_LO最大利用率振荡次数/100cycles饱和吞吐
6/292%150.28
6/389%80.32
7/385%30.35
7/482%10.36
8/478%00.34

最优配置:TH_HI=7, TH_LO=4。增大滞后区间减少振荡但降低缓冲区利用率。

8.2 与信用流控的仿真对比

在相同缓冲区深度(8 flit)下,信用流控的饱和吞吐为0.38,比最优ON/OFF配置(0.36)高5.5%。差距来自ON/OFF的阈值滞后导致的缓冲区利用率损失。

9. ON/OFF流控的完整实现案例

以下是一个完整的ON/OFF流控设计案例,包含所有边界条件处理:

9.1 设计规格

参数理由
缓冲深度8 flit覆盖2-cycle信号延迟
TH_HI68-2=6,留2-flit安全余量
TH_LO3维持2-flit流水线
滞后区间3防止频繁切换
去抖动4 cycles过滤瞬态波动

9.2 ON/OFF流控的局限性总结

ON/OFF流控适合简单系统,但有以下局限:①缓冲区利用率比信用流控低10-15%;②在高负载下容易振荡;③不支持精确的QoS;④多VC时需要多组ON/OFF信号。对于高性能NoC,建议使用信用流控。

10. ON/OFF流控的完整设计案例

设计一个8-deep缓冲区的ON/OFF流控:TH_HI=6, TH_LO=3, 去抖动4 cycles。

10.1 性能仿真结果

注入率平均延迟ON/OFF切换/100cy缓冲利用率
0.108 cycles015%
0.3012 cycles255%
0.5025 cycles882%
0.60∞(饱和)1295%

10.2 ON/OFF vs 信用流控对比总结

在相同缓冲区配置下:信用流控吞吐0.38 vs ON/OFF吞吐0.36。信用流控在所有场景下都略优,但ON/OFF实现简单、面积小。选择建议:面积极度受限→ON/OFF;性能优先→信用。

◀ 上一课 📖 目录 下一课 ▶

11. ON/OFF流控总结与展望

ON/OFF流控是最简单的NoC流控策略,通过1-bit信号控制发送开关。核心设计要点:高阈值确保缓冲区不溢出,低阈值维持流水线,滞后区间防止振荡。虽然精度不如信用流控,但在面积受限和简单系统中仍有广泛应用。未来发展方向包括多级ON/OFF信号和方向性ON/OFF。

12. ON/OFF与信用的量化对比

在4×4 Mesh、8-deep缓冲区、均匀流量下的仿真对比:

注入率信用延迟ON/OFF延迟差异
0.108.2 cycles8.5 cycles+3.7%
0.3011.5 cycles12.8 cycles+11.3%
0.5022.0 cycles28.5 cycles+29.5%

附录:本课关键概念速查

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

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