AIE Kernel有时需要由外部提供参数更新kernel行为,此时就要用到RTP(Run-Time Parameter)。
AIE支持两种类型的RTP,一种是异步(Asynchronous),通常由PS或其他AIE Kernel控制。“异步”意味着RTP可以随时被更改。在每次Kernel被调用时,RTP都会被读取,而不会进行任何同步处理。这种机制适合于参数不经常更新的场合,例如滤波器系数。另一种为同步RTP(Synchronous)。“同步”意味着只有当处理器将RTP传递给AIE Kernel后,该Kernel才能被触发执行。无论是哪种类型,RTL都可以是标量(Scalar)或数组(Array)。
我们先看一个同步RTP。系统框图如下图所示。图中sine为AIE Kernel,其中trigger为RTP,此处为标量。s2mm为HLS Kernel,最终通过HLS在PL侧实现。
在描述AIE Kernel sine时,phase_increment为输入参数,这里的名字是形参名,本质上就是RTP,只是RTP在graph.h中会另起名字。
在描述graph时,将RTP定义为input_port,并起名字为trigger,如下图第26行所示。同时确定RTP与AIE Kernel的连接关系,如下图第33行所示。
在graph.cpp中,使用update更新RTP。如下图所示,可以看到update的次数与run的次数是一致的。代码第28行至第31行,依次将trigger值写入ping/pong/ping/pong buffer。
对于异步RTP,需要在graph.h中指定其与AIE Kernel之间的关系为异步关系,如下图代码第33行所示,使用了async。
在graph.cpp中要使用wait()。这是和同步RTP的最大区别。在同步模式下,graph的run是受RTP的update控制的。在异步模式下,需要通过wait等待graph的run完成。异步模式下,当graph在执行时是无法保证RTP生效的。
Copyright @ TeacherGaoFPGAHub
转载事宜请私信 | 获得授权后方可转载