昨天我发现我将我的网络测试仪代码移植到一个新的FPGA开发板上之后, 其处理请求时总会丢包。经过测试, 我发现是FPGA通过PHY芯片给上位机发送以太网帧的方向丢包严重, 而接收以太网帧的方向没有丢包问题。经过进一步调研, 我发现是FPGA和板子上的PHY芯片的RGMII的时序没有匹配上[1]。
总结来说, 就是对于RX Clock或TX Clock, FPGA和PHY芯片分别需要有且只有一边开启了2ns延迟。而事实上, 这个开发板上的PHY芯片默认同时开启了RX Clock和TX Clock的2ns延迟, 并且FPGA上Xilinx的IP核对TX Clock默认开启了2ns延迟。于是, TX Clock相当于开启了4ns延迟, 这使得时钟跳变和数据变化几乎同时发生(正常情况下, 时钟跳变在稳定数据的中间), 导致PHY采样出错, 从而导致FPGA发送以太网帧出错。
解决方法有两种。第一, 可以关闭FPGA上的2ns延迟, 这可以通过增加一些特殊的约束来实现。经测试, 有效。第二, 可以关闭PHY芯片上的2ns延迟。考虑到PHY芯片上电后的初始配置是由几个上拉或下拉电阻决定的, 修改它, 就需要修改电路板, 不太方便。PHY芯片的型号是RTL8211E, 经过检索, 我还在Linux邮件列表里发现可以通过mdio配置某个undocumented的隐藏寄存器的某几个特殊位来动态地修改[2, 3]。不过我怎么尝试都没有成功。这个PHY芯片也太灵车了。
参考资料:
发表评论