引言
串行RapidIO(SRIO)是针对嵌入式系统内部高速互连应用而设计的,数据打包效率高、传输时延小、协议及流控机制简单、纠错重传机制和协议栈易于用硬件实现,降低了软件复杂度,支持多种物理层技术和传输模式,易于扩展。SRIO引脚少、成本低,便于器件之间的互连。表1列出10G级互连技术的比较。
通过比较可以看出,SRIO可以满足高性能嵌入式系统芯片间及板间互连对带宽、成本、灵活性和可靠性越来越高的要求。本文介绍基于SRIO交换芯片CPS1432的高速处理系统,从总体设计、硬件设计和软件设计3个方面介绍RapidIO互连技术方案。
1 系统设计
RapidIO网络主要由终端器件(End Point)和交换器件(Switch)组成。在本方案中终端器件采用P2020型CPU,运行嵌入式Linux系统,交换器件采用CPS1432,两者组成星型拓扑结构。总体设计方案如图1所示。
表1 10G级互连技术比较
图1 总体设计方案
SRIO物理层支持全双工传输和1x、2x及4x三种连接方式,采用8/10 b编码,为了提高系统的吞吐量,本方案采用4x方式连接,理论带宽可达到10 Gbps。整个系统的终端器件中有且只有一个ID为0的主设备,其他终端器件都是从设备。在系统初始化过程中,主设备对各个从设备进行枚举,并为从设备分配一个非0的ID,这些ID类似于以太网中的MAC地址。在枚举过程中,通过发送维护包,对交换器件CPS1432的各个端口进行设置,建立各个端口与终端器件的对应关系,初始化交换芯片各个端口的路由表。当整个系统枚举完成后,终端器件发送包含目的ID的数据包,即可通过CPS1432转发到目的终端器件的对应端口,从而实现互连互通。
2 硬件方案设计
2.1 硬件设计
P2020是飞思卡尔公司的高性能双核通信处理器,基于45 nm工艺,采用e500 Power Architecture核心,主频可达1.2 GHz,对应的单核器件为P2010。两者均集成了丰富的接口,包括SerDes、千兆以太网、PCIExpress、RapidIO以及USB等。内部4个SerDes通道可在2个SRIO端口、3个PCIExpress端口以及2个SGMII端口之间进行分配,P2020内部功能单元如图2所示。
图2 P2020内部功能单元
P2020内部集成了符合RapidIO Interconnect Specification1.2版本规范的RapidIO控制器,控制器由RapidIO端口和RapidIO消息单元(RMU)组成。P2020的2个SRIO端口都支持1x或4x的物理链路,单条SerDes链路最大支持3.125 Gbps的波特率,4x端口理论峰值带宽为10 Gbps。消息传递单元支持2个数据消息发送控制器(outbound message controller)、2个数据消息接收控制器(inbound message controller)、1个门铃消息发送控制器(outbound doorbell controller)、1个门铃消息接收控制器(inbound doorbell controller)以及1个端口写接收控制器(inbound portwrite controller)。消息传递单元支持3种操作模式:直接模式(Direct model)、队列模式(Chaining model)和多播模式(Multicast model)。支持硬件的错误检查和重发机制,减轻了CPU的负担。
CPS1432是IDT公司的RapidIO交换芯片,基于RapidIO 2.1规范(向下兼容),共有32路串行通道,可以灵活配置为8个4x,14个2x,14个1x的端口工作方式,端口速率最大支持到6.25 Gbps,芯片内部交换带宽达到160 Gbps,广泛地应用于板内及板间芯片的RapidIO互连。该芯片支持上电配置引脚来进行配置,也可以通过SRIO、I2C总线或JTAG接口直接操作内部寄存器,同时I2C总线接口支持主模式,可从外部I2C EPROM中直接读取配置数据,其接口单元如图3所示。
图3 CPS1432接口单元
为了便于配置不同的模式,本系统将P2020和CPS1432的配置引脚都引入了FPGA,CPS1432的I2C总线接口连接到板载CPU的I2C总线接口上,由CPU进行内部寄存器的读写控制。上电复位时,通过P2020的配置引脚cfg_IO_ports[0:3]将4个SerDes通道配置为一个4x的SRIO端口,速率3.125 Gbps,根据芯片要求,Serdes参考时钟应选择125 MHz。通过CPS1432的配置引脚QCFG[7:0]和SPD[2:0]将32路串行链路配置为8个4x的SRIO端口,速率均为3.125 Gbps。
2.2 注意事项
在电路设计上,由于SRIO引脚数量少,互连相对简单。收发信号之间采用交流耦合方式,在数据接收端串接0.1 μF的去耦电容,如图4所示。电容推荐采用0402封装,布局上靠近芯片接收端引脚放置,且4个通道的耦合电容与芯片引脚之间的走线等长。
图4 去耦电容靠近接收端
在PCB设计方面,基于信号完整性的考虑,需注意以下几点:
① 对于常用的FR4板材,要注意叠层和走线的线宽,满足差分阻抗100 Ω;
② 差分线对内要求严格等长,由于SRIO收发信号独立,对于2x或4x的链路,收发各自的差分对之间也要做等长处理(本系统要求相差10 mil以内);
③ 尽量全直线走线,需要弯折的地方,采用圆弧转折;
④ 使用中间层走线,避免顶层和底层,且走线外围做包地处理;
⑤ 尽量不要超过3个过孔(不包括BGA发送端的扇出过孔),信号换层时,要在换层的过孔两侧添加用于回流的地孔。
图5是本系统中的CPS1432芯片外围的局部走线图。
图5 PCB局部走线图
本系统中的P2020和CPS1432分别处在两块板卡上,采用了ERNI公司的ZD高速连接器进行板间互连。由于走线经过背板传输,长度较长,芯片的发送端信号需满足协议中规定的长距离传输(Long Run)指标。考虑到信号由芯片传输至连接器或通过背板传输引起的衰减,实际使用中需采用传输预加重和接收器均衡的技术,具体参数都可通过芯片寄存器来设置和调整。
3 软件方案设计
本方案中的SRIO逻辑层业务采用消息传递方式,借助Linux中RIO子系统将SRIO端口虚拟为一个以太网口,采用类似于以太网的传输方式,这种方式不要求主设备知道被访问设备的存储器状况。
3.1 Linux下RIO系统
本系统中的嵌入式Linux版本为3.0.48,内核中RIO子系统已经完成RapidIO协议的解析、封装、枚举和规范实现等工作,子系统总体设计是按照设备驱动模型的方式提供的,核心思想是一个三角关系:总线、设备和驱动。其中总线rio_bus在文件rio_driver.c中实现,在配置内核时如果选中该总线,系统运行后该总线即会存在,总线屏蔽了大量RapidIO技术细节。
基于类似网口的RapidIO驱动是在rionet.c文件中提供的,该驱动在总线rio_bus上注册成功后,使用rio_register_driver函数注册到内核中,而一旦有设备与该驱动匹配成功,该驱动会使用register_netde向Linux系统中注册一个网口设备。
RIO系统中关于设备的文件是rio.c、rio_scan.c,其中rio.c完成RapidIO控制器的注册,rio_scan.c完成枚举算法、拓扑扫描和交换器件信息处理等工作,并最终调用rio_add_device函数向RIO总线注册一个设备。RIO总线中设备和驱动的匹配规则是ID匹配,即所注册的RapidIO控制器ID与系统中RapdidIO驱动支持的ID一致,则RIO系统会自动虚拟生成一个网口设备。
3.2 端点软件
RIO子系统是Linux内核提供的,RapidIO控制器的设备描述与CPU硬件资源相关,包括中断、邮箱、门铃、端口号、名称等资源信息。端点控制器初始化由内核中飞思卡尔提供的fsl_rio.c文件实现,主要完成端口和寄存器配置,以及维护事务窗口、读写事务呼入/呼出窗口和呼出门铃窗口的配置,然后填充一个mport数据结构,并最终将其注册为一个控制器RIO设备。
3.3 交换器件
在枚举过程中采用深度探测算法,即先读取CPS1432总端口数M,然后依次从0开始(除去自身连接到CPS1432的端口)进行连接状态的读取,一旦发现有设备连接,即先为设备分配一个非0的ID,并设置该设备与CPS1432相连的端口路由表,主要是写入CPS1432的全局查找表,该表用于描述ID与端口的对应关系。系统运行后,对于包含有该设备ID号的数据包,CPS1432即可将其转发到对应的端口。
3.4 系统使用
在uboot中设定传入内核的参数riohdid,对主设备将其值设定为0,对从设备设定为0xFF。系统完成枚举过程后,即可在各端点看到一个SRIO网口设备,设置同一网段的IP地址,各端点之间可以互相ping通,也可以相互发送网络包,从而实现互连互通。
结语
本方案实际使用中可以将每个端点和交换芯片都各自独立成一个板卡,最后插到一个嵌入式机框中实现板到板高速互连通信。该方案在某通信设备上得到实现,运行良好,平均无故障时间达到预期要求,验证了设计的正确性。