我在ZCU102上安装了linux并且有一个c ++应用程序,我在其中malloc和memcpy一些数据,将物理地址传递给
FPGA来处理并将一些结果写入DRAM,然后c ++出现并读取结果。
我正在使用HPC端口,我设置AxCACHE = 0xF(我尝试了0x3和0x0also)。
我所看到的是,当我使用小输入数据结构运行我的应用程序时,它主要给我正确的结果。
当我增加这些数据结构的大小时,错误的概率会更高,直到它们变得足够大并且我保证错误。
当我使用HP端口并使用操作系统可见的内存块时,我在使用L2之前遇到了麻烦,但这些错误在每4kB时是非常可预测的。
我已经在这个区域上面添加了一个bootarg mem = 512M和malloc并使用HPC端口,这些问题消失了,但我现在每次运行应用程序时都会看到随机性。
我试图孤立这个问题,但到目前为止,我能够看到的是,当我在数据结构中使用32位元素而不是16位元素时,它似乎消失了。
我已经尝试通过迭代随机的1MB阵列并在fpga运行之前和之后设置A
= A [i-1] * 10来确保L2不会妨碍。
对于我是否进行这种手动冲洗,结果似乎无关紧要。
如果我不冲洗,我认为它可能会更频繁地给我正确答案,但我不确定。
我尝试使用Xil_DCacheFlush / Invalidate / Disable但是他们要么是segfault,要么是gdb说它们是无效指令。
有没有办法通过Linux使用这些功能?
我正在交叉编译我的应用程序,我按照https://github.com/Xilinx/embeddedsw上的说明使用默认参数(64位,zcu102,a53)为ZynqMP创建库。
然后我抓住那里的静态库并链接。
我也尝试使用taskset -c 0运行,看看是否有任何核心的模式。
核心#3似乎最常给我错误的答案,但我认为所有这些都有可能弄乱。
我也尝试使用ACP端口作为HPC端口的插件,但是当我发出读取请求时,它似乎总是返回全0。
我知道ACP端口不能与DMA IP一起使用。
我的verilog包含自己的驱动程序来讨论AXI协议并请求dram事务。
任何这些部分遵循的路线的帮助将不胜感激!
谢谢。