理解NoC中的四种交换技术——存储转发、虚拟直通、虫孔交换和切片交换,掌握各技术的工作原理、延迟模型和适用场景。
交换技术(Switching Technique)决定了数据如何在NoC路由器之间传输。它定义了数据传输的粒度(整包vs切片)和传输触发条件(收完再发vs边收边发)。交换技术直接影响延迟、缓冲区需求和吞吐量。
路由器必须完整接收整个数据包后才开始向下一跳转发。数据包在每一跳都经历完整的缓冲延迟。
对于L bit的数据包,链路带宽W bit/cycle,经过H跳:
T_SAF = H × (L/W + T_link)
延迟与跳数成正比,每跳都要等整个包传完。
只要收到数据包的头部flit并完成路由计算,就可以开始向下一跳转发。但要求下一跳有足够的缓冲区容纳整个包。
虫孔交换是NoC中最常用的交换技术。数据包被切分成多个flit,头flit路由后立即建立路径,后续flit沿同一路径流水传输。如果头flit被阻塞,整条路径上的flit都停止——这叫"阻塞传播"。
当头flit在某跳被阻塞时,后续所有flit都停在原地,占用了整条路径上的链路和缓冲区。这导致其他数据包无法使用这些被占用的资源,形成"假拥塞"。这是虫孔交换最大的缺点。
| 特性 | 存储转发 | 虚拟直通 | 虫孔交换 |
|---|---|---|---|
| 转发触发 | 整包收完 | 头flit到达 | 头flit到达 |
| 缓冲区需求 | 整个包 | 整个包 | 几个flit |
| 空闲延迟 | H×T_pkt | T_hdr×H+T_pkt | T_hdr×H+T_pkt |
| 拥塞影响 | 本跳等待 | 本跳等待 | 整条路径阻塞 |
| 面积 | 大 | 大 | 小 |
| NoC适用性 | ❌不适用 | 可选 | ✅首选 |
// 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语法验证。
练习1:计算512bit包在3跳路径上,SAF vs WH的延迟差异(链路128bit/cycle)。
练习2:修改wormhole_switch,添加路径建立/释放状态机。
练习3:分析虫孔交换拥塞时性能退化的根本原因。
你已掌握NoC四种交换技术的原理和实现!
在NoC中,数据包(Packet)被切分为多个流控单元(Flit),flit是流控和交换的最小单位。理解flit的设计对交换技术的实现至关重要。
典型的NoC flit包含以下字段:
| Flit类型 | 包含字段 | 大小(bit) |
|---|---|---|
| 头flit | 类型+源地址+目的地址+包长+数据 | 64-128 |
| 体flit | 类型+数据 | 32-64 |
| 尾flit | 类型+数据+校验 | 32-64 |
包长直接影响延迟和吞吐量:
不同的流量模式对交换技术有不同的敏感度:
面积优先:虫孔交换(最小缓冲区)
性能优先:VCT+信用流控(无阻塞传播)
均衡设计:WH+2-VC(面积适中,性能接近VCT)
混合设计:短包用WH,长包用VCT
选择交换技术不仅要看空闲网络下的理论延迟,更要看在实际流量下的表现。以下是详细的仿真分析:
在均匀随机流量下,三种交换技术的零负载延迟相同(头flit建立路径的时间相同)。随着负载增加,WH最先饱和(阻塞传播导致链路利用率低),VCT次之,VCT+2VC最优。
在热点流量下(多个源发往同一目的),WH性能急剧下降——阻塞从热点点反向传播,阻塞了整条路径上的其他流量。VCT的表现好得多,因为被阻塞的包完整存储在路由器中,不阻塞链路。
实际SoC中,包长不是固定的。短包(1-4 flit,Cache一致性)和长包(32+ flit,DMA)混合存在。这种混合流量对交换技术有特殊要求:
在BookSim2等NoC仿真器中,交换技术通过配置参数选择:
// BookSim2配置文件示例
{
"switching": "wormhole", // 或 "cut_through"
"num_vcs": 2,
"buffer_depth": 4,
"packet_size": 4, // 平均包长(flit)
"routing_function": "xy", // 路由函数
"flow_control": "credit" // 流控方式
}
在8×8 Mesh上,不同交换技术的仿真对比:
| 交换技术 | 零负载延迟 | 饱和负载 | 面积(相对) |
|---|---|---|---|
| WH+0VC | 22 cycles | 0.25 | 1.0× |
| WH+2VC | 22 cycles | 0.40 | 1.8× |
| VCT+0VC | 18 cycles | 0.35 | 2.5× |
| VCT+2VC | 18 cycles | 0.45 | 4.0× |
设计一个公平对比三种交换技术的仿真实验:
主指标:平均延迟(cycles)、网络吞吐量(flit/node/cycle)。辅助指标:链路利用率(%)、缓冲区利用率(%)、功耗(mW)。
本课涵盖了NoC设计的核心知识点。以下是关键概念的快速参考:
掌握这些概念是深入理解NoC设计的基础。建议结合Verilog代码实践,加深理解。