ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

SGMII接口FPGA实战:从IP配置到链路调试全解析

SGMII接口FPGA实战:从IP配置到链路调试全解析 FPGA开发者做网络通信不管你是刚入门还是搞了三五年SGMII接口早晚都会碰上。它比RGMII复杂一点又没有GMII那么占引脚是当前中高端FPGA和PHY芯片之间最主流的一种连接方式。这篇文章是我在实际项目里分别在Xilinx和Intel两套平台上调通SGMII之后整理的实战笔记包含IP怎么配、时序怎么约束、自协商有哪些坑、数据不通时怎么排查希望能给正在折腾这个接口的朋友省点时间。1. 为什么现在的FPGA以太网方案绕不开SGMII先说个很多人刚接触时容易困惑的问题现在PHY芯片那么多接口GMII、RGMII、SGMII、1000BASE-X为什么我在项目里首选SGMII核心原因是引脚和速率。GMII需要14根数据线加时钟控制线带宽受限而且PCB走线密集。RGMII虽然把数据线压到了8根但DDR时序敏感高速下对PCB的等长要求极其苛刻。SGMII把数据通过一对差分线串行传输1.25Gbps的线速率PCB布线友好得多而且Xilinx和Intel的FPGA都有现成的SerDes硬核可以直接用逻辑资源开销很小。从协议层面看SGMII本质上定义的是MAC到PHY之间的接口协议。它最大的特点是保留了自协商能力PHY可以把自己的速度10M/100M/1000M通过链路自协商结果回传给MAC所以用户侧看到的接口始终是千兆GMII的并行数据速率适配全部在物理层完成。这也解释了为什么SGMII在如今的光口和电口方案里都是“过渡层”的常客。你前面接的是千兆PHY后面不管是光纤还是网线SGMII都是进入SerDes之前最标准的一道关卡。2. 先搞懂SGMII链路的底层机制再动手配置很多人一上来就打开Vivado或者Quartus直接拖IP配置完发现链路起不来然后一头雾水。我建议先花十分钟理解SGMII的工作机制后面调起错来会快很多。2.1 1.25Gbps的线速率是怎么算出来的SGMII工作在1.25Gbps但实际有效带宽是1Gbps。多出来的0.25Gbps不会凭空消失这是8B/10B编码带来的20%开销。8B/10B编码把每8比特数据扩展成10比特码流保证直流平衡和足够的跳变沿方便接收端恢复时钟代价就是带宽损耗。算一下1Gbps有效数据除以0.8等于1.25Gbps。这就是为什么SGMII的SerDes收发器都跑在1.25Gbps。这个“20%开销”的概念会直接影响你对线路速率的判断。比如有的PHY支持SGMII可以跑2.5Gbps给2.5G以太网用那本质上就是把有效数据提上去之后配合更高带宽的物理编码方案。FPGA上如果选错线路速率链路是绝对跑不起来的。2.2 自协商的定时器到底为何物SGMII把PHY的自协商结果通过链路码流传给MAC而PHY本身又通过MDIO/MDC接口把速度和双工模式回读给上层。这个过程不是瞬间完成的至少需要几百毫秒具体时间由内部定时器决定。我做过一个回环测试上来直接把SGMII IP配置成“强制千兆、全双工”链接能起来但如果你接的是一个默认配置的商用PHY链路状态不定经常出现丢包后来发现是自协商流程和MAC侧初始化顺序没对齐。这个“顺序问题”我在后面排查章节会细说。2.3 为什么说SGMII和1000BASE-X是“表兄弟”SGMII和1000BASE-X在物理层几乎一样都是1.25Gbps的SerDes链路配合8B/10B编码差别主要在协议层面。1000BASE-X用于PHY对PHY的全双工链路比如光模块接光模块而SGMII用于MAC到PHY的互联还额外定义了自协商和速度状态信息。所以你在选IP的时候千万别搞混。Xilinx的GTP/GTX Quad里可以配置成SGMII模式也可以配置成1000BASE-X模式用错了链路根本锁不住。Intel那边更明显PHY IP里勾选“SGMII”还是“1000BASE-X”完全两个选项。3. Xilinx平台的SGMII配置实战Xilinx环境里做SGMII主流这么做用1G/2.5G Ethernet PCS/PMA or SGMII IP把Serdes硬核包好再配合一个Tri-Mode Ethernet MACTEMACIP或者直接用户侧自己写MAC逻辑。下面我按完整的工程流程来拆解。3.1 工程搭建与IP配置开一个新的Vivado工程器件按自己板卡选比如常见的7系列如Artix-7、Kintex-7系列。新建Block Design在IP Catalog里搜索“Ethernet”找到“1G/2.5G Ethernet PCS/PMA or SGMII”双击添加。这个IP的配置界面主要重点看以下几个Physical Interface选择SGMII而不是1000BASE-X。Line Rate1.25GbpsSGMII场景一般锁定1.25Gbps。Reference Clock外部输入还是内部生成。大多数板卡PHY芯片会提供125MHz时钟但有些设计倾向于自己晶振。我遇到过一次时钟源没给对导致GT参考时钟根本没起振链路当然是死的。Transceiver使用GTX/GTH等物理层硬核具体哪个取决于器件。配置完成后IP会自动生成一个包含GT的位置约束实例。你还需要给GT的参考时钟管脚分配物理位置否则布局布线过不去。3.2 Shared Logic的两种模式要选对这个点很多新手容易踩坑。IP的“Shared Logic”选项有关系Include Shared Logic in coreIP内部包含了GT的时钟逻辑和复位逻辑外部只需要给一个时钟源和一个复位信号简单粗暴。Include Shared Logic in example design把GT的共享逻辑拿了出来方便你做跨多个IP的时钟共享但你需要自己把example design里的模块例化好。我的建议单路SGMII就选第一种省事。多路SGMII比如四个QSGMII或四路独立的SGMII选第二种可以共享一个GT参考时钟和复位控制资源利用率更高。记得给这个IP的复位信号做同步处理。GT复位不能随便给一个异步的按键信号否则非常容易出现复位释放时的亚稳态问题。这也是前面提到热搜里“fpga复位信号亚稳态”、“always对reg打几拍管用”的经典场景。项目里我至少会做两级同步对reset信号打两拍再用这个干净的复位去拉低IP的reset输入。3.3 时序约束少了create_clock仿真再对也白搭Xilinx平台下SGMII IP只存在一个对外时钟接口即用户侧gmii_rx_clk和gmii_tx_clk在IP内部会把线速时钟转换到125MHz用户界面是125MHz的GMII接口时钟。但GT的参考时钟呢如果你在IP界面里选的是“external reference clock”这个时钟是硬件输入的具体数值要在XDC里约束清楚比如create_clock -name GT_REFCLK -period 8.000 [get_ports gt_refclk_p]不要认为IP生成的example XDC里已经包含了全部约束。很多时候GT的位置约束和时钟约束要根据你的板卡手动调整尤其是直接用IP时Vivado默认生成的约束位置不一定在真实PIN上需要改成datasheet对应的bank和pin。此时利用硬件管理器里的open_hw_manager可以快速验证时钟是否到达GT的参考时钟引脚。3.4 用户侧数据通路设计SGMII IP出来之后对外是一组GMII接口信号gmii_txd[7:0]、gmii_tx_en、gmii_tx_er、gmii_rxd[7:0]、gmii_rx_dv、gmii_rx_er。如果我没接TEMAC而是自己写MAC逻辑那么这一组GMII就是我以太网MAC层和物理层之间的桥梁。自己写GMII侧逻辑关键要点TX侧每个时钟周期125MHz在gmii_tx_en拉高的同时发送8bit数据帧开始前需要至少8字节的前导码0x55然后是帧定界符0xD5。RX侧看到rx_dv拉高就准备接收rx_er拉高说明链路层错误要去查物理层编码错误。记得给gmii_txd等信号加约束吗不需要对GMII信号做什么特殊约束它们在IP内部已经同步到相应时钟域了。真正重要的是GT的时钟、差分引脚以及复位释放。4. Intel平台SGMII配置实战IntelAltera平台和Xilinx的风格差异很大配置路径完全不同。做Intel项目时我用过Cyclone V和Arria V下面以Cyclone V为例。4.1 Quartus工程与IP生成在Quartus的IP Catalog里搜索“Ethernet”会出现“Ethernet MAC”和“Ethernet PHY IP Core”等不同选择。Intel通常把MAC和PHY分开需要分别生成。关键流程大致如下生成Ethernet PHY IP Core比如Ethernet PHY Intel FPGA IP在里面选择SGMII模式配好线路速率。生成Ethernet MAC IP Core把接口类型选为SGMII相关的PCS接口而不是GMII直接对接。有些IP版本还要求额外勾选“Enable SGMII”和“Enable auto-negotiation”不勾选在仿真时就只有TX数据没有RX回环。Intel平台有个特点SGMII的PMA物理介质附加层内部集成了自适应均衡和时钟数据恢复CDR这些是自动配置的不像你在Xilinx里需要关心GTP eye scan之类的细节。4.2 时钟树设计与reset_n处理Intel的SGMII方案里IP会把外部的125MHz参考时钟转换成各个内部时钟。用户侧需要关注的是rx_clkout收数据时的恢复时钟。tx_clkout发送数据时钟通常也是125MHz。很多人在Intel平台卡住是因为把这两个时钟当成普通逻辑时钟用导致跨时钟域处理不对。rx_clkout是CDR恢复出来的跟tx_clkout完全异步你的FIFO或RAM缓冲必须做异步处理否则数据偶尔丢一个包或者偶尔错拍很正常。复位方面Intel IP的复位要求通常写着“至少保持10个时钟周期低电平”。我实际操作中给它做了个上电复位计数器延长到至少1ms避免电源轨建立过程中复位先释放了。4.3 Intel平台SGMII回环测试与配置检查Quartus里生成完IP之后建议先做一次内部回环测试。Intel的PHY IP内部通常有“Serial Loopback”和“Parallel Loopback”选项用逻辑分析仪抓内部信号比外部抓信号方便很多。在Platform DesignerQsys里把这套MACPCSPMA连接起来的时候如果出现“无法连接”的红色提示大概率是接口速率或者时钟优先级不匹配。这在Xilinx里比较少见到Intel的IP互联对接口信号名称和时钟关系比较严格。Intel平台下实际测试SGMII时要注意管脚约束中每个bank的I/O标准必须选LVDS而不是普通的LVCMOS。就算你在原理图上看到的是一个1.8V或2.5V电平的差分对在QSF文件里仍然要正确设置set_instance_assignment -name IO_STANDARD LVDS -to sgmii_rxp set_instance_assignment -name IO_STANDARD LVDS -to sgmii_rxn5. 链路调试与常见问题排查实战记录这部分我认为比前面配置部分更有价值。以下问题是自己在两套平台上都真实碰到过的整理成速查手册完全可以直接对照着用。5.1 链路起不来先看时钟再看复位最后查自协商SGMII链路起不来的现象非常典型以太网状态机显示“Link Down”或者PHY上报无链路。排查顺序我总结成一个口诀时钟先行复位随后自协商殿后。具体操作用示波器或Vivado/Quartus里的内部逻辑分析仪抓取SerDes的参考时钟频率确认是125MHz。偏差超过正负100ppm链路基本是锁不起来的。查看GT TX复位和RX复位是否已经释放。Xilinx平台通过gt_txresetdone和gt_rxresetdone信号判断。Intel平台看rx_pcs_ready等信号。关闭自协商强制成1000M全双工模式看SGMII链路能否建立。这种方法可以快速把问题定位在物理层还是自协商状态机。我遇到过一次Xilinx的SGMII IP配置成自协商模式后TX侧能发数据但RX侧始终rx_dv不拉高后来关了自协商就正常了再查发现是PHY芯片的自协商配置和MAC侧期望不一致。5.2 数据有时通有时不通大概率是复位顺序问题SGMII链路建立之后数据偶尔通偶尔不通而且仿真时一切正常这种问题十有八九出在复位释放顺序上。SGMII IP的复位一般不要求严苛的先后顺序但GT的复位很讲究建议先释放GT TX复位再释放GT RX复位最后释放IP用户侧复位。如果你用一个总的复位信号同时拉低所有复位可能出现GT刚开始工作的几百微秒里输出无效数据而MAC侧已经把自己初始化完成了后面链路虽然跑起来了但前几个包已经丢了。我自己在最开始的项目里就吃过亏后来在代码里写了一个分步复位状态机上电后先拉低GT TX复位等待txresetdone拉高再拉低GT RX复位等待rxresetdone拉高延时一段时间后再释放用户侧复位。改完之后乱序丢包问题就消失了。5.3 MDIO读写正常但HOST状态不对检查时序违反了没有SGMII IP一般都会提供MDIO接口用来和PHY芯片交互。MDIO本身是慢速接口2.5MHz标准速率。如果你在FPGA里通过GPIO模拟MDIO很容易出现因为组合逻辑过深导致的时序违规。我的经验MDIO读写建议用移位寄存器和状态机实现别直接用always块里做复杂组合逻辑。MDC时钟从系统时钟分频出来之后先打一拍再送出去这样PHY侧采样更稳。如果MDIO读回PHY寄存器发现ID寄存器全为0或全为1先检查MDIO引脚方向、上下拉电阻和PHY地址配置。很多PHY的地址是靠引脚电平决定的比如地址为0x01时MDIO读操作一定带对应phyad。这块问题排查起来特别费时间我见过有人一直以为是FPGA逻辑写得不对最后发现是板子上PHY地址飘了。5.4 常见问题速查表现象可能原因排查方法解决思路链路完全起不来参考时钟没起来示波器测GT refclk或逻辑分析仪看status检查时钟来源/管脚约束链路能起来但速度不对自协商结果不匹配读PHY状态寄存器强制千兆或修正PHY配置收发都正常但丢包跨时钟域处理不当检查rx_clkout到用户逻辑的CDC用异步FIFO隔离RX方向偶尔错误GT复位未完全释放看rxresetdone时序分步复位状态机MDIO读回全FFPHY地址错误/上拉不对检查硬件原理图核对PHY_AD[2:0]引脚仿真正常上板不通约束缺失时序报告看setup/hold补全差分引脚和时钟约束5.5 几个容易忽略的小细节再补几个容易忽略但在实际项目中很重要的小点差分引脚P/N极性SGMII的差分对在PCB上交叉走线会导致接收端极性反了。Xilinx的GT可以配置极性翻转但如果你没开这个选项链路信号会丢失。最粗糙的办法是拿万用表量一量差分对的连通性验收板卡时别省这一步。8B/10B码流中的逗号对齐接收端需要靠逗号码型K28.5做字节对齐。如果GT或者PCS没有正确配置逗号检测收到的数据会变成乱码。逻辑分析仪触发条件调试SGMII数据时最好把触发条件设成gmii_rx_dv上升沿而不是直接抓一个很大的窗口。否则抓回来的信号大部分是空闲码型IDLE有效帧数据很少分析起来很痛苦。QoS和流控如果你的MAC层带流控pause frameSGMII链路不仅要通还要注意PAUSE帧的时序否则高负载下会丢包。6. 从SGMII延展开的几个提升方向SGMII调通之后以太网这条路就算走顺了但接下来大概率会碰到两个延伸需求一是QSGMII。一颗PHY可能带4个千兆口如果每个口都走独立的SGMII需要4对SerDes引脚压力很大。QSGMII用一对SerDes传4个千兆口的数据线速率跑到5Gbps。二是2.5G以太网。SGMII标准本身最高1Gbps但很多PHY支持SGMII可以跑到2.5GbpsFPGA侧需要配成2.5G模式同时把用户侧接口从GMII切换成XGMII之类的高位宽接口。这个时候你对GT参考时钟的要求会更高一般要用156.25MHz而非125MHz。我在这两个方向上踩过的坑包括QSGMII的通道映射特别容易搞错4个口对应的MAC地址跟SGMII通道不是天然对齐的需要看IP的datasheet确认2.5G模式下的8B/10B编码同样引入20%开销所以线速率到3.125Gbps跟PCIe Gen1的速率一样这时候如果你拿PCIe的GT配置去套对不上。另外调SGMII的过程中我也建议大家顺手把Xilinx的Aurora 8B/10B IP核了解一下。Aurora是一种轻量级串行链路协议物理层同样是8B/10B编码如果你只是想在FPGA之间做高速互联不一定非要走以太网协议栈Aurora往往更简单更高效。两者的GT资源使用方式有很多共通点学会SGMII之后再上手Aurora会比从零开始快很多。最后说一个我在实际项目中的体会SGMII这东西功能上其实非常简单但恰恰因为简单很多细节被忽略了。尤其是自协商状态、GT复位的分步控制、跨时钟域的隔离这三个点能抓实你的SGMII调试就能很顺。做FPGA就是这样一次调通了后面所有相关项目都会很轻松但第一次如果调不通往往就在几个信号上反复打转。希望这篇实战指南能帮你少走我走过的弯路。
返回列表