修RGMII时序

昨天我发现我将我的网络测试仪代码移植到一个新的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芯片也太灵车了。

参考资料:

  1. https://ethernetfmc.com/docs/user-guide/rgmii-timing/
  2. https://lore.kernel.org/lkml/20190508.093729.1392898151729084665.davem@davemloft.net/T/
  3. https://lore.kernel.org/all/20200925144042.GI3821492@lunn.ch/t/

发表评论

注意 - 你可以用以下 HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

:wink: :twisted: :roll: :oops: :mrgreen: :lol: :idea: :evil: :cry: :arrow: :?: :-| :-x :-o :-P :-D :-? :) :( :!: 8-O 8)

本文链接:https://twd2.me/archives/17269QrCode