通过将
pktmerge
连接到 pktsplit
,多个串流即可共享布线。通过连接到 pktsplit
的 pktmerge
来传输缓冲器时,每个 pktmerge.in[i]
都会布线到对应的 pktsplit.out[i]
。pktmerge
输入程度必须与 pktsplit
输出程度相等。graph 代码示例如下所示:for (int i=0; i<WAYS; i++) {
connect<>(plioIn[i].out[0], kOut[i].in[0]);
connect<>(kOut[i].out[0], merge.in[i]);
connect<>(split.out[i], kIn[i].in[0]);
connect<>(kIn[i].out[0], plioOut[i].in[0]);
}
connect<> (merge.out[0], split.in[0]);
graph 视图如下图所示。图 1. Pktmerge 到 Pktsplit 的 graph 视图
包拆分与合并大小
当前支持最高 32 条串流的包切换。支持最大 32 到 1 pktmerge
和 1 到 32 pktsplit
。如果使用的包切换的 fanout
/fanin
(16/32 条串流)较大,则可能耗用大量资源,在设计中使用这些操作时应谨慎处理。
建议: AMD 建议您避免对包进行不必要的拆分而后立即合并操作。这会增加布线器解决方案的复杂性。
包拆分与合并广播
当串流经过
pktmerge
到达 pktsplit
时,支持从 pktsplit
进行广播。在此情况下,pktmerge.in[i]
会广播至对应的多个目标,这些目标连接到 pktsplit.out[i]
。代码示例如下所示,其中 merge.in[WAYS-1]
广播至 split.out[WAYS-1]
和 split.out[WAYS]
:for (int i=0; i<WAYS; i++) {
connect<>(plioIn[i].out[0], kOut[i].in[0]);
connect<>(kOut[i].out[0], merge.in[i]);
connect<>(split.out[i], kIn[i].in[0]);
connect<>(kIn[i].out[0], plioOut[i].in[0]);
}
connect<>(split.out[WAYS-1], kIn[WAYS].in[0]);
connect<>(kIn[WAYS].out[0],plioOut[WAYS].in[0]);
connect<> (merge.out[0], split.in[0]);
graph 视图如下图所示。
图 2. Pktmerge 到 Pktsplit 的 graph 视图(含广播)