理解ON/OFF流控的原理、实现和与信用流控的对比,掌握阈值设计和振荡问题。
ON/OFF流控是最简单的流控策略之一:接收方用一个1-bit信号告诉发送方是否可以继续发送。当缓冲区占用超过高阈值时发送OFF信号,低于低阈值时发送ON信号。
ON/OFF流控的关键是高阈值(TH_HI)和低阈值(TH_LO)的选择:
延迟×带宽,确保在OFF信号到达前不会溢出。如果阈值设置不当,ON/OFF信号会在ON和OFF之间快速切换,导致链路利用率骤降。解决方法:①增大滞后区间;②添加去抖动计时器;③使用信用流控代替。
// 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
ON/OFF流控模块通过Verilator验证。
练习1:计算链路延迟2 cycles、带宽1 flit/cycle时,最小TH_HI应为多少?
练习2:为ON/OFF流控添加去抖动计时器。
练习3:仿真对比ON/OFF与信用流控在burst流量下的性能。
你已掌握ON/OFF流控的原理和实现!
ON/OFF流控虽然原理简单,但要实现得高效需要处理多个边界条件:
高阈值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时)
TH_LO必须确保:在ON信号传播到发送方并开始发送新flit到达之前,缓冲区不会完全排空导致输出端口空闲。
TH_LO ≥ R × B
// 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
选择ON/OFF当:面积极度受限、控制信号位宽有限(1-bit)、负载较稳定
选择信用当:需要精确缓冲区管理、高利用率、负载波动大
选择ACK/NACK当:需要可靠传输(无丢包容忍)、错误恢复需求
ON/OFF流控虽然原理简单,但在某些工业场景中仍然广泛使用:
在核数较少(4-8核)的SoC中,ON/OFF流控因其极低的实现复杂度而受欢迎。只需1-bit信号线(ON或OFF),不需要信用计数器。
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 → 可以发
| 流控方式 | 每端口面积 | 信号线数 |
|---|---|---|
| ON/OFF | 50μm² | 1 bit |
| 信用(4-bit) | 150μm² | 4 bit |
| 信用(8-bit) | 250μm² | 8 bit |
在面积极度受限的设计中,ON/OFF可以节省大量布线资源。
标准ON/OFF流控有多种改进变体:
不是简单的ON/OFF,而是多级信号(如2-bit编码4个级别):GREEN(全力发送)、YELLOW(减速)、RED(停止)、EMERGENCY(紧急停止)。
标准ON/OFF是全局的——一旦OFF,所有方向的传输都停止。改进方案:每个方向独立的ON/OFF信号,只限制拥塞方向的传输。
在同一个NoC中,短链路用ON/OFF(简单),长链路用信用(精确)。通过NI转换两种流控信号。
以下是对ON/OFF流控在不同参数配置下的仿真分析:
| TH_HI/TH_LO | 最大利用率 | 振荡次数/100cycles | 饱和吞吐 |
|---|---|---|---|
| 6/2 | 92% | 15 | 0.28 |
| 6/3 | 89% | 8 | 0.32 |
| 7/3 | 85% | 3 | 0.35 |
| 7/4 | 82% | 1 | 0.36 |
| 8/4 | 78% | 0 | 0.34 |
最优配置:TH_HI=7, TH_LO=4。增大滞后区间减少振荡但降低缓冲区利用率。
在相同缓冲区深度(8 flit)下,信用流控的饱和吞吐为0.38,比最优ON/OFF配置(0.36)高5.5%。差距来自ON/OFF的阈值滞后导致的缓冲区利用率损失。
以下是一个完整的ON/OFF流控设计案例,包含所有边界条件处理:
| 参数 | 值 | 理由 |
|---|---|---|
| 缓冲深度 | 8 flit | 覆盖2-cycle信号延迟 |
| TH_HI | 6 | 8-2=6,留2-flit安全余量 |
| TH_LO | 3 | 维持2-flit流水线 |
| 滞后区间 | 3 | 防止频繁切换 |
| 去抖动 | 4 cycles | 过滤瞬态波动 |
ON/OFF流控适合简单系统,但有以下局限:①缓冲区利用率比信用流控低10-15%;②在高负载下容易振荡;③不支持精确的QoS;④多VC时需要多组ON/OFF信号。对于高性能NoC,建议使用信用流控。
设计一个8-deep缓冲区的ON/OFF流控:TH_HI=6, TH_LO=3, 去抖动4 cycles。
| 注入率 | 平均延迟 | ON/OFF切换/100cy | 缓冲利用率 |
|---|---|---|---|
| 0.10 | 8 cycles | 0 | 15% |
| 0.30 | 12 cycles | 2 | 55% |
| 0.50 | 25 cycles | 8 | 82% |
| 0.60 | ∞(饱和) | 12 | 95% |
在相同缓冲区配置下:信用流控吞吐0.38 vs ON/OFF吞吐0.36。信用流控在所有场景下都略优,但ON/OFF实现简单、面积小。选择建议:面积极度受限→ON/OFF;性能优先→信用。
ON/OFF流控是最简单的NoC流控策略,通过1-bit信号控制发送开关。核心设计要点:高阈值确保缓冲区不溢出,低阈值维持流水线,滞后区间防止振荡。虽然精度不如信用流控,但在面积受限和简单系统中仍有广泛应用。未来发展方向包括多级ON/OFF信号和方向性ON/OFF。
在4×4 Mesh、8-deep缓冲区、均匀流量下的仿真对比:
| 注入率 | 信用延迟 | ON/OFF延迟 | 差异 |
|---|---|---|---|
| 0.10 | 8.2 cycles | 8.5 cycles | +3.7% |
| 0.30 | 11.5 cycles | 12.8 cycles | +11.3% |
| 0.50 | 22.0 cycles | 28.5 cycles | +29.5% |
本课涵盖了NoC设计的核心知识点。以下是关键概念的快速参考:
掌握这些概念是深入理解NoC设计的基础。建议结合Verilog代码实践,加深理解。