SPI42接口协议分析.docx
《SPI42接口协议分析.docx》由会员分享,可在线阅读,更多相关《SPI42接口协议分析.docx(36页珍藏版)》请在冰点文库上搜索。
SPI42接口协议分析
SPI-4.2协议分析
一.SPI-4.2协议简介:
SPI-4.2协议的全称为SystemPacketInterface,可译为“系统包接口”。
该协议由OIF(OpticalInternetwokingForum)创建,用于规定10Gbps聚合带宽应用下的物理层(PHY)和链路层(Link)之间的数据抱传输协议,支持多通道的包或信元传输。
适用于OC-192,ATM,POS以及10G以太网。
1.系统模型:
SPI-4.2系统参考模型如图1所示,我们把从链路层到物理层的数据方向,称为“发送”方向;而从物理层到链路层的数据方向,称为“接收”方向。
在两个方向上,都存在数据流控制(流控)机制,流控数据传输方向和数据传输方向相反,把接收端的状态信息实时地反映到发射端,用来调节控制发射端的数据传输。
图1.SPI-4.2系统参考模型图
在发送与接收方向,FIFO信息(流控数据)都是和相应得数据通路之间分开独立发送的,我们称之为带外传输。
状态信息的带外传输使得发送和接收接口相互独立,这就使得SPI4.2接口不仅适合于双向传输的链路层器件,也适合于单向传输的应用。
另外,数据包的地址、描述信息(包括包结束、包开始信息等)、差错控制编码都是和数据一起,进行带内传输。
SPI-4.2支持多通道(Port)传输。
一个通道,是指接收或发送方向上,相互传输数据的一对关联的实体。
如果有很多对关联的实体(即很多个通道),都在同时传输数据,它们可复用SPI总线。
最多可支持256个通道(由流控数据内的地址位[11:
4]确定)。
例如OC-192的192个STS-1通道,快速以太网中的100个通道等,各个通道的数据都可以相互独立地复用在SPI总线上传输。
2.协议特点:
A.点对点互连(PHY与LINK之间);
B.支持最大256个通道;
C.数据链路宽度为16位,LVDS差分I/O接口;线上最小数据速率为622Mbps;
D.数据链路内部携带地址、起始标志和验证码等;
E.使用源同步时钟,双沿采样,最小时钟频率为311MHz;
F.流控端口宽度为2位,LVDS或LVTTL端口,同样是使用源同步时钟;
G.接收模块和发射模块都有FIFO队列,用于缓存数据,队列长度由设计确定;
H.接收模块和发射模块FIFO状态信息相互独立,并附带DIP-2校验码,提高传输可靠性。
另外,SPI4.2接口的突发数据(Burst)可以按规定的最大长度、最小长度或固定长度进行传输,除非在数据末尾有EOP(EndOfPacket)标志以外,突发数据的长度都必须是16Byte的倍数。
每一次传输的附带信息(端口地址,起止标志,差错控制)以16bit的控制字(PC=PayloadControl)发送。
图2显示了数据包(Packet)和ATM信元两个数据通道复用到SPI总线上的数据流的示例图,从中我们可以看到不同通道的数据负载和控制字交替传输的情况。
图2.数据包映射图
3.接口信号:
SPI-4.2的接口信号如图3所示,包含发送数据总线接口(TDCLK,TDAT[15:
0],TCTL)和接收数据总线接口(RDCLK,RDAT[15:
0],RCTL)。
发送FIFO状态总线接口(TSCLK,TSTAT[1:
0]),接收FIFO状态总线接口(RSCLK,RSTAT[1:
0])。
接收和发送两个方向完全类似。
每个方向的信号线都包括数据总线和状态总线。
以接收方向为例,数据总线包括RDAT,RDCLK和RCTL,其中RDAT为16比特的数据线,RDCLK为与RDAT、RCTL的同步的源同步时钟,RCTL为控制信号线。
RDCLK为双沿采样的时钟,在上升沿和下降沿RDAT和RCTL分别表示不同的数据。
当RCTL为1时,表示RDAT上的当前传输的是控制字;当RCTL为0时,表示当前传输的是实际所需数据。
状态总线为RSTAT和RSCLK,其中RSCLK为源同步时钟,对RSTAT进行采样;RSTAT为2比特的状态线,用于传输接收方向的目标FIFO的状态,主要用于流控(flowcontrol)。
图3.接口信号图
数据总线(包括R/TDCLK、R/TDAT、R/TCTL)只能使用LVDS电平标准;状态总线(包括R/TSCLK、R/TSTAT)可以使用LVTTL电平标准,也可使用LVDS电平标准。
当使用LVTTL电平标准时,时钟频率不超过数据总线的1/4(通常取1/4或1/8);当使用LVDS电平标准时,最大时钟频率可以和数据总线频率一致。
接口的信号列表见表1。
表1接口信号列表
信号
方向
描述
TDCLK
Link—〉PHY
发送数据采样同步时钟
双沿采样、驱动TDAT和TCTL
TDAT[15:
0]
Link—〉PHY
发送数据
传输从Link到PHY的载荷数据和带内控制字。
TCTL
Link—〉PHY
1:
TDAT[15:
0]上为控制字
0:
TDAT[15:
0]上为数据
TSCLK
PHY—〉Link
TSTAT采样同步时钟
TSTAT[1:
0]
PHY—〉Link
传输轮循的FIFO状态信息以及相关的错误侦测和成帧
RDCLK
PHY—〉Link
接收数据采样同步时钟
用其上升和下降沿来采样和驱动RDAT和RCTL
RDAT[15:
0]
PHY—〉Link
接收数据
传输从PHY到Link的载荷数据和带内控制字
RCTL
PHY—〉Link
1:
RDAT[15:
0]上为控制字
0:
RDAT[15:
0]上为数据
RSCLK
Link—〉PHY
RSTAT采样同步时钟
RSTAT[1:
0]
Link—〉PHY
传输轮循的FIFO状态信息以及相关的错误侦测和成帧
二.接口详述:
SPI-4.2接口包含数据总线(DataPath)和状态总线(FIFOStatusChannel)两大部分,下面就针对两部分分别进行介绍。
1.数据总线(DataPath):
数据总线中TDAT/RDAT、TDCLK/RDCLK和TCTL/RCTL相互之间的关系见图4。
从图中可以看出:
时钟和DAT/CTL同步。
总线上传输的数据分为两类:
一类为需传输的数据负载(payload),一类用于控制负载传输的字节,称为控制字(Controlwords)。
我们可以通过R/TCTL的电平情况来区分数据总线上传输的是是数据负载,还是控制字。
当R/TCTL为高电平时,数据线上传输的是控制字;当R/TCTL为低电平时,数据线上传输的是正常数据。
在传输控制字时,如果下一个周期仍然是控制字,则当前控制字为IDLE控制字。
图4.数据总线时序图
A.数据负载:
数据负载为16位,其在总线上传输时,高8位为低字节,低8位传送高字节。
如图5所示,其中图(a)包含奇数个字节的数据包负载传输的字节顺序,无效的字节“XX”一般设置为零,图(b)为包含偶数个字节的数据包负载传输的字节顺序。
(a)(b)
图4.负载传输顺序
数据负载包的最大、最小长度由具体的应用决定。
但是,每次数据突发,通常必须为16字节(8个周期)的整数倍。
只有一种情况例外,即当前数据包已传输到数据的最末尾。
也就是说,仅仅带包终止标志(EOP)控制字的前一个数据突发可以不是16字节的整数倍。
从数据包传输的角度来看,数据突发只能暂时停止在包的16字节整数倍的边界处,或停止在数据包结束处。
图5.SOP间距示意图
注:
S:
SOP有效的控制字
E:
EOP有效的控制字
ES:
SOP、EOP有效的控制字
I:
idle控制字
C:
连续传输控制字(bit[15:
12]=8)
EC:
EOP有效,设置连续传输的控制字
P0,P1……:
载荷数据字节
对于每一通道,其数据在总线上传输时,包起始标志(SOP)控制字的间隔不能少于8个周期(每个周期为两个字节(16比特),可以传输一个控制字或者数据字),短包之间的间隙(gap)用idle控制字来填充。
也就是说,连续传输两个数据包时,这两个数据包的起始位置至少要相隔8个周期。
图5上部列出了单通道情况,针对不同包长时,数据在总线上的排列情况。
上面所说的8个周期限制仅仅是针对单个通道传输数据而言,当多个通道复用总线时,多个通道之间的控制字和数据字相互独立,没有相互关系,也没有限制。
在图5左下角,在不同通道的数据负载之间只有连续传输控制字,这样可以让更多的数据能够立即被传输,提高了传输效率。
上面提到的多通道传输。
是指在某个时间段内,总线上在传输这个通道的数据;在下一个时间段,总线上在传输另外一个通道的数据。
每一段数据,称为一次数据突发(Burst);两次数据突发之间,以控制字(EC)分隔,并表征前后两次突发数据的状态。
同时,有关通道的信息也内嵌在控制字中。
B.控制字:
控制字用于控制负载数据的传输,表征负载数据的状态,在接收和发送方向使用相同的控制字。
在整个传输的数据流中,控制字既表示了该控制字前一段连续负载的状态,同时也表示了后一段连续负载的状态。
每个控制字由两个字节组成,为总线上一个周期传输的数据。
包括以下几个控制域:
a)类型(Type):
表示后一周期的数据,为负载数据,还是一个IDLE周期。
b)包结束标志(EOPS):
表示前一个周期的数据为数据包的最后一个周期。
c)包超始标志(SOP):
表示下一个周期的数据为数据包的第一个周期。
d)通道地址(ADR):
表示后一段连续负载数据所属的通道。
e)校验和(DIP-4):
校验和,保证控制字和数据传输的正确性。
这几个控制域在16比特中的分布如图6所示:
图6.控制字的控制域分布图
其中EOPS为两比特,除表示数据结束的含义之外,还可以用来表示数据包结束时的两个字节,是仅有一个字节有效(11),还是两个字节都有效(10)。
通道地址为8比特,因此可以支持256个通道的数据传输。
详细说明见表2、表3,举例说明见表4。
表2控制字格式描述表
Bit位
标签
描述
15
Type
控制字类型
1:
载荷控制字(控制字后将立即发送载荷)
0:
idle或者训练控制字
14:
13
EOPS
EOP状态,与前一个采样周期的payload传输状态有关
00:
非EOP
01:
EOP中止(特定应用的错误状态)
10:
EOP正常终止,2byte有效
11:
EOP正常终止,1byte有效
在一个burst的首个控制字中EOPS也是合理的,但是他不会被设置或者设置为“00”
12
SOP
SOP状态
1:
控制字后立即会有payload传输
0:
其他情况
在idle和训练控制字中全部设为“0”
11:
4
ADR
端口地址
8bit的载荷数据的端口地址,无保留地址
Idle中设为全“0”
训练序列中设为全“1”
3:
0
DIP-4
4-bit的对角线隔行校验位
4-bit的奇校验,通过计算当前控制字和紧邻的数据字(前1控制字后面的数据字内容,无数据字则不计算)
表3控制字类型列表
Bit[15:
12]
下一个字状态
前一个字状态
意义
0
0000
Idle
Continued
Idle,非EOP,训练控制字
1
0001
Reserved
Reserved
Reserved
2
0010
Idle
EOP
w/abort
Idle,中止前一个包
3
0011
Reserved
Reserved
Reserved
4
0100
Idle
EOP
w/2bytes
Idle,EOP,2字节有效
5
0101
Reserved
Reserved
Reserved
6
0110
Idle
EOP
w/1byte
Idle,EOP,1字节有效
7
0111
Reserved
Reserved
Reserved
8
1000
Valid
None
Valid,无SOP,无EOP
9
1001
Valid/SOP
None
Valid,SOP,无EOP
A
1010
Valid
EOP
w/abort
Valid,无SOP,中止
B
1011
Valid/SOP
EOP
w/abort
Valid,SOP,中止
C
1100
Valid
EOP
w/2byte
Valid,无SOP,EOP,2字节有效
D
1101
Valid
EOP
w/2byte
Valid,SOP,EOP,2字节有效
E
1110
Valid
EOP
w/1byte
Valid,无SOP,EOP,1字节有效
F
1111
Valid
EOP
w/1byte
Valid,SOP,EOP,1字节有效
表4控制字举例
控制字
描述
011000000000abcd
Idle控制字,位于数据传输之后,正常终止,上次传输最后一个数据字中1byte有效(abcd为校验,与此控制字和前一个数据有关)
0000000000001111
Idle控制字,前一个也为idle控制字
110100000101abcd
载荷控制字位于上次传输之后,正常终止,上次传输最后一个数据字中2byte有效(abcd为校验,与此控制字和前一个数据有关)下一个数据传输到5端口
C.状态跳变:
前面分别介绍了数据负载和控制字,下面介绍二者之间的关系变化。
图7显示了连续周期的数据通路上的状态转换。
“DataBurst”后的状态转换(转换至“PayloadControl”(如果有数据等待传输),或者“IdleControl”(其他情况))条件只能为接收到了8个周期的整数倍数据(等同于16Byte整数倍的数据段)或者接收到了包结束标志EOP。
“PayloadControl”状态后必须跟着“DataBurst”(除非支持控制字扩展功能,这里不讨论)。
其中的训练数据字和训练控制字会在后面介绍。
图7(a).数据通路状态转换图
图7(b).负载数据/控制字的有效序列
图7(b)所示为负载数据及控制字的有效序列。
图中最下面一行为有效的控制字编码,编码为控制字的[15:
12]位的内容,左下标为EOP标志,右下标为SOP标志。
进行数据突发时称为ACTIVE,不传输数据或发送训练序列时称为IDLE。
由IDLE至ACTIVE的控制字没有左下标,这是由于控制字之间没有数据突发,故不需要EOP标志;由ACTIVE至IDLE的控制字没有右下标,这是由于控制字之后没有数据突发,故不需要SOP标志。
由ACTIVE经过8、E、C和A四个控制字时,继续进行数据突发传输;经过9、E、D和B四个控制字时,继续进一个新数据包的突发传输;经过0、6、4和2结束数据包传输,进入到IDLE。
由IDLE经过8、9继续或开始数据包的突发传输,进入到ACTIVE;经过0仍然处于IDLE,或发送训练序列。
训练序列包括10个周期的TC(TrainingControl)和10个周期的TD(TrainingData)。
图8.单通道状态跳转图
每个通道在总线上传输数据时可分为三个状态:
激活状态(ACTIVE):
表示当前正在发送数据;
暂停状态(PAUSED):
表示当前未发送数据,但有数据包尚未发送完成;
未激活状态(INACTIVE):
表示当前未发送数据,且无未完成的数据包。
图8为单个通道在各种控制字作用下的状态跳转图。
状态机的跳转过程如下:
a)通道n可以从INACTIVE跳转到ACTIVE状态,其条件是PC[n]&SOP,即控制字为控制通道n(控制字中的地址域值为n)且为包的起始(控制字的SOP域为1,表示包开始)。
此时,开始传输一个数据包。
b)控制字为(IC|PC[~n])&EOP时,即IDLE控制字或其它通道的payload控制字,且EOP为1时,从ACTIVE状态跳到INACTIVE状态。
此时,一个数据包的传输结束,总线不再被通道n占用。
c)控制字为PC[n]&EOP&SOP时,即通道n的控制字且既包括EOP也包括SOP时,从ACTIVE状态跳转到ACTIVE状态。
此时,当前数据包传输结束,继续传送下一个数据包。
d)控制字为PC[n]&~EOP&~SOP时,即通道n的控制字且既不包括EOP也不包括SOP时,从ACTIVE状态跳到ACTIVE状态。
此时,继续传输当前数据包。
e)控制字为(IC|PC[~n])&~EOP时,即IDLE控制字或其它通道的payload控制字,且EOP不为1时,从ACTIVE状态跳到PAUSED状态。
此时,当前数据包的传输被中断。
f)控制字为PC[n]&~OP时,即通道n的payload控制字且包括SOP时,从PAUSED状态跳到ACTIVE状态。
此时,中断的数据包传输被恢复。
2.状态总线(FIFOStatusChannel):
SPI-4.2的流控功能是通过状态总线实现的。
接收模块和发射模块上都有FIFO缓存队列,以接收方向为例,即物理层(PHY)至链路层(Link)的方向上,数据由物理层送至链路层,在链路层的每个通道中,数据被送入到FIFO缓存。
链路层将FIFO的状态通过状态总线RSTAT反馈给物理层,物理层观察到FIFO的状态之后,控制自己发送数据的速率,从而实现流控功能。
在发送方向上,也是使用相同的流控机制。
如图9所示,为利用FIFO状态的反馈进行流控的结构图。
图9.FIFO状态进行流程控制图
FIFO的状态在RSTAT上传输,RSTAT为2比特,FIFO有三种状态,分别用“00”,“01”和“10”表示,“11”用于特殊用途,如表示DISABLE或帧边界等状态。
FIFO的状态含义如表5所示。
简单来说,“10”表示FIFO进入几乎满状态,只能写入少量的数据;“00”表示处于快要空的状态,需马上写入数据,否则将导致FIFO下溢,“01”表示某个中间状态。
对应每一个状态,都在一个所谓的“分值”(Credits),表示接收到该状态后,FIFO还可以容纳多少个16字节。
其中MaxBurst1必须大于或等于MaxBurst2,有关MaxBurst值及分值的含义请参考“流控分值”一节。
表5FIFO信号定义列表
MSB
LSB
意义
1
1
Reserved
保留字或者用来表示链接非使能状态
1
0
Satisfied
表明相应的端口FIFO几乎是满的状态,当satisfied接收到时,只有紧邻的上次16byte的数据块可以继续发送出去,其余数据在FIFO状态变化之前禁止发送
0
1
Hungry
当Hungry接收到时,在FIFO状态变化之前只有紧邻的上次准许发送的数据块(不论大小)或者最多MaxBurst2个16byte的数据可以继续发送出去,其余数据在FIFO状态变化之前禁止发送
0
0
Starving
表明相应PHY端口的Buffer即将清空,当接收到Starving状态时,在下一个端口状态改变前,可以发送MaxBurst1个16byte的数据块
在SPI-4.2的数据总线中有多个通道的数据在传输;同样,在状态总线中,多个通道的FIFO状态在状态总线上传输。
数据总线中,通过控制字表征每次数据突发的状态及数据属于哪个通道;在状态总线上,直接采用轮流的方式发送各个通道的FIFO状态。
各个FIFO的状态,通过一个控制序列进行发送,这个序列称为日历序列(CalendarSequence),该序列的长度称为日历长度,标识为CALENDAR_LEN。
日历序列的值为通道号,在状态总线上,根据日历序列的值来确定发送第几个通道的状态。
例如CALENDAR_LEN=4,日历序列的值为:
CALENDAR[i]=1,2,3,4。
那么在状态总线上首先发送通道1的FIFO状态,下一个周期再发送通道2的FIFO状态,再下一个周期为通道3的FIFO状态,然后是通道4的FIFO状态;再然后继续循环从通道1的状态开始发送。
为了使状态总线的接收方能够定位这些轮流发送过来的FIFO状态的起始位置,使用“11”作为帧首定界符,使用DIP-2值为帧尾定界符。
帧首和帧尾之间为FIFO的状态,由于状态帧周期性发送,只要连续定位足够多的“11”和DIP-2值,就可以确定帧的边界,从而得到各个FIFO的状态。
在帧首和帧尾之间,通常会按照日历序列重复多次发送FIFO状态,这个重复的次数标记为CALENDAR_M。
那么,在帧首和帧尾之间的状态个数为:
CALENDAR_LEN×CALENDAR_M。
(a)
(b)
图10.FIFO状态发送跳变图
图10状态总线的FIFO状态发送跳转图,其中(a)为没有训练序列的LVTTL/LVDS接口模式,(b)为有训练序列的LVDS接口模式。
FIFO状态发送方最初处理DISABLE的工作状态,不停地发送“11”;当使用后,进入SYNC状态,发送一个周期的“11”,然后进入到CALENDAR状态,根据CALENDAR_LEN、CANLENDAR_M值,和日历序列,发送多个通道的FIFO状态;再回到DIP-2状态,发送前述数据的DIP-2值。
从DIP-2状态再回到SYNC状态,如此循环往复。
对于流控,SPI-4.2协议有如下规定:
1)“接收”方向,即PHY到LINK方向的实现是可选的;“发送”方向,即LINK到PHY方向的实现是必须的。
若都进行了实现,相互之间应该完全独立地工作。
2)CALENDAR_LEN至少应该与通道数相等,通常应设置为所有通道的总速率除以最低速率的通道速率的商。
例如对于OC-192应用,其中存在VC-3通道,可设置其值为192。
具体计算方式见下面例子。
3)某个通道在日历序列中出现的次数,与这个通道的速率成正比。
4)当某个通道多次出现在日历序列中,应使这些值以大致相等的间隔排列在日历序列中,这样可以使状态接收方均匀地收到FIFO状态,更好地进行流控(见图11)。
5)同一个传输方向上接收端和发射端的CALENDAR_LEN,CALENDAR_M值和日历序列CALENDER[i],必须分别配置为完全相同的值。
6)MaxBurst1和MaxBurst2的值,可以设置为所有通道使用相同的值,也可以为每个通道指定不同的值。
但对于SPI-4.2的“接收”方向或“发送”方面,PHY和LINK层必须配置为相同的值。
7)在LVDS接口模式下,CALENDAR_LEN,CALENDAR_M的乘积必须不小于16,以便区分状态信息和训练序列。
图11.日历长度和重复次数都为4的数据传输示意图
以下为几种日历序列配置的例子:
1)单个OC-192或10Gbps以太通道:
CALENDAR_LEN=1,CALENDAR[1]=1;
2)四个OC-48通道:
CALENDAR_LEN=1,CALENDAR[i]=1,2,3,4;
3)两个OC-48通道,八个OC-12通道(通道3至10),CALENDAR_LEN=16,CALENDAR[i]=1,2,3,4,1,2,5,6,1,2,7,8,1,2,9,10,另外一种可行的方法为:
CALENDAR[i]=1,3,2,4,1,5,2,6,1,7,2,8,1,9,2,10;
4)10个1Gbps以太端口