接口/总线/驱动
SPI4.2总线(System Packet Interface,系统间数据包接口)是一种速度高达10 Gb/s的芯片间互连总线,主要应用于ATM信元传输、POS(Packet Over SONET/SDH,基于SONET/SDH的包传输)和10 Gb/s以太网等高端场合。特别在通信领域,很多高端处理器和网络处理器,如Intel公司的IXP2800、Cavium公司的多内核处理器CN58xx系列、NetLogic公司的XLR732、Broadcom的BCM1480,几乎都集成了SPI4.2接口,以提高芯片的吞吐能力,适应通信产业朝着LTE(长期演进)发展的需求。还有众多的物理层芯片,例如Cortina公司的CS1331,可以将SPI4.2总线转换成8个千兆以太网接口。SPI4.2总线之所以被众多的高端芯片所采用,与其高速、灵活、可靠的特性是密不可分的。
SPI4.2总线是一种芯片间的互连总线,连接芯片的链路层和物理层模块。其工作时钟是源同步双边沿触发时钟,至少为311 MHz。图1是使用SPI4.2总线连接两个芯片的示意图。可见,SPI4.2总线的信号在发送和接收方向完全对称而又互相独立,数据链路和状态链路分开,并且其时钟也是完全分开的。因此,该总线不仅适合于双向通道,而且适合于只收不发或者只发不收的单向通道。
图1 SPI4.2连接示意图
SPI4.2总线具有以下特点:
① 点对点互连,收发数据链路宽度为16位。
② 发送和接收模块的信号各分为两组,即数据信号和状态信号,分别对应数据链路和状态链路,每个链路具有自己的时钟。数据链路发送和接收数据,状态链路传输相应链路的状态信息。
③ 数据链路包含DCLK、DAT[15:0]和CTL三种LVDS(低压差分传输)信号。前面加“T”表示信号属于发送模块,加“R”表示信号属于接收模块。以发送模块为例,TDCLK是双边沿触发时钟,TCTL是控制信号,TDAT[15:0]承载了数据和控制信息。当TCTL为高电平时,TDAT[15:0]传送的是数据包;当TCTL为低电平时,TDAT[15:0]传送的是控制包。数据采用DIP4校验交织码。
④ 状态链路包括SCLK时钟信号和STAT[1:0]状态信号,信号类型是LVTTL或LVDS。SPI4.2 发送时序如图2所示。如果选择LVTTL,则SCLK时钟频率是数据链路时钟速率的1/4。如果选择LVDS,则SCLK时钟频率和数据链路时钟频率相同。下文中均以LVDS为例进行阐述。状态链路主要用于流控。
⑤ 接收和发送模块都含有一个FIFO队列,用于缓存数据,队列长度由芯片设计而定。队列的状态信息通过状态链路周期性地发送,接收模块和发送模块的状态信息是独立的。状态信息附加了DIP2交织校验码,以提高传输可靠性。
图2 SPI4.2 发送时序
除了数据包中最后一段不满16字节的数据(EOP)之外,SPI4.2总线的数据实行突发传输,以16字节为单位(称为一个数据块),每次传输多个数据块。因为数据宽度是16位,所以一次突发传输至少需要4个时钟周期。数据的高地址位字节先发送(MSB),低地址位字节后发送,数据块传输过程中不会被中断。每次突发传输的间隔期间传送控制包或者训练序列。图2中,TDAT表示数据块,TCTRL表示控制块。控制包长度为16位,包含了前次传输和下次传输的状态信息:包开始标志、包结束标志、逻辑端口地址和DIP4交织校验码等。数据链路遵循有限状态机进行工作,状态包括5种:控制包传输、数据包传输、空闲包传输、训练序列传输以及训练序列控制[1]。
因为状态链路的宽度是2位,所以每次突发传输至少传输16位数据(4个时钟周期)。反映FIFO队列的状态信息有3种:饱(Satisfied)、饿(Hungry)、极饿(Starving),分别对应二进制数字10、01和00。11表示链路处于失步状态,正在同步过程中。当状态是“饱”时,说明队列几乎满了,只接收当前正在传送的数据包,其他数据包只有等状态更新后才能接收。当状态是“饿”时,可以接收最大MaxBurst2个数据块。当状态是“极饿”时,说明队列几乎空了,可以接收最大MaxBurst1个数据块。MaxBurst1和MaxBurst2是SPI4.2总线初始化时设定的参数,MaxBurst1不得小于MaxBurst2。
SPI4.2总线初始化时必须设定一些基本参数,如表1所列。
SPI4.2总线协议定义了一个叫“日历”的数据结构CALENDAR[i](i=1,…,CALENDAR_LEN)。CALENDAR_LEN(日历长度)参数规定了逻辑端口(或称为虚拟通道)的数目,该数值不能小于实际的逻辑端口数目。例如,如果SPI4.2总线用于10 Gb/s以太网口,那么日历长度是1(即CALENDAR_LEN = 1);如果SPI4.2总线用于10个1 Gb/s以太网口,那么日历长度是10(CALENDAR_LEN = 10),CALENDAR[i] = 1,2,…,10,代表了10个以太网端口。CALENDAR[i]中承载的数据被周而复始地依次传输,重复次数是CALENDAR_M次。图3为日历长度和重复次数都是4的数据传输示意图。SPI4.2总线被初始化时,必须确保接口两端的CALENDAR_LEN和CALENDAR_M分别相等。从这个角度看,SPI4.2是一种时分复用的总线:总带宽是固定的,“日历”数据结构决定了带宽和逻辑端口的分配。
当SPI4.2正常工作时,数据和状态链路会不定期地发送训练序列。在数据链路,训练序列至少应该在DATA_MAX_T个时钟周期内发送一次。在状态链路,训练序列至少应该在FIFO_MAX_T个时钟周期内发送一次。设置DATA_MAX_T或FIFO_MAX_T为0将取消各自链路的训练序列,一般情况下不推荐这种设置。
图4以XLR732为参照描述了SPI4.2总线的收发同步过程。启动之后,在发送方向,发送模块(TX)通过数据链路发送连续的训练序列,对端的接收模块成功收到训练序列后,会设置本端的接收同步标志;然后通过状态链路发送训练序列给对端,一旦发送模块成功接收到训练序列后,就设置本端的发送同步标志。
在接收方,接收模块(RX)在数据链路成功接收到对端发送的训练序列后,会设置本端的接收同步标志;然后通过状态链路发送训练序列,一旦发送模块成功接收到训练序列后,就设置本端的发送同步标志。在同步过程中,训练序列由指定的连续的DIP4码字组成。发送模块必须连续发送训练序列,直到本端的状态链路收到有效信息。同时,接收模块忽视所有接收到的数据,直到观察到训练序列,获得数据同步。一旦数据链路同步之后, FIFO队列状态信息就开始传送。
如果发送方接收到有效的状态信息,它就可以开始进行数据突发传输。如果在工作过程中,由于某些原因(例如一端器件掉电或重启)导致总线失步,那么为了再次获得同步,双方需要按照上述过程发送连续的训练序列,直到建立同步为止。
表1 SPI4.2初始化基本参数
图3 日历长度和重复次数都为4的数据传输示意图
图4 收发同步过程示意图
SPI4.2总线接口的调试包括两个重要步骤:链路的同步和数据的正常收发。
在调试链路同步时,首先必须查看总线两端的初始化参数配置。因为SPI4.2 总线协议是一个对等端数据传输协议,所以大部分参数需要双方的匹配和协商,特别是接收方和发送方的CALENDAR_LEN和CALENDAR_M参数。
如何查看同步呢?芯片通常会提供一个状态寄存器来反映总线的同步。“接收同步标志”只能说明在数据链路上成功接收到对端的训练序列,但不能保证接收的状态链路是正常的,如果需要确认可查看对端的“发送同步标志”。在收发双向通道应用中,只有两端的“接收同步标志”和“发送同步标志”都置位了,总线才算同步。此时,可以确认总线两端的物理连接是正确的,握手成功。
如果不能同步,就必须检查两端的“接收同步标志”和“发送同步标志”,判断是哪一端出了问题。检查是否有DIP4和DIP2错误,如果有此类错误,说明链路上信号质量可能不佳,可以用示波器测量信号波形。如果信号质量确实不好,可以通过提高信号驱动能力或者调整硬件匹配阻抗来优化。
如果两端的接收和发送都没有同步,就必须测量芯片的电压、工作频率、重启等信号。如果两端的“接收同步标志”和“发送同步标志”都已经置位,说明双方的接收和发送都同步,可以正常收发数据了。在大流量数据传输过程中,最相关的是FIFO队列的参数配置,配置不当会导致错包或丢包。以NetLogic公司的XLR732网络处理器为例[2],SPI4.2总线的发送模块的所有逻辑端口共享一个FIFO队列,宽度为16字节,长度为128;接收模块的所有逻辑端口共享一个FIFO队列,宽度为16字节,长度为512。每个逻辑端口所占用的队列地址和大小都可以通过寄存器配置。
假如某个端口接收端队列的长度是48,MaxBurst1是12,MaxBurst2是8。那么当该模块接收数据时,如果由于某些原因(例如软件来不及处理),接收队列只剩下12个空位,也就是接收队列已经有48-12=36个空位被占用时,它将通过状态链路向对端发送“饿”的状态信号(反压信号)。对端收到该信号后实施流控策略,根据本端发送端的MaxBurst1设置值发送数据,该值表示接收到“饿”状态信号后最多还可以发送的数据块数目。所以接收端的MaxBurst1 的值一定要大于对端发送端的MaxBurst1,并且要留出一定的余量,因为数据在链路上的传输也是需要时间的。同理,接收端的MaxBurst2要大于对端发送端的MaxBurst2。值得注意的是,流控是基于逻辑端口的,而不是整条链路。
为保证不发生接收端FIFO队列溢出等问题,尽量将接收端的MaxBurst1和MaxBurst2设置大一些, 只要小于FIFO入口总数就可以,而发送端MaxBurst1和MaxBurst2的 设置不要超过本端接收能力。
如果出现EOP(结束包)和SOP(起始包)错误或缺失,或者其他错包(例如包长变短、帧校验错误等),但没有DIP4 错误,该怎么办?这类问题一般出现在FIFO队列设置上,尤其是接收端的FIFO队列可能溢出,从而丢失了某些数据块,可以通过以下3种方法来检测和解决:
① 通过查看接收端FIFO溢出标志来判断FIFO队列是否溢出;
② 通过调整接收端的MaxBurst1和MaxBurst2来防止FIFO队列溢出;
③ 如果方法②的调整足够大,还有此问题,可以查看对端是否收到反压信号,以及对端的状态等。
为了方便,通常将发送端的MaxBurst1和MaxBurst2设置为相同数值,将接收端的MaxBurst1和MaxBurst2也设置成相同数值。
随着处理器的速度越来越快,处理器集成的内核越来越多,处理器与外围器件之间,处理器之间,以及外围器件之间的连接速度逐渐成为制约平台性能的瓶颈。许多芯片同时集成了多个总线接口,例如XLR732同时拥有SPI4.2、HT、以太网3种总线接口。SPI4.2总线在与其他总线的竞争中体现出了强大的生命力,希望本文所介绍的经验对正在应用或计划应用SPI4.2总线的同行有所帮助。
全部0条评论
快来发表一下你的评论吧 !