The main goal of software emulation (sw_emu
) is to
ensure functional correctness of the host program and kernels. Software emulation
provides a purely functional execution, without any modeling of timing delays, or
latency; it does not give any indication of the accelerator performance.
The kernel code is always compiled and running natively. The application code is either:
- Compiled and running natively on an x86 processor (Data Center platforms)
- Cross-compiler to the Arm® processor and running in an emulator (Embedded platforms)
Thus, software emulation is typically used for algorithm refinement, debugging functional issues, and letting developers iterate quickly through the code to make improvements. The software programming model of fast compilation and run iterations is preserved.
The v++
compiler does the minimum
transformation of the kernel code to create the FPGA binary to run the host program and
kernel code together. Software emulation takes the C-based kernel code and compiles it
with GCC. It runs each kernel as a separate C-thread. If there are multiple compute
units of a single kernel, each CU is run as a separate thread. Therefore, it mimics the
parallel execution model of the hardware. However, within each kernel the execution is
modeled sequentially although there might be parallelism within a kernel when running on
hardware. The software emulation driver implements the XRT API and acts as a bridge
between the user application running XRT and the device process modeling the hardware
components.
The following describes the software emulation limitations:
- There is a global memory limit of 16 GB which should not be exceeded for simulation purposes.
- Software emulation is not supported for AI Engine kernels.
- Software emulation does not support AXI4-Stream Interfaces without Side-Channels (see Vitis High-Level Synthesis User Guide (UG1399).
v++
command with the -t
option:
v++ -t sw_emu ...
You can use the GDB debugger for both the host application and the
kernel code, set break points or use printf()
to print
information and checkpoints. For details on how to debug the host application or the
kernel during software emulation, refer to Debugging in Software Emulation.