赛灵思
直播中

刘静焱

7年用户 213经验值
私信 关注
[问答]

如何减少ZCU102中的随机性出错率?

我在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事务。
任何这些部分遵循的路线的帮助将不胜感激!
谢谢。

回帖(1)

张喆

2019-10-18 10:13:20
@hbucher Xil_DCacheFlushRange也给了我非法指令。
您是否知道有关如何在交叉编译时正确构建和链接libxil的任何指南?
也许从embeddedsw存储库构建f***l不是正确的做法?
我仍然不能100%确定我看到的随机性是否与缓存无关,这只是我最好的猜测。
当它混乱时,它似乎搞乱了多次爆发的整个AXI请求(大小从2到10个爆发)。
我在ZC706上运行完全相同的IP块并且没有看到这些问题,因此我也在寻找有关如何迁移SW和Xilinx IP的问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分