RTL blocks are not supported inside the ADF graph. Communication between the
RTL blocks and the ADF graph requires that you use PLIO interfacing. In the following
example, interpolator
and classify
are AI Engine kernels. The interpolator
AI Engine kernel streams data to a PL RTL block, which,
in turn, streams data back to the AI Engine
classify
kernel.
class clipped : public graph {
private:
kernel interpolator;
kernel classify;
public:
port<input> in;
port<output> clip_in;
port<output> out;
port<input> clip_out;
clipped() {
interpolator = kernel::create(fir_27t_sym_hb_2i);
classify = kernel::create(classifier);
connect< window<INTERPOLATOR27_INPUT_BLOCK_SIZE, INTERPOLATOR27_INPUT_MARGIN> >(in, interpolator.in[0]);
connect< window<POLAR_CLIP_INPUT_BLOCK_SIZE>, stream >(interpolator.out[0], clip_in);
connect< stream >(clip_out, classify.in[0]);
connect< window<CLASSIFIER_OUTPUT_BLOCK_SIZE> >(classify.out[0], out);
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_in
and clip_out
are
ports to and from the polar_clip
PL RTL kernel which is
connected to the AI Engine kernels in the graph. For
example, the clip_in
port is the output of the interpolator
AI Engine kernel that is connected to the input of the
polar_clip
RTL kernel. The clip_out
port is the input of the classify
AI Engine kernel and the output of the polar_clip
RTL kernel.
RTL Blocks and AI Engine Simulator
The top-level application file that contains an instance of your graph class and connects the graph to a simulation platform, also needs to include the PLIO inputs and outputs of the RTL blocks. These files are called output_interp.txt and input_classify.txt in the following example.
#include "graph.h"
PLIO *in0 = new PLIO("DataIn1", adf::plio_32_bits,"data/input.txt");
PLIO *ai_to_pl = new PLIO("clip_in",adf::plio_32_bits, "data/output_interp.txt",100);
PLIO *pl_to_ai = new PLIO("clip_out", adf::plio_32_bits,"data/input_classify.txt",100);
PLIO *out0 = new PLIO("DataOut1",adf::plio_32_bits, "data/output.txt");
simulation::platform<2,2> platform(in0, pl_to_ai, out0, ai_to_pl);
clipped clipgraph;
connect<> net0(platform.src[0], clipgraph.in);
connect<> net1(clipgraph.clip_in,platform.sink[1]);
connect<> net2(platform.src[1],clipgraph.clip_out);
connect<> net3(clipgraph.out, platform.sink[0]);
#ifdef __AIESIM__
int main(int argc, char ** argv) {
clipgraph.init();
clipgraph.run();
clipgraph.end();
return 0;
}
#endif
To make the AI Engine simulator work,
you must create input test bench files related to the RTL kernel. data/output_interp.txt is the test bench input to the RTL kernel. The AI Engine simulator generates the output file from the interpolator
AI Engine kernel. The data/input_classify.txt file contains data from the polar_clip
kernel which is input to the AI Engine
classify
kernel. Note that PLIO can have an optional
attribute, PL clock frequency, which is 100 for the polar_clip
.
RTL Blocks in Hardware Emulation and Hardware Flows
RTL kernels are fully supported in hardware emulation and hardware flows.
You need to add the RTL kernel as an nk
option and link the
interfaces with the sc
option, as shown in the following
code. If necessary, adjust any clock frequency using freqHz
. The following is an example of a Vitis configuration
file.
[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
For more information on RTL kernels and the Vitis flow see Integrating the Application Using the Vitis Tools Flow.