理解NoC路由器的完整微架构,掌握四阶段和三阶段流水线设计,理解各组件的交互和时序。
路由器微架构定义了路由器内部各功能组件的组织方式和数据通路。经典NoC路由器由输入缓冲、路由计算、虚拟通道分配、开关分配、交叉开关五个核心组件构成。
经典NoC路由器采用四阶段流水线,每个阶段1个cycle:
| 阶段 | 操作 | 延迟 |
|---|---|---|
| BW: Buffer Write | 写入输入缓冲区 | 1 cycle |
| RC: Route Compute | 计算输出端口 | 1 cycle |
| VA/SA: 分配 | VC分配+开关分配 | 1-2 cycles |
| ST: Switch Traversal | 通过交叉开关 | 1 cycle |
通过推测(speculation)将VA和SA合并,实现三阶段流水线:
每个输入端口有独立的FIFO缓冲区,深度通常为2-8个flit。缓冲区是路由器面积和功耗的主要来源。
根据头flit的目的地址计算输出端口。XY路由只需简单比较,1 cycle完成。
为头flit分配输出端口的虚拟通道。使用Separate Allocators per Output (SAO)或全连接分配器。
仲裁哪些输入端口获得交叉开关的使用权。使用Round-Robin或矩阵仲裁器。
// 完整四阶段流水线路由器
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验证。
练习1:实现三阶段推测流水线路由器。
练习2:计算4阶段流水线中头flit经过3跳的总延迟。
练习3:分析流水线深度对路由器频率的影响。
你已掌握NoC路由器的完整微架构!
路由器面积是NoC面积的主要组成部分。以下是典型5端口路由器的面积分解:
缓冲区面积 = 深度 × 宽度 × 每bit面积。优化方法:
N×N交叉开关面积 = N² × 每个交叉点面积。优化方法:
| 频率 | 缓冲区 | 交叉开关 | 总面积 |
|---|---|---|---|
| 500MHz | 0.006mm² | 0.002mm² | 0.012mm² |
| 1GHz | 0.008mm² | 0.003mm² | 0.018mm² |
| 2GHz | 0.012mm² | 0.005mm² | 0.028mm² |
NoC路由器微架构正在不断演进,以下是最新的研究趋势:
不同位置的路由器配置不同参数:中心路由器(高流量)用深缓冲+多VC,边缘路由器(低流量)用浅缓冲+少VC。在4×4 Mesh中可节省20-30%面积。
对某些流量(如视频/音频),允许偶尔的数据错误。近似路由器可以在拥塞时丢弃低优先级flit,简化流控设计。
使用轻量级神经网络预测流量模式,动态调整路由和流控参数。面积开销约5%,但吞吐量提升15-25%。
在路由器中集成光互连接口:长距离传输用光(高带宽低功耗),短距离路由用电(灵活可编程)。预计在2028年后量产。
不同微架构的详细对比:
| 特性 | 经典4阶段 | 推测3阶段 | 前瞻2阶段 |
|---|---|---|---|
| 头flit延迟 | 4 cycles | 3 cycles | 2 cycles |
| 关键路径 | SA(仲裁) | VA+SA | SA+ST |
| 最大频率 | 1.0GHz | 0.9GHz | 0.8GHz |
| 面积 | 0.02mm² | 0.022mm² | 0.025mm² |
| 推测成功率 | N/A | 85% | 90% |
| 适用场景 | 通用 | 低延迟需求 | 极低延迟 |
对于大多数NoC设计,推测3阶段是最佳平衡点:相比4阶段减少1 cycle延迟,相比2阶段面积和复杂度可控。只有在延迟极度敏感的应用(如Cache一致性)中才考虑2阶段。
路由器微架构的验证需要逐阶段检查:
特别需要验证的冒险场景:
每个流水线阶段的寄存器传输是否正确?通过波形检查每个阶段的输入/输出数据是否匹配预期。
以下是一个5端口路由器在28nm工艺下的综合结果:
| 组件 | 面积(μm²) | 占总面积(%) | 关键路径(ns) |
|---|---|---|---|
| 输入缓冲(5×4deep×32bit) | 6400 | 45% | 0.2 |
| 交叉开关(5×5×32) | 2100 | 15% | 0.3 |
| 路由计算 | 200 | 1% | 0.2 |
| VC分配器 | 1200 | 8% | 0.4 |
| 开关分配器 | 800 | 6% | 0.5 |
| 控制逻辑 | 1500 | 10% | - |
| 时钟树 | 2000 | 14% | - |
| 总计 | 14200 | 100% | 0.5 |
关键路径在开关分配器(0.5ns → fmax=2.0GHz)。优化SA可将fmax提升至2.5GHz。