The type of operating system determines the software debug steps. If the application is based on bare-metal OS, it is easier to read specific peripheral address from the application. For example, if the application enables a specific kernel and kernel data flow is not occurring, it is possible to read the control register, length register of the kernel from application, and check if the programmed values are correct.
For bare-metal application, it is possible to dump the input/output buffer of the kernel based on the physical address that helps in debugging from the software point-of-view. If the input buffer itself does not match with the expected input, further prioritizing can be done by performing write/readback to the same DDR buffer from the application. If the readback data does not match, the further debug can be focused on the DRAM interface.
For Linux-based application, dumping the buffer content to a file requires the allocated buffer to be memory mapped and a physical address can be returned. Then, the application can compare the content of the input and output buffer with the reference input. The application can access the memory mapped kernel register space using the device memory map (/dev/mem) to check if the kernel control, size, and address values are getting programmed correctly. If the values are incorrect, further debug can happen on the application to device driver interface.