Chapter 9: Pipelined Virtual-Channel-Based Routers本文版权归作者所有任何形式的转载都请注明出处9.1 基本结构与流水如 Fig 9.2 所示输入为两包完整 Packet 先后到达相同 inVC基本结构为三级流水pipe 0flit 经过链路传输到达并写入 Buffer。pipe 1flit 位于 Buffer 最前端执行 RC → VA → SA 分配 outVC 后从 Buffer 出队通过 Switch 到达输出端口。pipe 2flit 经过链路传输到达并写入下一 hop 的 Buffer。如 Fig 9.3 所示输入为两包 Packet 交织、先后到达不同的 inVC并且有竞争存在仲裁失败cycle 0H0 到达 Buffer。cycle 1H0 执行 RC-VA-SA-DQ-STH1 到达 Buffer。cycle 2H0 到达下一 hop 的 BufferH1 执行 VA 仲裁失败B0 到达 Buffer。cycle 3H1 执行 RC-VA-SA-DQ-STB0 执行 SA 仲裁失败B1 到达 Buffer。… …正常情况下不会断流。若出现以下三种情况会断流(a) VA 仲裁失败(b) SA2 仲裁失败© outVC 无 Credit 可用。9.2 RC 后插入 Pipeline不采用 Lookahead RC如 Fig 9.6、Fig 9.7 所示在 RC 后插入一拍删除outPort寄存器的 Bypass 通路四级流水pipe 0flit 经过链路传输到达并写入 Buffer。pipe 1flit 位于 Buffer 最前端执行 RC 后写入outPort寄存器。pipe 2用outPort寄存器的值执行 VA-SA 分配 outVC 后从 Buffer 出队通过 Switch 到达输出端口。pipe 3flit 经过链路传输到达并写入下一 hop 的 Buffer。控制通路和数据通路都需要插一拍否则流水中会产生 Bubble 影响吞吐。如 Fig 9.5 所示H1 必须等 T0 离开 inBuffer 才能执行 RC。在 Fig 9.6 所示结构中若 flit 因仲裁失败导致被阻塞在 EB则是属于竞争导致流水 Stall不属于流水结构问题。9.3 VA 后插入 Pipeline如 Fig 9.8 所示在 VA 后插一拍删除outVC寄存器的 Bypass 通路四级流水pipe 0flit 经过链路传输到达并写入 Buffer。pipe 1flit 位于 Buffer 最前端执行 RC-VA 分配结果写入outVC寄存器。pipe 2用outPort和outVC寄存器值组成 SA 输入SA 成功后从 Buffer 出队通过 Switch 到达输出端口。pipe 3flit 经过链路传输到达并写入下一 hop 的 Buffer。如 Fig 9.9 所示为两包 Packet 背靠背进入同一个 inVC 的流水时序。H0 分配 VC 成功后后续 B0 和 T0 可以跳过 RC-VA 阶段直接用outVC寄存结果参与 SA 仲裁。而 H1 需要等 T0 离开后才能继续执行 RC原因是 T0 处于 pipe2 时 H1 仍未从 Buffer 出队——因此在每 Packet 之间会产生两拍 Bubble。最好的情况如 Fig 9.10 所示两包 Packet 属于不同的 inVC交织传输顺序为 H0-B0-H1-T0-B1。若不因竞争而断流此时刚好达到100% 吞吐。那么可不可以效仿之前在数据通路同步插一拍 EB—— NO当前一包 T0 进入 EB且 T0 持有 VC0。若 T0 因 SA 仲裁失败或 Credit 不足而阻塞时随后一包 H1 也被阻塞且 H1 经过 VA 仲裁后持有 VC1。此时不同 VC 之间会产生依赖链条——即一个 inVC 同时持有两个不同的 outVCVC0 和 VC1且必须等待 outVC0 释放后outVC1 才能释放。所以为了避免死锁必须保证 Packet 的原子性即等待前一包 Packet 完全离开后才能允许下一包 Packet 进入则数据通路的插拍属于浪费。由此可知此时流水线 Bubble 是属于不可避免的固有代价无法通过打拍消除。9.4 SA 后插入 Pipeline如 Fig 9.11 所示在 SA 输出 sel 信号后以及数据通路 ST 前插一拍四级流水pipe 0flit 经过链路传输到达并写入 Buffer。pipe 1flit 位于 Buffer 最前端执行 RC-VA-SA 仲裁成功返回 Grant控制 Buffer 前端 flit 出队进入 Switch 前写入 EB。pipe 2延迟一拍后的 Switch sel 信号控制 flit 通过 Switch并更新 Credit Counter。pipe 3flit 经过链路传输到达并写入下一 hop 的 Buffer。关键问题更新 Credit 比 SA 仲裁延迟一拍可能导致下游 Buffer 溢出。当 pipe1 执行 SA 时由于 Credit 更新有一拍延迟判断 VC 可用的信息是旧的Credit 可能已经被前一包 flit 消耗掉。所以 SA 判断 Credit 可用的条件需要由creditCounter 0调整为creditCounter 1。由于 Round Trip Delay 增加一拍所以为了 100% 吞吐Buffer 深度需要 1。更新 Credit 能否提前执行与 SA 对齐—— NO因为 pipe2 和 pipe3 信息不对称——只有数据成功通过 Switch才能得到更新 Credit 的VCid信息前一拍 SA 无法提前更新目标 VC 的 Credit。除非 SA 阶段增加一个 MUX 用于获取 VC 信息这个 MUX 的输入是每个输入端请求的 outVC输出是驱动每个 outVC 更新 Credit 的 sel 信号即 NV × NV得不偿失。9.5 全 Pipeline 结构多级流水无需「重新设计」只需要把前面提到的「切割方式」组合起来如 Fig 9.17 所示。影响在于需要重新计算 Round Trip 延时评估 Buffer 深度。需要注意的是类比 Amdahl 定律随着流水线深度的增加其在提升频率上的收益会递减。盲目插入 Pipeline 不可取需要在目标主频和硬件代价之间 Trade-off。
NoC组件之Router微架构解析(九)流水线化的多虚通道Router结构
发布时间:2026/6/15 16:32:16
Chapter 9: Pipelined Virtual-Channel-Based Routers本文版权归作者所有任何形式的转载都请注明出处9.1 基本结构与流水如 Fig 9.2 所示输入为两包完整 Packet 先后到达相同 inVC基本结构为三级流水pipe 0flit 经过链路传输到达并写入 Buffer。pipe 1flit 位于 Buffer 最前端执行 RC → VA → SA 分配 outVC 后从 Buffer 出队通过 Switch 到达输出端口。pipe 2flit 经过链路传输到达并写入下一 hop 的 Buffer。如 Fig 9.3 所示输入为两包 Packet 交织、先后到达不同的 inVC并且有竞争存在仲裁失败cycle 0H0 到达 Buffer。cycle 1H0 执行 RC-VA-SA-DQ-STH1 到达 Buffer。cycle 2H0 到达下一 hop 的 BufferH1 执行 VA 仲裁失败B0 到达 Buffer。cycle 3H1 执行 RC-VA-SA-DQ-STB0 执行 SA 仲裁失败B1 到达 Buffer。… …正常情况下不会断流。若出现以下三种情况会断流(a) VA 仲裁失败(b) SA2 仲裁失败© outVC 无 Credit 可用。9.2 RC 后插入 Pipeline不采用 Lookahead RC如 Fig 9.6、Fig 9.7 所示在 RC 后插入一拍删除outPort寄存器的 Bypass 通路四级流水pipe 0flit 经过链路传输到达并写入 Buffer。pipe 1flit 位于 Buffer 最前端执行 RC 后写入outPort寄存器。pipe 2用outPort寄存器的值执行 VA-SA 分配 outVC 后从 Buffer 出队通过 Switch 到达输出端口。pipe 3flit 经过链路传输到达并写入下一 hop 的 Buffer。控制通路和数据通路都需要插一拍否则流水中会产生 Bubble 影响吞吐。如 Fig 9.5 所示H1 必须等 T0 离开 inBuffer 才能执行 RC。在 Fig 9.6 所示结构中若 flit 因仲裁失败导致被阻塞在 EB则是属于竞争导致流水 Stall不属于流水结构问题。9.3 VA 后插入 Pipeline如 Fig 9.8 所示在 VA 后插一拍删除outVC寄存器的 Bypass 通路四级流水pipe 0flit 经过链路传输到达并写入 Buffer。pipe 1flit 位于 Buffer 最前端执行 RC-VA 分配结果写入outVC寄存器。pipe 2用outPort和outVC寄存器值组成 SA 输入SA 成功后从 Buffer 出队通过 Switch 到达输出端口。pipe 3flit 经过链路传输到达并写入下一 hop 的 Buffer。如 Fig 9.9 所示为两包 Packet 背靠背进入同一个 inVC 的流水时序。H0 分配 VC 成功后后续 B0 和 T0 可以跳过 RC-VA 阶段直接用outVC寄存结果参与 SA 仲裁。而 H1 需要等 T0 离开后才能继续执行 RC原因是 T0 处于 pipe2 时 H1 仍未从 Buffer 出队——因此在每 Packet 之间会产生两拍 Bubble。最好的情况如 Fig 9.10 所示两包 Packet 属于不同的 inVC交织传输顺序为 H0-B0-H1-T0-B1。若不因竞争而断流此时刚好达到100% 吞吐。那么可不可以效仿之前在数据通路同步插一拍 EB—— NO当前一包 T0 进入 EB且 T0 持有 VC0。若 T0 因 SA 仲裁失败或 Credit 不足而阻塞时随后一包 H1 也被阻塞且 H1 经过 VA 仲裁后持有 VC1。此时不同 VC 之间会产生依赖链条——即一个 inVC 同时持有两个不同的 outVCVC0 和 VC1且必须等待 outVC0 释放后outVC1 才能释放。所以为了避免死锁必须保证 Packet 的原子性即等待前一包 Packet 完全离开后才能允许下一包 Packet 进入则数据通路的插拍属于浪费。由此可知此时流水线 Bubble 是属于不可避免的固有代价无法通过打拍消除。9.4 SA 后插入 Pipeline如 Fig 9.11 所示在 SA 输出 sel 信号后以及数据通路 ST 前插一拍四级流水pipe 0flit 经过链路传输到达并写入 Buffer。pipe 1flit 位于 Buffer 最前端执行 RC-VA-SA 仲裁成功返回 Grant控制 Buffer 前端 flit 出队进入 Switch 前写入 EB。pipe 2延迟一拍后的 Switch sel 信号控制 flit 通过 Switch并更新 Credit Counter。pipe 3flit 经过链路传输到达并写入下一 hop 的 Buffer。关键问题更新 Credit 比 SA 仲裁延迟一拍可能导致下游 Buffer 溢出。当 pipe1 执行 SA 时由于 Credit 更新有一拍延迟判断 VC 可用的信息是旧的Credit 可能已经被前一包 flit 消耗掉。所以 SA 判断 Credit 可用的条件需要由creditCounter 0调整为creditCounter 1。由于 Round Trip Delay 增加一拍所以为了 100% 吞吐Buffer 深度需要 1。更新 Credit 能否提前执行与 SA 对齐—— NO因为 pipe2 和 pipe3 信息不对称——只有数据成功通过 Switch才能得到更新 Credit 的VCid信息前一拍 SA 无法提前更新目标 VC 的 Credit。除非 SA 阶段增加一个 MUX 用于获取 VC 信息这个 MUX 的输入是每个输入端请求的 outVC输出是驱动每个 outVC 更新 Credit 的 sel 信号即 NV × NV得不偿失。9.5 全 Pipeline 结构多级流水无需「重新设计」只需要把前面提到的「切割方式」组合起来如 Fig 9.17 所示。影响在于需要重新计算 Round Trip 延时评估 Buffer 深度。需要注意的是类比 Amdahl 定律随着流水线深度的增加其在提升频率上的收益会递减。盲目插入 Pipeline 不可取需要在目标主频和硬件代价之间 Trade-off。