使用 RTL 编程逻辑的设计流程 - 2022.1 简体中文

Versal ACAP AI 引擎编程环境 用户指南 (UG1076)

Document ID
UG1076
Release Date
2022-05-25
Version
2022.1 简体中文

在 ADF graph 内不支持 RTL 块。RTL 块与 ADF graph 之间的通信要求您使用 PLIO 对接。在以下示例中,interpolatorclassify 均为 AI 引擎内核。interpolator AI 引擎内核将数据串流至 PL RTL 块,此块则将数据串流回 AI 引擎 classify 内核。

class clipped : public graph {  
  private:
    kernel interpolator;
    kernel classify;
   
  public: 
    input_plio in;
    output_plio out;
    output_plio clip_in;
    input_plio clip_out; 

    clipped() {
      in  = input_plio::create("DataIn1", plio_32_bits,"data/input.txt");
      out = output_plio::create("DataOut1", plio_32_bits,"data/output.txt");
      clip_out = input_plio::create("polar_clip_in",plio_32_bits,"data/input1.txt");
      clip_in  = output_plio::create("polar_clip_out", plio_32_bits,"data/output1.txt"); 

      interpolator = kernel::create(fir_27t_sym_hb_2i);
      classify     = kernel::create(classifier);

      connect< window<INTERPOLATOR27_INPUT_BLOCK_SIZE, INTERPOLATOR27_INPUT_MARGIN> >(in.out[0], interpolator.in[0]);
      connect< window<POLAR_CLIP_INPUT_BLOCK_SIZE>, stream >(interpolator.out[0], clip_in.in[0]);
      connect< stream >(clip_out.out[0], classify.in[0]);
      connect< window<CLASSIFIER_OUTPUT_BLOCK_SIZE> >(classify.out[0], out.in[0]);

      std::vector<std::string> myheaders;
      myheaders.push_back("include.h");

      adf::headers(interpolator) = myheaders;
      adf::headers(classify) = myheaders;

      source(interpolator) = "kernels/interpolators/hb27_2i.cc";
      source(classify)    = "kernels/classifiers/classify.cc";

      runtime<ratio>(interpolator) = 0.8;
      runtime<ratio>(classify) = 0.8;
    };
};

clip_inclip_out 属于往来 polar_clip PL RTL 内核的端口,此内核连接至 graph 中的 AI 引擎内核。例如,clip_in 端口是 interpolator AI 引擎内核的输出,此内核连接至 polar_clip RTL 内核的输入。clip_out 端口是 classify AI 引擎内核的输入和 polar_clip RTL 内核的输出。

RTL 块和 AI 引擎

应用代码如以下示例所示。

#include "graph.h"

clipped clipgraph;

#ifdef __AIESIM__
int main(int argc, char ** argv) {
    clipgraph.init();
    clipgraph.run();
    clipgraph.end();
    return 0;
}
#endif

为了正常运行 AI 引擎仿真器,您必须创建与 RTL 内核相关的输入测试激励文件。data/output_interp.txt 是输入 RTL 内核的测试激励文件。AI 引擎仿真器会从 interpolator AI 引擎内核生成输出文件。data/input_classify.txt 文件包含来自 polar_clip 内核的数据,此内核是 AI 引擎 classify 内核的输入。请注意,PLIO 可能包含可选属性 PL 时钟频率,对于 polar_clip,该属性为 100。

硬件仿真流程和硬件流程中的 RTL 块

在硬件仿真流程和硬件流程中完全支持 RTL 内核。您需要添加 RTL 内核作为 nk 选项,并将接口与 sc 选项相链接,如以下代码所示。如果需要,请使用 freqHz 调整任意时钟频率。以下是 Vitis 配置文件的示例。

[connectivity]
nk=mm2s:1:mm2s
nk=s2mm:1:s2mm
nk=polar_clip:1:polar_clip
sc=mm2s.s:ai_engine_0.DataIn1
sc=ai_engine_0.clip_in:polar_clip.in_sample
sc=polar_clip.out_sample:ai_engine_0.clip_out
sc=ai_engine_0.DataOut1:s2mm.s
[clock]
freqHz=100000000:polar_clip.ap_clk

如需了解有关 RTL 内核和 Vitis 流程的更多信息,请参阅 使用 Vitis 工具流程来集成应用。SystemC 内核同样可按仅限仿真形式来使用。如需了解此流程,请参阅 Vitis 统一软件平台文档:应用加速开发(UG1393) 中的处理 SystemC 模型