Xilinx Aurora8b10b IP数据丢失之谜,什么问题作祟?

用Xilinx Aurora8b10b IP时遇到如下图这样的问题: 

  1. 用frame模式,2 lanes@1Gbps速率的条件下,发送最后一个数据时,会拉低一个时钟,然后last拉高 ,但是keep少了一位1,数据发生了一个字节的丢失;

  2. 用frame模式,1 lanes@1Gbps速率的条件下,完整正常;

  3. 请问会是什么样的问题导致的?

图片

工作原理

首先,从Aurora 8b10b IP核的工作原理说,能选择frame or stream两种模式(对应framing or streaming interface),本次重点考虑frame模式下数据的传输机制。Aurora协议使用多通道(lanes)来传输数据,每个通道的数据宽度可能不同,但通常是基于字节的,配合keep和last信号来指示有效数据字节和帧的结束。

image.png

在frame模式下,User接口的数据总线宽度可以根据lane的数量而变化。例如,1个lane的情况下,数据宽度可以配置是2字节(16位,Xilinx也允许配置为4字节),在2个lane的情况下,数据宽度可能扩展为4字节(32位,Xilinx也允许配置为2字节)。每个字节对应一个keep信号位,用来指示该字节是否有效。last信号则标记帧的结束。

image.png

本次的问题出现在2 lanes的情况下,当发送最后一个数据时,last被正确拉高,但keep信号少了一个位,导致数据丢失一个字节。而在1 lane的情况下则正常。这说明问题可能与多lane情况下的数据对齐、keep信号生成逻辑以及约束等有关。先从IP的端口看: 

端口

image.png

Framing interface: 本次使用的是Frame mode

image.png

理想情况下的波形应该如下:

image.png

Aurora 8B/10B帧结构

TX子模块通过TX接口将每个接收到的用户帧转换为Aurora 8B/10B帧。帧的开始 (SOF) 通过在帧的开头添加2字节的SCP代码组来表示。帧的结尾 (EOF) 通过在帧结束处添加2字节的信道结束协议 (ECP) 代码组来表示。每当数据不可用时,都会插入空闲代码组。代码组是8B/10B编码的字节对,所有数据都作为代码组发送,因此,具有奇数字节的用户帧在帧的末尾附加了一个称为PAD的控制字符,以填写最终的代码组。表2-3显示了一个典型的Aurora 8B/10B帧,其数据字节数为偶数。

image.png

双lanes情况下,字节发送示意图:

image.png

名词解释:

PDU: Protocol Data Unit 

SCP: Start of Channel PDU,2 Bytes Size

ECP: End of Channel PDU,2 Bytes Size

SOF:  Start of Frame

EOF:  End of Frame

PAD:    pad byte

TX发送数据

image.png

image.png

由于需要每lane每10,000个字节需要进行时钟补偿 (2字节每lane的设计,对应5,000个时钟; 4字节每lane的设计,对应2,500个时钟)。也就是说,不能连续传输数据,也不能连续接收数据。在时钟补偿期间,数据传输将暂停六个或三个时钟周期。

RX接收数据

image.png

image.png

image.png


可能原因

有了上述的基本概念后,继续分析可能的原因。

1)数据长度对齐问题

在2 lanes的情况下,数据总线的宽度更大(例如32位),发送的数据帧的字节数可能没有正确对齐,导致最后一个周期的keep信号生成错误。

例如,检查在2 lanes的情况下,发送的数据帧的字节数是否为4的整数倍。如果不是,那么最后一个周期的keep信号需要根据剩余字节数正确设置。例如,如果总共有5字节,在32位(4字节)总线下,第二个周期传输1字节,keep应为0x0001(即最低位有效)。如果错误地设置为0x0003(即两位有效),则可能多发送了一个无效的字节,或者设置为0x0000,则丢失数据。

2)keep信号生成逻辑错误

在生成keep信号时,没有根据实际的剩余字节数正确设置对应的位,尤其是在多lane的情况下,计算错误导致少了一个有效位。

