开发者分享 | 如何调试10G/25G以太网IP自协商/Link Training

*此调试过程亦适用于10G, 25G, 40G, 50G, 100G以太网IP核,每个IP可能会有些细节上的不同,但整个自协商和LinkTraining过程是类似的,可以作为参考。
*如果是40G/50G, 100G以太网,选的是多通道的IP,务必保证两端的通道0是正确对接上的,因为在做自协商的时候,以太网只使用通道0,其它通道需在自协商完成后再加入工作。

一.产生一个例子工程仿真

打开你的Vivado工具,选择你所需要的器件类型,在IPCatalog里产生一个10G/25GEthernet Subsystem IP core,勾上BASE-KR和IncludeAN/LT Logic以涵盖IP自协商功能

(这里为方便起见,选择了Controland Status Vectors接口,这样IP的配置可以通过在代码中直接用逻辑赋值IP的input输入来完成;如果你需要选用AXI接口进行寄存器配置,请参考例子工程的各项配置,自己相应地写好对应寄存器值)

右键IP的.xci,Open IPExample Design

例子工程产生出来之后,我们需要做一些简单的修改,因为原始的例子工程仿真里面,没有做自协商的演示。

1. 修改顶层代码“xxv_ethernet_0_exdes.v”,使能自协商功能,并且将AN的seed信号引到输入port上,方便之后修改,如下图

2. 修改tb文件,原来tb只调用了一个IP自己做环回,我们需要再复制一个,改成两个IP互联,将两者的串行数据txp/txn和rxp/rxn对接起来;新加的IP,输入可以跟原来那个共享保持不变,输出可以悬空;最后将之前拉出来的AN的seed值任意设置为两个不同的值即可(这是IEEE协议的要求,PG210中有相关描述)

3. 在开始仿真前,请取消“UsePrecompiled IP simulation libraries”的勾,并加上“-dSIM_SPEED_UP”的vlog选项,以加速完成你的仿真,便于查看仿真结果。

然后,点击RunBehavior Simulation

二.自协商与LinkTraining的调试过程

*以下整个调试过程同时适用于仿真与上板,上板时可以用ILA抓出相同的信号来进行调试

a. 随着tx_disable拉高一个脉冲,标志着以太网的自协商状态机正式开始运行;上电,复位IP或两端任一端复位AN,都会导致这一行为的发生。

b. 自协商的工作完全由IP自动完成的,所以只要配置没问题,你只需要耐心等待就可以看到自协商的完成,以an_good_check为标志,并且进入下一步linktraining

c. 在LT的过程中,首先你要等到IP能够锁定LT帧,即frame_lock拉高,然后你就可以进行你自己的LT算法了,与AN不同LT是由客户手动完成的。

不过由于Xilinx的Serial Transceiver能够提供非常好的信号质量,因此我们建议用户如果两端用的都是Xilinx的器件,可以直接跳过此步骤,将输入信号rx_trained拉高。

d. 无论你是做完了自己的LT测试,还是直接跳过了此步骤,当两端都拉高了自己的rx_trained之后,就可以等待LT的完成标志signal_detect拉高

e. 最后autoneg_complete拉高代表了整个自协商和LinkTraining的流程都成功完成了,此时IP恢复到与BASE-R模式完全相同的工作模式

f. 等待block_lock,stat_rx_status等信号拉高,以太网IP最终完成了linkup

*具体AN/LT的步骤(包括状态机)可以同时参考IEEE协议的定义

*以上这些IP标志信号的命名,与以太网协议定义的AN/LT状态机中状态信号命名基本保持一致,方便客户在协议中找到对应的涵义

三.调试建议

当你在实际应用中,无法完成自协商时,可以分步来做调试;首先关闭两端的AN/LT,以太网是否能完成link up,并且传输数据无误码;然后分别打开AN关闭LT,或者打开LT关闭AN,是否都能linkup,哪个失败就具体调试哪个部分;最后全部使能,检查link结果。

本文转载自:Xilinx技术社区微信公众号

推荐阅读