For XRT-managed kernels, running the kernel is a simple matter of creating a run object as shown in the following code. XRT manages the start and stop of the kernel. You simply need to wait for the results.
//std::cout << "Execution of the kernel\n";
//auto run = krnl(DATA_SIZE, boA, boB); //DATA_SIZE=size
//run.wait();
However, in user-managed kernels, XRT does not know how the kernel is started or stopped. That is in your hands. User-managed kernels offer a significant degree of flexibility and permit creative solutions to design problems because they are not constrained to the ap_ctrl_hs
or ap_ctrl_chain
control protocols. There is a lot of capability, but it is up to you to manage it.
You must first set up the kernel, by writing to the registers to pass associated buffer addresses for the various kernel arguments. Then you must trigger the kernel execution by setting a register value or enabling a signal bit, following the control protocol designed by the user and implemented by the kernel.
std::cout << "INFO: Setting IP Data" << std::endl;
std::cout << "Setting Register \"A\" (Input Address)" << std::endl;
ip1.write_register(A_OFFSET, buf_addr[0]);
ip1.write_register(A_OFFSET + 4, buf_addr[0] >> 32);
std::cout << "Setting Register \"B\" (Input Address)" << std::endl;
ip1.write_register(B_OFFSET, buf_addr[1]);
ip1.write_register(B_OFFSET + 4, buf_addr[1] >> 32);
uint32_t axi_ctrl = IP_START;
std::cout << "INFO: IP Start" << std::endl;
//axi_ctrl = IP_START;
ip1.write_register(USER_OFFSET, axi_ctrl);
// Wait until the IP is DONE
int i = 0;
//axi_ctrl = 0;
while (axi_ctrl != IP_IDLE) {
//while ((axi_ctrl & IP_IDLE) != IP_IDLE) {
axi_ctrl = ip1.read_register(USER_OFFSET);
i = i + 1;
std::cout << "Read Loop iteration: " << i << " and Axi Control = " << axi_ctrl << "\n";
if (i > 100000) {
axi_ctrl = IP_IDLE;
ip1.write_register(USER_OFFSET, axi_ctrl);
}
}