查看发送逻辑的代码,特别是生成keep和last的部分。例如,在VHDL或Verilog中,当检测到剩余字节数小于总线宽度时,如何设置keep的每一位。例如,在2 lanes的情况下,假设数据总线是32位(4字节),当剩余字节数为3时,keep应为4'b1110(高位在前)或者4'b0111(低位在前),具体取决于字节顺序。如果此处逻辑错误,可能导致少了一位。使用Xilinx IP方案一般不会存在这个问题。

3)时序或同步问题

在生成last和keep信号时,可能存在时序上的问题,导致信号不同步,但这种情况可能更复杂。

4)IP核配置错误

例如,在2 lanes的情况下,数据总线宽度配置不正确,导致逻辑生成的keep信号与IP核期望的宽度不匹配。

检查Aurora IP核的配置,确保lane数量和对应的数据总线宽度正确。例如,对于2 lanes,每个lane的线速率为1Gbps,那么每个lane的数据速率是1Gbps,而8b10b编码的实际数据速率是1Gbps * 8/10 = 800Mbps per lane。因此,总数据速率是每个lane的800Mbps乘以2,即1.6Gbps。对应的接口时钟是100 MHz(每个时钟周期传输16位,即2字节,对于1 lane)或者更高的频率。但具体的数据宽度需要根据IP核配置来确定。

5)数据打包的问题

例如,当数据帧的字节数在2 lanes的情况下不是4的整数倍时,最后一个传输周期会有部分字节有效,这时候需要正确设置keep信号的低位。例如,假设数据长度是5字节,那么在2 lanes(32位,4字节/周期)的情况下,需要两个周期:第一个周期传输4字节(keep=0xF),第二个周期传输1字节(keep=0x1),同时拉高last。如果在这种情况下错误地将keep设置为0x0(即仅高位有效),或者在处理时少计算了一个字节,则可能导致问题。使用Xilinx IP方案一般不会存在这个问题。

6)数据有效字节的计算存在错误

例如,在1 lane的情况下,可能正确计算了剩余的字节数,并设置对应的keep信号,但在2 lanes的情况下,计算错误,导致最后一个周期的keep少了一位。

检查是否在发送最后一个数据时,正确地在同一时钟周期拉高last信号,并且保持数据有效。例如,在最后一个周期,数据必须有效,last拉高,同时keep正确指示有效字节。如果提前一个周期拉高last,或者在数据无效时拉高last,可能导致问题。

7)物理约束存在错误

例如,在1 lane的情况下,rx/tx不存在顺序问题;但在2 lanes的情况下,rx/tx存在顺序问题,如果不能正确实现约束,会导致接收端编码混乱。

解决方案

1. 确保在发送数据时,数据长度在2 lanes的情况下正确对齐,或者在无法对齐时正确计算最后一个周期的有效字节数,并设置对应的keep信号。

2. 检查生成keep信号的逻辑,确保在最后一个周期根据剩余字节数正确设置每一位。例如,如果剩余3字节,则keep的4位中应有3个高位或低位设置为1,具体取决于字节顺序。

3. 验证Aurora IP核的配置,确保lane数量和数据总线宽度匹配,例如2 lanes对应的数据宽度是否是32位。

4. 检查时序,确保last和keep信号与数据同步,并且没有因时序问题导致信号被错误地采样。

5.检查约束,确保物理约束正确。

验证步骤

  1. 仿真测试:
    在Vivado中仿真2 lanes模式下的发送逻辑,检查最后一帧的keep和last信号是否符合预期。重点关注剩余字节数为非4倍数的情况。

  2. 协议分析仪抓包:
    使用ILA(Integrated Logic Analyzer)抓取发送端接口信号,确认实际生成的keeplast信号是否与设计一致。

  3. 代码审查:
    检查发送逻辑中keep信号的生成逻辑,确认其动态计算是否覆盖所有可能的剩余字节情况(1/2/3字节)。

问题解决

image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值