Versal GTM如何通过APB3总线读取attributes并计算误码率

作者:Zhang Cheng,AMD工程师;文章来源:AMD开发者社区

PRBS误码测试时,通常需要计算误码率。如果使用IBERT,误码率可以在Vivado的GUI界面中读取,但是在无法使用JTAG连接到Vivado的场景,需要用户通过读取相应的寄存器来计算误码率。本文将对这一过程作详细介绍。

1. APB3总线接口时序

AM017提供了APB3的读写时序,过程还是比较简单的。地址线为APB3PADDR,写数据为APB3PWDATA,读数据为APB3PRDATA。读写操作通过APB3PWRITE切换,当APB3WRITE为1时进行写入操作,当为0时进行读取操作。APB3PSEL指示从设备已被选中,并需要进行数据传输。APB3PENABLE被置位表示进入访问阶段的开始。当APB3PREADY被置位时,表示从设备可以在下一个APB3CLK的上升沿时完成传输。参考下图:

1)读取

1)读取.png

2)写入

2)写入.png


2. 访问寄存器步骤

 1) 设置PRBS Pattern模式和Loopback模式, TX和RX的pattern需要保持一致,设置完成后需要对GTM做一次复位。如果外部链路连接没有问题或者使用近端PMA/PCS回环,就可以看到RXPRBSLOCKED已经。

 2) 使用RXPRBSCNTRESET管脚对总Counter和Error Counter清零。

        注意当使用RXPRBSCNTRESET复位counter时(无论时使用port还是在IBERT界面点击BER RESET),会导致RXPMARESETDONE短时的拉低后再拉高。尽管RXPMARESETDONE翻转,但是PMA层的任何模块都没有被复位。详细信息可参考AR000036588的说明。

3) Versal GTM每个Lane都提供了两组可以用于计算PRBS误码率的寄存器,分别是DO_FROM_PRBSERR和DO_FROM_RX_CYCLECNT。这两组寄存器是64位长度,因此会占用4个地址,分别是0x0840(COE_STATUS_PRBSERR_CNT0)和0x0841(COE_STATUS_PRBSERR_CNT1)以及0x0842(COE_STATUS_RX_CYCLECNT0)和0x0843(COE_STATUS_RX_CYCLECNT1)。

4) 因为PHY Clock的 Counter和Error Bit的Counter在PRBS测试运行时会实时变化,GTM内部有锁存机制来保证两组寄存器被同时捕获,不会因为读取数据的时间差导致误码率计算的误差。在读取过程中,要保证先读取0x0840地址,0x0840读取后内部会自动刷新0x0841、0x0842和0x0843的数据。如果0x0840地址没有被读取,那么0x0841、0x0842和0x0843的数据会始终保持上一次的值。注意:AM017 v1.0的相关描述有误,详细信息可参考AR000036550的说明。

测试运行.png

3. 计算误码率

1)误码率计算公式:

误码率 = 错误bit位数量 / 实际bit位数量

实际bit位数量 = COE_STATUS_RX_CYCLECNT* RX_Interface_width

RX_Interface_width的位宽可以有两种方法获取:

  1. 通过读取RX_PCS_CFG0的参数

比如下图中0x9代表RX_DATA_WIDTH是160位长度。

160位长度.png

  1. RX_Interface_width = Line rate / RXUSRCLK

2)误码率计算示例

假设:RX_Interface_width = 160-bit,PRBSERR_CNT0 = 0x30,COE_STATUS_RX_CYCLECNT= 0x255B80CCEC = 160,448,957,676

Actual bits = COE_STATUS_RX_CYCLECNT * RX_Interface_width = 160,448,957,676 * 160

BER(误码率) = 48 / (160,448,957,676 * 160) = 1.869753498840423e-12

最新文章

最新文章