基于SRIO交换芯片的DSP接口设计
2019-08-27李静静
李静静 张 楠
(西安电子工程研究所 西安 710100)
0 引言
随着高速信号处理器和嵌入式信号处理系统的快速发展,信号处理芯片与芯片之间、板卡与板卡之间的数据通信量越来越大,对传输速率和带宽的要求也越来越高,因此构建高速可靠的交换网络也势必成为必然。在目前通用的DSP+FPGA架构的信号处理平台上,SRIO作为完全的点对点拓扑结构的标准协议,非常适合用于构建板内及板间的交换网络[1]。
CPS1848是美国IDT公司推出的第二代RapidIO交换芯片,符合RapidIO 2.1规范,具有18个端口(Port),对外提供48路全双工高速串行通道(Lane),峰值吞吐量可达240Gbps,是目前较先进的RapidIO交换芯片[2]。CPS1848每个端口都可以灵活配置成1x、2x、4x三种模式,端口速率支持1.25Gbps、2.5Gbps、3.125Gbps、5.0Gbps、6.25Gbps 5种模式,而且芯片支持远距离传输,是板间互连的理想选择[3]。
TMS320C6678是TI公司推出的单片8核DSP芯片,整个芯片提供320G MAC定点计算或者160G FLOP浮点计算能力,提供多种多核之间的信息和数据交换方式,如EDMA、MessageQ Queue和QMSS等,具有高速运算能力的同时集成了多种对外数据交换接口,是目前应用较为广泛的信号处理芯片[4]。本文基于某“双DSP板+FPGA板”信号处理平台,研究了基于SRIO交换芯片的DSP接口设计。
1 接口设计
本节以某“双DSP板+FPGA板”信号处理平台为例,给出了DSP处理器SRIO接口的基本配置方法,并提供了DSP端对SRIO交换芯片的路由配置方法。
“双DSP板+FPGA板”信号处理平台架构框图如图1所示,该平台主要由3片DSP处理器TMS320C6678、1片SRIO交换芯片CPS1848和1片FPGA处理器组成。其中DSP0主要用作控制处理,与板内FPGA的通信采用SRIO直连,而DSP1、DSP2、FPGA用作运算处理,通过交换芯片CPS1848实现双DSP板内两片DSP之间的SRIO互连,以及双DSP板与FPGA板间的SRIO互连。
鉴于DSP编程方便快捷且有成熟稳定的维护包(Maintenance Package),DSP端在配置与维护自身SRIO接口的同时,也提供了对CPS1848的配置与维护,而FPGA端则可保持原来的SRIO直连配置不变。
图1 信号处理平台架构框图
1.1 基本配置
通过CPS1848进行SRIO互连的DSP芯片,其接口的基本配置与片间直连有诸多相同的地方,在此不再赘述。由于桥接到了交换芯片上,DSP端SRIO接口的设计必须参考CPS1848的配置约束,这里重点对端口速率、通道模式以及设备ID号三方面进行说明。
首先是SRIO的端口速率。TMS320C6678的端口速率原本有1.25Gbps、2.5Gbps、3.125Gbps、5.0Gbps 4种模式可选[5],由于SRIO链路两端节点的工作速率必须相匹配,因此DSP端需要考虑CPS1848的配置速率。CPS1848的初始工作速率由管脚Speed Select(SPD[2:0])决定,具体设置如表1所示。本平台的硬件板卡在设计成型时,管脚的配置电阻就已经决定了端口的初始速率,虽然可以通过软件代码修改端口速率,但如果没有特殊需求,建议用户还是采用默认的配置速率。
表1 CPS1848端口速率配置表
Value on the Pins (SPD2,SPD1,SPD0)Port Rate (Gbaud)0001.250012.501X5.0100Reserved1013.12511X6.25
其次是SRIO的通道模式。与端口速率类似,SRIO通道模式的配置也与硬件板卡的设计相关。以本平台为例,DSP端SRIO的4个Lane都连接到了CPS1848上,原则上来说通道模式在1x、2x、4x中可选,但是以4x模式速率最优,因此建议用户把SRIO的通道模式配置成4x模式。
最后需要重点说明一下设备ID号的配置。设备ID号是SRIO收发数据时的重要参数,可使用16位数字ID或8位数字ID表示,但要求每个设备ID号不能重复。以本平台为例,3片DSP、1片FPGA、1片CPS1848共5个器件,需要配置5个不同的设备ID号,注意CPS1848需要占用一个设备ID号。由于CPS1848的路由表配置与设备ID号相关,而路由表配置是有一定参照约束的,具体约束要求如表2所示,因此桥接到CPS1848上的DSP1、DSP2、FPGA三个设备ID号不能随意设置,需要满足表2的约束要求。
表2 CPS1848路由参照约束表
Port Value RangeReference ToAllowed in Device Route TableAllowed in Domain Route Table0x00-0x11Port NumbersYesYes0x12-0x3FReservedNoNo0x40-0x67(0x40+Mask Index)Multicast MaskYesNo0x68-0xDCReservedNoNo0xDDForce LocalNoYes0xDEDefault RouteYesYes0xDFNo RouteYesYes0xE0-FFReservedNoNo
1.2 路由配置
前文提到过,CPS1848的配置是在DSP端通过Maintenance包对CPS1848寄存器进行操作实现。DSP在配置路由表之前需要先对CPS1848进行初始化配置,主要包括以下步骤:
1)配置超时寄存器Timeout Control CSR(地址0x000120);
2)配置端口使能寄存器Port {1…17} Control 1 CSR(地址0x00015C + 0x20*port_num);
3)配置端口状态寄存器Port {1…17} Error and Status CSR(地址0x000158 + 0x20*port_num)。
初始化配置完成后,DSP对路由表的配置主要是通过对Standard Route Table Entries Configuration destID Select CSR寄存器(地址0x000070)和Standard Route Table Entry Configuration Port Select CSR寄存器(地址0x000074)的配置实现的。其中,前者对应与CPS1848连接的每个芯片的设备ID号,后者则对应每个芯片与CPS1848连接通道所映射的端口号。
CPS1848内部端口分为4个象限(Quadrant),端口宽度由管脚Quadrant Config(QCFG[7:0])决定。其中端口0、4、8、12、16属于Quadrant0,端口宽度由QCFG[1:0]决定;端口1、5、9、13、17属于Quadrant1,端口宽度由QCFG[3:2]决定;端口2、6、10、14属于Quadrant2,端口宽度由QCFG[5:4]决定;端口3、7、11、15属于Quadrant3,端口宽度由QCFG[7:6]决定。文献[2]给出了CPS1848端口的具体配置,通过查表可获得通道(Lane)与端口(Port)的映射关系。
以本平台为例,CPS1848的QCFG[7:0]默认配置为0,而DSP1、DSP2、FPGA配置的通道模式均为4x模式,那么通道与端口号之间就是以4个Lane为间隔进行映射。比如,DSP1连接到CPS1848的Lane 16-19,那么它对应到端口号就是Port 4,以此类推可获得DSP2和FPGA的端口号。确认完各个芯片所连接的端口号后,DSP通过Maintenance包把对应的设备ID号和端口号写入CPS1848相应的寄存器,即可完成路由表的配置。
2 链路维护
基于DSP的编程优点,在DSP端对SRIO链路进行维护是非常便捷有效的方法。本节给出了一种SRIO链路的维护方法,以实现数据的可靠传输。
在正常情况下,硬件板卡上电后,SRIO链路完成初始化配置,各节点间就可以进行正常的数据传输。SRIO一次数据传输流程为:发送端产生一个请求包给接收端,接收端收到后返还一个响应包给发送端。图3给出了典型的请求包和响应包的格式,包结构中各段及含义分别是:
1)AckID:表示包的序列号ID;
2)Prio:表示包的优先级;
3)TT:指定Device ID是用8 bit或16 bit表示;
4)Ftype:表示包的类型;
5)Target ID:表示包的目的地址ID;
6)Source ID:表示包的源地址ID;
7)CRC:包结构的校验保护。
图2 SRIO请求包和响应包格式
在正常的数据传输中,我们一般只需指定发送包的类型、Device ID、源地址和目的地址,而作为物理层字段的AckID字符,由于它的初始值为0,且以増序循环赋值的方式被添加到数据包头部,在链路无异常时不存在失配的情况。然而当SRIO链路断开重连接或者某节点重启后,各节点的AckID未必能继续保持一致,此时若不重新匹配AckID就会导致后续传输数据失败。
理论上来说,链路某节点AckID的重匹配可以通过修改自身节点的AckID或者修改对端节点的AckID两种方法实现。以本平台为例进行说明,DSP1、DSP2、FPGA通过CPS1848的3个端口实现SRIO的互连,DSP1、DSP2和FPGA自身各有AckID,这里称之为Local AckID,对应CPS1848的3个端口上各有AckID,这里称之为Remote AckID。前文曾提到CPS1848的配置与维护主要是由DSP实现,因此各节点AckID的重匹配也是由DSP完成。
当DSP检测到链路异常时,AckID的重匹配有两种选择:一种是DSP向CPS1848发送一个“restart-from-error”命令,获得其对应端口的Remote AckID,然后用Remote AckID修正自身的Local AckID,从而使链路两端的AckID匹配;另一种是DSP把自身的Local AckID重置为0,然后通过Maintenance包把数值0x81000000写入端口AckID控制寄存器(地址0x000148 + 0x20*port_num),使对应端口的Remote AckID重置为0,从而使链路两端的AckID匹配。
而当FPGA检测到链路异常时,由于FPGA并不对CPS1848操作,只能通过DSP进行AckID重匹配,此时DSP只剩下修改CPS1848端口AckID一种方法。具体实现过程为:DSP给FPGA一个复位信号,FPGA复位自身的SRIO模块,与此同时FPGA的Local AckID重置为0,然后DSP通过Maintenance包把数值0x81000000写入FPGA对应的端口AckID控制寄存器,重置对应端口的Remote AckID,从而完成FPGA端AckID的重匹配。
我们可以通过DSP访问CPS1848寄存器来实时获取SRIO的链路信息。比如:Port{1…17} Error and Status CSR寄存器(地址0x000158 + 0x20*port_num),可实时监测端口状态;Lane{1…17}Status CSR寄存器(地址0x002010 + 0x20*lane_num),可实时监测通道状态。此外,CPS1848还对用户提供了错误事件历史记录、包计数器和诊断计数器。当链路存在异常时,我们可以访问相关寄存器获知Error信息,从而快速有效地定位出链路问题来源。
3 结束语
基于SRIO交换网络的信号处理平台是现代信号处理系统发展的重要趋势之一。本文提出的基于SRIO交换芯片的DSP接口设计方法,实现了多片DSP与FPGA之间大量数据实时、高效、可靠地传输,同时提出的SRIO链路维护及监测方法,也极大保障了传输链路的可靠性和稳定性。