物理层协议内容
RapidIO串行物理层,通常称为串行RapidIO,简称为SRIO(Serial-RapidIO)。串行物理层定义器件间的全双工串行链路,在每个方向上使用单向差分信号,采用8B/10B编码方案将时钟嵌入到数据中、支持1通道及4通道通讯链路且每通道波特率可为1.25G、2.5G和3.125G、采用专用的8B/10B码(称为K码)来管理链路。
RapidIO串行物理层支持RapidIO器件间的包传送,包括包和控制符号的传送、流量控制、错误管理和其他器件到器件的功能。本文将主要讨论一下RapidIO串行物理层的包格式与控制符号。
SRIO物理层包协议
主要包括两个部分的内容,第一部分介绍物理层添加的内容,第二部分是对数据包的校验方式。
1 物理层协议内容
RapidIO串行物理层的包格式如下图所示
其中逻辑层和传输层各个字段的含义与上篇文章并行物理层包格式字段含义完全相同。这里不再赘述,串行包格式物理层各个字段的含义如下表所示
字段 | 描述 |
ackID:5 | ackID是返回给包发送者的包标识符。串行物理层为该字段定义了5位。这足以在两个器件间唯一的识别最多32个未完成的事务 |
Rsvd:2 | 产生包时这两位必须置0,接收包时,这两位需要忽略 |
Crf:1 | 关键请求流(Critical Request Flow),与prio字段共同决定包的优先级 |
Prio:2 | 设置包的优先级,2’b11的优先级最高,2’b00的优先级最低 |
Crc:16 | 使用16位循环校验码检查包中的错误 |
串行RapidIO包的长度应该是32位的整数倍。因为内部数据的宽度一般是32位的整数倍,所以使串行RapidIO包的长度等于32位的整数倍可以简化发送和接收端口逻辑的设计。如果包的长度是16位的奇数倍(包括循环冗余校验码字段),值为0x0000的16位数据会填充到包尾。填充后的包长度是32位的整数倍。
2 物理层协议特点
串行物理层在每个包中加入16位循环冗余校验码以提供错误检测机制。该码覆盖了除ackID字段和rsvd字段首位外的整个包,循环冗余校验码计算时将未覆盖的部分视为0。下图显示了循环冗余校验码未覆盖的串行物理层包头的前6位(ackID和第一个保留位)。
由于包通过交换结构传输时不要求为每个链路重复计算循环冗余校验码,所以该结构允许ackID在每条链路上改变。由于在每条链路上为每一后续传送的包分配的ackID是连续的,所以很容易检测到ackID字段的错误。
有两种方式将循环冗余校验码附加在包尾。对除循环冗余校验码外长度等于或少于80字节的包来说,在逻辑层字段尾附加一个单独的循环冗余校验码。下图是长度小于80字节的被填充过的包的示例
对除循环冗余校验码外长度大于80字节的包来说,在前80字节后附加一个循环冗余校验码。在逻辑层字段尾的加另一个循环冗余校验码。第二个循环冗余校验码是第一个的延续。第一个循环冗余校验码包含在运行(running)计算中,这意味着在运行循环冗余校验码值插入到包的前80个字节后面之后不再重新初始化。这允许相关器件将嵌入的循环冗余校验码值视为2字节的数据载荷以进行循环校验码的校验。如果附在逻辑层后面的循环冗余校验码不能使包尾部对齐32位边界的话,2字节的全逻辑0填充就会加在包尾部。该逻辑0填充区有助于保证循环冗余校验码校验总在32位边界完成。接收处理部件使用前一个循环冗余校验码来检査较大包头的有效性并在接收到整个包前开始处理数据,这样可以更早地释放资源并减少完成事务的延迟。
下图是一个长度大于80字节的被填充过的包的示例。这个包包括两个循环冗余校验码和一个位于包尾的填充区。包的总长度为32位的整数倍。
使用ITU(国际电信联盟)多项式X16+X12+X5+1可以产生包16位的循环冗余校验码。在每个包的开始循环冗余校验码的值初始化为0xFFFF(全部逻辑1)。在循环冗余校验码计算时把未覆盖的6位视为逻辑0。具体的实现过程请参考RapidIO官方手册(参考文献1)第465页。
快来扫描下方二维码关注公众号,领取站内所有相关资料,所有哦~
有建议、有需求、有疑问、联系我