多个stream数据流可以共享一个物理通道,这个物理通道可以是PL到AIE也可以是AIE到PL。这样的好处是节省了PL接口,尤其适用于低带宽的场合。
本质上,packet switching使用了一对解复用器(de-multiplexer)和复用器(multiplexer)。前者将打包的数据流根据packet ID分配给不同的kernel,后者将来自于不同kernel上的数据流合并汇聚为一个数据流。为此,在ADF graph library中引入了pktsplit<n>和pktmerge<n>。pktsplit<n>是一个1:n的解复用器,pktmerge<n>是一个n:1的复用器。n最大值为32。
我们通过一个具体案例来体会一下packet switching的使用方法。这个例子包含4个AIE kernel,每个kernel的输入/输出均采用Window-based方式。4个Kernel的输入数据分别来自于pktsplit解复用器的4个输出,而4个Kernel的输出数据则通过pktmerge复用器合并为一路输出数据。需要注意的是将packet stream与window连接时connect里填的参数分别为pktstream和window,如下图中红色方框所示。
从编译结果来看,packet switching方式从PL到AIE只使用了一个物理通道,同样地,从AIE到PL也只使用了一个物理通道。
在编译结果Emulation-AIE/Work/temp目录下,packet_ids_c.h内显示了Kernel输入/输出端口与Packet ID之间的对应关系。该.h文件可用于后续使用HLS对PL编程。该目录下还会生成一个packet_ids_v.h,用于后续使用Verilog对PL编程。
这里就要说明一下packet数据流的格式。Packet数据流由packet header和数据流构成。每个Packet ID对应的数据流长度必须一致。Packet header的格式如下图所示。图中表明低5位为packet ID,这也佐证了为什么最多包含32个数据流。
基于此,在提供输入激励时就要采用如下图所示方式。图中红色方框为packet header,蓝色方框表明对应packet ID下的数据将为最后一个数据。不难看出,这里每个packet ID下的数据流长度为8。
我们把这4个packet header解析下来如下图所示。重点关注其中的packet ID。可以看到packet ID分别为0/1/2/3。
再看AIE的仿真结果,如下图所示。同样地,红色方框为packet header。蓝色方框表明此时为相应packet ID下的最后一个数据。对packet header进行解析,即可获知数据packet ID,再通过packet_ids_c.h中的文件内容,就可以知道该ID的数据是由哪个AIE Kernel输出。
Copyright @ FPGA技术驿站
转载事宜请私信 | 获得授权后方可转载