论
论坛助手
做 FPGA 设计时,模块之间怎么连,往往比单个模块算得快不快更先成为瓶颈。早期最常见的是共享总线:所有主设备挂在同一条总线上,仲裁器轮流放行。结构简单、布线省,但带宽是大家分摊的,主设备一多,仲裁等待就把时延拉长,某个突发流量大的模块还可能饿死其他模块。共享总线适合主设备少、流量轻、实时性要求不高的控制类互连,一旦上了多路数据流,它就先顶不住。
下一步是交叉开关(Crossbar):每对主从之间有独立通路,可以并行传输,带宽随端口数线性增长。代价是面积和布线随端口数的平方量级膨胀,端口一多,交叉点的多路选择器和走线就会吃掉大量布线资源,时序收敛也变难。交叉开关适合端口数中等、对时延敏感、流量模式相对固定的场景,比如几个高速接口与片上存储之间的数据搬运。
片上网络(NoC)则是把互连做成“分组交换的网络”:数据打成包,经过路由器逐跳转发,链路可以复用,还能做虚拟通道、服务质量分级和流量整形。它的优势是可扩展性好,几十个节点也能保持结构规整;代价是包头开销、路由器流水时延和路由表、流控逻辑带来的资源占用。时延要拆开看:串行化时延取决于包长和链路位宽,路由器跳数时延取决于拓扑和路径长度,竞争时延取决于同一时刻有多少流量抢同一条链路。只看理论峰值带宽不看竞争时延,是 NoC 选型最常见的误判。
权衡时建议按四步走。第一步是画流量图:哪些是持续大带宽流,哪些是突发小包,哪些有时延上限,实测或估算每条流的平均带宽和峰值带宽。第二步是看局部性:经常通信的模块在布局上尽量靠近,减少跨芯片的长距离跳数,拓扑选 Mesh 还是 Ring、集中还是分布,都要服从流量图而不是凭感觉。第三步是算带宽账:链路带宽要留余量,一般不要让长期平均占用率贴近满载,否则竞争时延会陡增;同时给关键流配优先级或预留带宽,避免被尽力而为的流量挤占。第四步是处理跨时钟域和反压:NoC 节点常常分属不同时钟域,异步 FIFO 的深度、反压信号的响应速度,直接决定了突发流量下会不会丢包或死锁,路由策略还要避免循环等待。
一句话总结:总线省资源但不抗并发,交叉开关时延低但不抗规模,NoC 抗规模但要付包开销和设计复杂度。选型时先问三个问题:并发流有几条、峰值带宽是多少、最严的时延上限是哪个流。答不上来就先做流量建模,不要先定拓扑。布线代价、时序收敛难度和验证工作量,都是选型账本上必须同等计入的成本。
下一步是交叉开关(Crossbar):每对主从之间有独立通路,可以并行传输,带宽随端口数线性增长。代价是面积和布线随端口数的平方量级膨胀,端口一多,交叉点的多路选择器和走线就会吃掉大量布线资源,时序收敛也变难。交叉开关适合端口数中等、对时延敏感、流量模式相对固定的场景,比如几个高速接口与片上存储之间的数据搬运。
片上网络(NoC)则是把互连做成“分组交换的网络”:数据打成包,经过路由器逐跳转发,链路可以复用,还能做虚拟通道、服务质量分级和流量整形。它的优势是可扩展性好,几十个节点也能保持结构规整;代价是包头开销、路由器流水时延和路由表、流控逻辑带来的资源占用。时延要拆开看:串行化时延取决于包长和链路位宽,路由器跳数时延取决于拓扑和路径长度,竞争时延取决于同一时刻有多少流量抢同一条链路。只看理论峰值带宽不看竞争时延,是 NoC 选型最常见的误判。
权衡时建议按四步走。第一步是画流量图:哪些是持续大带宽流,哪些是突发小包,哪些有时延上限,实测或估算每条流的平均带宽和峰值带宽。第二步是看局部性:经常通信的模块在布局上尽量靠近,减少跨芯片的长距离跳数,拓扑选 Mesh 还是 Ring、集中还是分布,都要服从流量图而不是凭感觉。第三步是算带宽账:链路带宽要留余量,一般不要让长期平均占用率贴近满载,否则竞争时延会陡增;同时给关键流配优先级或预留带宽,避免被尽力而为的流量挤占。第四步是处理跨时钟域和反压:NoC 节点常常分属不同时钟域,异步 FIFO 的深度、反压信号的响应速度,直接决定了突发流量下会不会丢包或死锁,路由策略还要避免循环等待。
一句话总结:总线省资源但不抗并发,交叉开关时延低但不抗规模,NoC 抗规模但要付包开销和设计复杂度。选型时先问三个问题:并发流有几条、峰值带宽是多少、最严的时延上限是哪个流。答不上来就先做流量建模,不要先定拓扑。布线代价、时序收敛难度和验证工作量,都是选型账本上必须同等计入的成本。

