PRBS 误码测试时,通常需要计算误码率。如果使用 IBERT,误码率可以在 AMD Vivado™ Design Suite 的 GUI 界面中读取,但是在无法使用 JTAG 连接到 AMD Vivado 的场景,需要用户通过读取相应的寄存器来计算误码率。本文将对这一过程作详细介绍。
APB3 总线接口时序
AM017 提供了 APB3 的读写时序,过程还是比较简单的。地址线为 APB3PADDR,写数据为 APB3PWDATA,读数据为 APB3PRDATA。读写操作通过 APB3PWRITE 切换,当 APB3WRITE 为1时进行写入操作,当为0时进行读取操作。APB3PSEL 指示从设备已被选中,并需要进行数据传输。APB3PENABLE 被置位表示进入访问阶段的开始。当 APB3PREADY 被置位时,表示从设备可以在下一个 APB3CLK 的上升沿时完成传输。参考下图:
1. 读取
2. 写入
访问寄存器步骤
1. 设置 PRBS Pattern 模式和 Loopback 模式,TX 和 RX 的 Pattern 需要保持一致,设置完成后需要对 GTM 做一次复位。如果外部链路连接没有问题或者使用近端 PMA/PCS 回环,就可以看到 RXPRBSLOCKED 已经被置1。
2. 使用 RXPRBSCNTRESET 管脚对总 Counter 和 Error Counter 清零。
注意:当使用 RXPRBSCNTRESET 复位 Counter 时(无论时使用 Port 还是在 IBERT 界面点击 BER RESET),会导致 RXPMARESETDONE 短时的拉低后再拉高。尽管 RXPMARESETDONE 翻转,但是 PMA 层的任何模块都没有被复位。详细信息可参考 AR000036588 的说明:https://adaptivesupport.:.com/s/article/000036588?language=en_US
3. AMD Versal™ 自适应 SoC 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 的说明:
https://adaptivesupport.amd.com/s/article/000036550?language=en_US
计算误码率
1. 误码率计算公式:
误码率 = 错误 Bit 位数量 / 实际 Bit 位数量
实际Bit位数量 = COE_STATUS_RX_CYCLECNT* RX_Interface_width
RX_Interface_width 的位宽可以有两种方法获取:
a. 通过读取 RX_PCS_CFG0 的参数
比如下图中0x9代表 RX_DATA_WIDTH 是160位长度。
b. 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
AMD 自适应 SOC 及 FPGA 中文技术支持社区