作者:Nathan Xu,AMD工程师;来源:AMD开发者社区
AIE graph通过PLIO与PL(programable logic)连接, 以交换数据, PLIO既可以通过DMA S2MM或者MM2S连接到AI Engine的buffer, 也可以直接连接到AI Engine stream接口。
下面是PLIO一个例子, 其中”input.txt”也可以用”input.csv”代替, 因为AI Engine simulator支持CSV和TXT文件用来做PLIO仿真。
adf::input_plio in = adf::input_plio::create("DataIn1", adf::plio_32_bits,"input.txt");
adf::output_plio out = adf::output_plio::create("DataOut1", adf::plio_32_bits,"output.txt");
其中, “DataIn”是PLIO的名字, “adf::plio_32_bits”是PLIO的位宽, "input.txt"是该PLIO仿真激励. PLIO的位宽可以设置为”adf::plio_32_bits”, “adf::plio_64_bits” 或者“adf::plio_128_bits“。
缺省情况下, PLIO 位宽是32 bits, 对于TXT文件来说, 这个位宽也决定了TXT文件每行数据的个数. 举例来说, 对于adf::plio_32_bits, 这意味着TXT文件里每行的数据加起来全部位宽是32 bits, 如果数据类型是int8, 那么TXT文件每行就有4个数据, 同理, 如果是int16, 每行有两个数据. 如果是adf::plio_64_bits, TXT文件每行数据的总位宽是64 bits, 对于数据类型是int8, 那就是每行8个数据. 依此类推。
下图是TXT文件对于不同PLIO位宽和数据类型的每行数据个数:
至于每行数据是以什么顺序送给AIE, 以int16, adf::plio_64_bits为例, 假设TXT文件一行数据为0 1 2 3, 那么数据0x0003000200010000送给AIE.
AIE PLIO仿真也支持CSV文件格式. CSV文件第一行是CMD, D, TLAST, TKEEP等, 需要注意的是, CSV所有的字符和数据都是由“,”隔开的, 即使这个值为空. “D”列的个数取决与PLIO位宽/数据类型, 比如下面的例子, 假设adf::plio_32_bits, 数据类型是int16, “D”就是2列。
CMD, D, D, TLAST, TKEEP
DATA, 16, 20, 0, -1
DATA, 15, 11, 0, -1
CSV文件能够指定TKEEP, TXT文件不能设置TKEEP为0. CSV还支持STALL命令, STALL可以插入一些empty周期. 例子见下:
CMD, D, D, TLAST, TKEEP
DATA, 16, 20, 0, -1
DATA, 15, 11, 0, -1
STALL:100
用户可以在AIE compiler设置“--pl-freq=300”, 以为所有的PLIO设置频率, 也可以在AIE graph为某个特定的PLIO设置频率. 如下所示:
adf::PLIO *<input>= new adf::PLIO(<logical_name>, <plio_width>, <file>, <FreqMHz>);
下图是Vitis Analyzer看到的PLIO以及PLIO的属性, 比如PLIO频率, 位宽, 在某个PL interface tile(column)等等. Buffers说明该PLIO连接到AIE的buffer, 而不是连接到AIE的stream接口。
Channel ID是该PLIO在某个PL interface tile占用了哪个channel, 总共有8个channel, 其中channel 3, 7 是低速接口, 其他了6个channel(0,1,2,4,5,6)是高速接口. 对于timing关键的设计, 需要用 (0,1,2,4,5,6)这6个channel. 可以用AIE compiler的选项”–pl-register-threshold=125”控制是否使用这6个channel, 简单讲, 如果pl-freq < pl-register-threshold, 所有8个channel都会用到, 但如果是pl-freq > pl-register-threshold, 工具只会使用6个高速channel.