理解虚拟直通(VCT)和切片交换的原理、实现和适用场景,对比虫孔交换和VCT的优劣。
虚拟直通(Virtual Cut-Through)介于存储转发和虫孔交换之间:头flit到达后即可转发(类似虫孔),但当下游缓冲区满时,整个包被缓冲在当前路由器(不像虫孔那样阻塞整条路径)。
VCT的最大优势是不阻塞链路:当一个包被阻塞时,它被完整地存储在路由器中,释放了链路给其他包使用。这显著提高了链路利用率,特别是在高负载下。
VCT需要大缓冲区——必须能容纳最大包长。如果一个包有128个flit,则每个输入端口需要128-flit深的缓冲区。这是VCT在NoC中不如虫孔交换流行的原因。
切片交换将数据包切分为多个固定长度的切片,每个切片独立路由。与虫孔交换的区别是:切片的粒度大于flit(通常16-128字节),且每个切片可以独立选择路径。
| 特性 | 虫孔(WH) | 虚拟直通(VCT) | 切片交换 |
|---|---|---|---|
| 缓冲区需求 | 小(几个flit) | 大(整个包) | 中(一个切片) |
| 阻塞影响 | 整条路径 | 本跳 | 本切片 |
| 链路利用率 | 低(阻塞时) | 高 | 最高 |
| 乱序问题 | 无 | 无 | 有 |
| 面积 | 小 | 大 | 中 |
| NoC适用性 | ✅首选 | 高性能场景 | 特殊场景 |
// 虚拟直通(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
VCT路由器通过Verilator验证。
练习1:仿真对比WH和VCT在拥塞场景下的链路利用率。
练习2:实现切片交换的重排序缓冲区。
练习3:分析VCT的缓冲区需求对面积的影响。
完成流控阶段!你已掌握所有NoC流控策略!
在NoC设计初期,需要根据系统需求选择合适的交换技术。以下是完整的决策框架:
VCT的主要缺点是缓冲区大。优化策略:
切片交换允许不同切片走不同路径,可能导致乱序到达。需要重排序缓冲区:
// 切片重排序缓冲区
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适用于高性能场景,切片交换适用于特殊需求(如容错)。
综合所有因素,交换技术的选择可以用以下决策矩阵来指导:
| 设计约束 | 推荐交换技术 | 流控搭配 | 理由 |
|---|---|---|---|
| 面积优先 | WH | 信用 | 缓冲区最小 |
| 延迟优先 | VCT | 信用 | 无阻塞传播 |
| 功耗优先 | WH+1VC | ON/OFF | 面积小功耗低 |
| 吞吐优先 | WH+2VC | 信用 | 并行通道多 |
| 容错需求 | 切片交换 | ACK/NACK | 独立路由+重传 |
| 混合流量 | WH+2VC | 信用 | 短包/长包分离 |
几个知名开源NoC项目使用的交换技术:
以下通过一个具体案例展示如何选择交换技术:
设计一个8核AI加速器NoC:核间通信延迟<20cycles,DMA块传输吞吐>10GB/s,面积预算0.5mm²,功耗预算200mW。
| 方案 | 延迟 | 吞吐 | 面积 | 功耗 | 满足? |
|---|---|---|---|---|---|
| WH+0VC | 25 cycles | 5GB/s | 0.3mm² | 100mW | ❌延迟/吞吐 |
| WH+2VC | 20 cycles | 12GB/s | 0.45mm² | 180mW | ✅全部 |
| VCT+2VC | 15 cycles | 15GB/s | 0.7mm² | 250mW | ❌面积/功耗 |
WH+2VC是唯一满足所有约束的方案。2条VC分别用于:VC0=延迟敏感消息(一致性/控制),VC1=吞吐量敏感数据(DMA)。
以下是三种交换技术在4×4 Mesh上的完整仿真对比:
| 包长 | 交换技术 | 零负载延迟 | 饱和吞吐 | 面积比 |
|---|---|---|---|---|
| 4 flit | WH | 12 cycles | 0.35 | 1.0× |
| 4 flit | VCT | 10 cycles | 0.38 | 2.5× |
| 16 flit | WH | 24 cycles | 0.25 | 1.0× |
| 16 flit | VCT | 18 cycles | 0.40 | 2.5× |
关键发现:短包时WH和VCT差异不大(包短,阻塞传播短);长包时VCT优势显著(阻塞传播严重)。
本课涵盖了NoC设计的核心知识点。以下是关键概念的快速参考:
掌握这些概念是深入理解NoC设计的基础。建议结合Verilog代码实践,加深理解。