第3章SRIO

RapidIO是一种通用、高带宽、低引脚数、基于数据包交换的系统级互连体系结构的一种开放式互连技术标准。它主要用作系统内部接口,用于以每秒千兆字节的性能水平进行芯片到芯片及板到板通信。KeyStone器件中使用的RapidIO外围设备称为串行RapidIO(Serial RapidIO,SRIO)。
SRIO接口支持4通道SRIO 2.1规范,每通道支持1.25/2.5/3.125/5Gb/s波特率传输。PCIE Gen2单个接口支持1通道或两通道,每通道最高可支持5Gb/s波特率。
SRIO端口在C6678器件上是一个高性能、接口数量少的内部连接方式。在一个基带板内部使用RapidIO进行连接设计,可以创建一个对等的互连环境,在部件间提供更多的连接和控制,性能可达GB/s。RapidIO基于处理器总线中存储器和器件寻址概念,事务处理完全由硬件管理。采用RapidIO互连不仅可以降低系统成本,还可以降低潜在风险,减小包数据处理的间接消耗并提供更高的系统带宽。
这种体系结构可以用于连接微处理器、内存和内存映射的I/O器件,通常应用于网络设备、内存子系统和通用处理系统。
RapidIO的主要特点包括: 
(1) 灵活的系统架构,允许点对点通信。
(2) 具有错误检测功能、强大的通信能力。
(3) 频率和端口宽度可扩展性。
(4) 非软件密集型操作。
(5) 高带宽互连,低开销。
(6) 引脚数少。
(7) 低功率。
(8) 低延迟。
3.1SRIO介绍
RapidIO体系架构和RapidIO互连结构分别如图3.1和图3.2所示。



图3.1RapidIO体系架构




图3.2RapidIO互连结构



SRIO中的RapidIO外部设备要求: SRIO为所有符合RapidIO物理层1×/4×LP系列规范V1.2的设备提供无缝接口。这包括多个供应商提供的ASIC、微处理器、DSP和交叉开关网络(Switch Fabric)设备。
SRIO的驱动库在ti\pdk_C6678_x_x_x_x\packages\ti\drv\srio目录下,相关文档在docs目录,例程在example目录下。




SRIO的编程示例程序基于寄存器层CSL(芯片支持层)。大多数代码使用如下定义的SRIO寄存器指针: 

#include <ti/csl/cslr_srio.h>

#include <ti/csl/cslr_device.h>

CSL_SrioRegs * srioRegs = (CSL_SrioRegs *)CSL_SRIO_CONFIG_REGS;

3.1.1物理层1×/4×LP系列规范

目前,RapidIO行业协会认可两种物理层规范: 8/16 LPLVDS和1×/4×LP系列。8/16 LPLVDS规范是一个点对点同步时钟源DDR接口。1×/4×LP串行规格是一个点对点、交流耦合、时钟恢复的接口。两个物理层规格不兼容。

SRIO符合1×/4×LP系列规范。SRIO中的
SerDes(Serializer/Deserializer)技术也与该规范一致。
RapidIO物理层1×/4×LP串行规范目前涵盖四个频点: 1.25Gb/s、2.5Gb/s、3.125Gb/s和5Gb/s。这定义了每个I/O信号差分对的总带宽。由于8位/10位编码开销,每个差分对的有效数据带宽分别为1.0Gb/s、2.0Gb/s、2.5Gb/s和4Gb/s。
SRIO物理层结构如图3.3所示。


图3.3SRIO物理层结构


1. 1×和4×连接
SRIO物理层1×/4×互连结构如图3.4所示。SRIO设备引脚采用高速差分信号接收数据。
一个设备的每条正传输数据线(TDx)都连到另一个设备上对应编号的正接收数据线。
同样,每条负传输数据线(TDx)连接到一个对应编号的负接收数据线
(RDx)。图3.4中RD为接收数据线(
Receive Data Line)的简写,TD为传输数据线(
Tranceive Data)的缩写。


图3.4SRIO 1×和4×互连结构


2. SRIO引脚
SRIO设备引脚是基于电流模式逻辑(CurrentMode Logic,CML)开关电平的高速差分信号。发送和接收缓冲区独立于时钟恢复块中。参考时钟输入未合并到SerDes宏中。它使用了一个差分输入缓冲器,与晶体振荡器制造商提供的LVDS和LVPECL接口兼容。表3.1描述了SRIO外围设备的引脚。


表3.1SRIO外围设备的引脚


引脚名引脚数信号方向描述


RIOTX3/
RIOTX32Output发送数据差分点对点单向总线。将数据包数据发送到接收设备的Rx引脚,用于1个4×设备中的最高有效位,也可用于4个1×设备
RIOTX2/
RIOTX22Output发送数据差分点对点单向总线。将数据包数据发送到接收设备的Rx引脚,
用于4个1×设备和1个4×设备的位
RIOTX1/
RIOTX12Output发送数据差分点对点单向总线。将数据包数据发送到接收设备的Rx引脚,
用于4个1×设备和1个4×设备的位
RIOTX0/
RIOTX02Output发送数据差分点对点单向总线。将数据包数据发送到接收设备的Rx引脚,
用于1个1×设备、4个1×设备和1个4×设备的位
RIORX3/
RIORX32Input接收数据差分点对点单向总线。接收发送设备的Tx引脚的数据包数据。1个4×设备中的最高有效位,也可用于4个1×设备
RIORX2/
RIORX22Input接收数据差分点对点单向总线。接收发送设备的Tx引脚的数据包数据,用于4个1×设备和1个4×设备的位
RIORX1/
RIORX12Input接收数据差分点对点单向总线。接收发送设备的Tx引脚的数据包数据,用于4个1×设备和1个4×设备的位
RIORX0/
RIORX02Input接收数据差分点对点单向总线。接收发送设备Rx引脚的数据包数据。用于1个1×设备、4个1×设备和1个4×设备的位
RIOCLK/
RIOCLK2Input外围时钟恢复电路的参考时钟输入缓冲器

3. RapidIO支持的功能
(1) 符合RapidIO互连规范REV2.1.1。
(2) 符合LP系列规范REV2.1.1。
(3) 4×串行RapidIO: 
 1×端口,可选操作(4)个1×端口; 
 2×端口,可选操作(2)个2×端口; 
 2×端口和1×端口操作,可选(1)个2×端口和(2)个1×端口; 
 4×端口,(1)个4×端口。
(4) TI SerDes集成时钟恢复。
(5) 能够以不同波特率运行不同端口(仅支持整数倍速率,即支持2.5Gb/s和5Gb/s,不支持3.125Gb/s和5Gb/s)。
(6) 硬件错误处理,包括CRC。
(7) 支持1.25Gb/s、2.5Gb/s、3.125Gb/s和5Gb/s的波特率。
(8) 未使用端口的电源关闭选项。
(9) Read、Write、Write w/response、Streaming Write、输出原子化(Outgoing Atomic)、维护(Maintenance)操作。
(10) 中断生成到CPU(门铃包和内部调度)。
(11) 支持8位和16位 DeviceID。
(12) 支持接收34位地址。
(13) 支持生成34位、50位和66位地址。
(14) 支持数据大小: 字节、半字、字、双字。
(15) 定义为大端(Big Endian)。
(16) DirectIO传输。
(17) 消息传递传输。
(18) 数据有效负载达到256字节。
(19) 单个消息生成最多16个数据包。
(20) 弹性存储FIFO,用于时钟域切换。
(21) 支持短线传输(Short Run: 低功耗,板内或短的背板连接)和长线传输(Long Run: 最低50cm和两个及以上连接器),AC驱动特性不一样。
(22) 支持错误管理扩展。

(23) 支持拥塞控制扩展。
(24) 支持组播(Multicast ID)。
(25) 支持短控制符号和长控制符号。
(26) 支持 IDLE1和IDLE2。
(27) 基于优先级和CRF的协议单元之间的严格优先级段交织。
不支持以下功能。
(1) 符合 Global Shared Memory Specification(GSM规范)。
(2) 8/16 LPLVDS兼容。
(3) 目的地(Destination)支持RapidIO原子操作。
3.1.2SRIO外围数据流
该外围设备是一个外部驱动的从模块,能够作为DSP芯片内的主设备。这意味着外部设备可以根据需要将(突发写入)数据推送到DSP,而不必向CPU生成中断或不依赖于DSP EDMA。这有几个好处: 减少了中断的总数,减少了与只读外围设备相关联的握手(延迟),并为其他任务释放了EDMA。

SRIO规定有效负载高达256字节的数据包。通常一个事务包含多个数据包。RapidIO规定每条消息最多16个数据包。尽管为每个数据包事务生成了一个请求,以便DMA可以将数据传输到二级内存,但只有在消息的最后一个数据包之后才会生成中断。此中断通知CPU数据在二级内存中可用于处理。

作为一个端点设备,外围设备根据目标ID接收数据包。对于数据包接收,有两种模式可选项。第一个选项只接收DestID与本地DeviceID匹配的数据包,这提供了一个安全级别。第二个选项是系统组播操作。当通过表3.2组播操作的DestID检查启用组播时,所有与下面注释中提到的DeviceID匹配的传入数据包,表3.3中描述的组播DeviceID寄存器都被接收。


表3.2组播操作的DestID检查


模式

(Mode)操作
log_tgt_id_dis

(PER_SET_CNTL,

Bit 27,0x0020)tgt_id_dis

(TLM_SP{0..3}

_CONTROL

Bit 21,0x1b380,

0x1b400,0x1b480,

0x1b500)mtc_tgt_id_dis

(TLM_SP{0..3}

_CONTROL

Bit 20,0x1b380,

0x1b400,0x1b480,

0x1b500)


A主机只能使用DESTID=RIO_BASE_ID (0xB060)或其他15个DeviceID值之一执行维护枚举、发现和分配; 

没有组播; 

没有数据包转发×00
B主机可以使用任何DestID执行维护枚举、发现和分配; 

允许对Base_ID进行硬编码(引脚设置),然后主机读取维护数据; 

没有组播; 

没有数据包转发×01
C主机可以执行维护枚举、发现,且仅使用DestID=RIO_
Base_ID(0xB060)或其他15个DeviceID值之一进行分配; 

支持8个本地组播组; 

支持所有数据包类型的数据包转发010

续表



模式

(Mode)操作
log_tgt_id_dis

(PER_SET_CNTL,

Bit 27,0x0020)tgt_id_dis

(TLM_SP{0..3}

_CONTROL

Bit 21,0x1b380,

0x1b400,0x1b480,

0x1b500)mtc_tgt_id_dis

(TLM_SP{0..3}

_CONTROL

Bit 20,0x1b380,

0x1b400,0x1b480,

0x1b500)


D主机可以使用任何DestID执行维护枚举、发现和分配; 

允许对Base_ID进行硬编码(引脚设置),然后主机读取维护数据; 

支持8个本地组播组; 

不进行FType 8 维护包的包转发011
E主机只能使用DestID=RIO_Base_ID(0xB060) 或其他15个DeviceID值之一执行维护枚举、发现和分配; 

支持无限组播/单播组; 

没有数据包转发110
F主机可以使用任何DestID执行维护枚举、发现和分配; 

允许对Base_ID进行硬编码(引脚设置),然后主机读取维护数据; 

支持无限组播/单播组; 

没有数据包转发111


表3.3检查DeviceID的寄存器


DeviceID类型寄 存 器 名偏 移 地 址


Multicast IDRapidIO Multicast ID00x00C0
RapidIO Multicast ID10x00C4
RapidIO Multicast ID20x00C8
RapidIO Multicast ID30x00CC
RapidIO Multicast ID40x00D0
RapidIO Multicast ID50x00D4
RapidIO Multicast ID60x00D8
RapidIO Multicast ID70x00DC


(1) 其中log_tgt_id_dis=0b0,仅支持DestID等于Base_ID或任何其他15个允许的
DeviceID或8个MulticastID的数据包; 
log_tgt_id_dis=0b1,支持混杂(Promiscuous)ID/单播ID。逻辑层接收所有数据包,而不考虑DestID,并由相应的功能块处理。
(2) tgt_id_dis和mtc_tgt_id_dis一起使用以配置混杂模式。tgt_id_dis和mtc_tgt_id_dis组合的行为如表3.4所示。


表3.4tgt_id_dis和mtc_tgt_id_dis组合的行为


端点

TGT_ID_DIS0101
MTC_TGT_ID_DIS0011



维护请求/保留数据包

匹配Base DeviceID路由到LLM(Logical Layer Module)路由到LLM路由到LLM路由到LLM
匹配BRR(Base Routing Register)由BRR路由由BRR路由路由到LLM路由到LLM
无匹配忽略路由到用户内核路由到LLM路由到LLM

除维护请求/保留数据包外的所有数据包

匹配Base DeviceID路由到用户内核路由到用户内核路由到用户内核路由到用户内核
匹配BRR路由到用户内核路由到用户内核路由到用户内核路由到用户内核
无匹配忽略路由到用户内核忽略路由到用户内核

下一步是时钟同步和数据对齐。这些功能由FIFO和
线去偏斜(Lane Deskewing)块处理。FIFO提供一种灵活存储机制,用于在恢复的时钟域和公共系统时钟之间转换时钟域。在FIFO之后,无论使用的是1×、2×还是4×模式,四个线都在频率和相位上同步。FIFO是8字深。在4×模式下,
线去偏斜块用于对齐每个通道的字边界,从而使生成的32位字正确对齐。

CRC错误检测块保持输入数据的运行计算,并且计算1×、2×或4×模式的预期CRC值。将期望值与接收数据包末尾的CRC值进行比较。
在数据包到达逻辑层后,对数据包字段进行解码并缓冲有效负载。根据接收数据包的类型控制DMA访问的功能块处理,图3.5描述了这些块。


图3.5SRIO外围模块



加载/存储单元(Load/Store Unit,LSU)控制DirectIO数据包的传输,内存访问单元(Memory Access Unit,MAU)控制DirectIO数据包的接收。LSU还控制维护包的传输。消息包由TXU发送并由RXU接收。这四个单元使用内部DMA与内部存储器通信,它们使用缓冲区和接收/发送端口与外部设备通信。
RapidIO数据流由与逻辑层、传输层和物理层相关的数据字段组成。
(1) 逻辑层由头(定义访问类型)和有效负载(如果存在)组成。
(2) 传输层在某种程度上依赖于系统中的物理拓扑结构,由发送和接收设备的源和目标ID组成。
(3) 物理层依赖于物理接口(即串行与并行RapidIO),包括优先级、确认和错误检查字段。
3.1.3SRIO包
SRIO事务基于请求和响应数据包。包是系统中端点设备之间的通信元素。主机或发起者生成一个发送到目标的请求包。然后,目标生成一个响应包返回给发起方以完成事务。

SRIO端点通常不直接连接到彼此,而是具有中间交换结构(Fabric)互连。如图3.6所示为SRIO发起者与目标之间的操作顺序。控制符(Control Symbols)用于管理SRIO物理互连中的事务流。控制符用于包确认、流控制信息和维护功能。


图3.6SRIO操作顺序


1. 流式写(Streaming Write)包示例
图3.7描述了作为两个数据流的示例数据包。第一个适用于80字节或更小的有效负载,而第二个适用于80到256字节的有效负载。SRIO数据包的长度必须是32位的偶数。如果物理层、逻辑层和传输层的组合长度为16位整数,则在CRC之后,在包的末尾添加一个值为0000H的16位Pad(图中未描述)。定义为保留的Reserved位字段在生成时设置为0,在接收时忽略。输入/输出逻辑规范(RapidIO Input/Output Logical Specification)和消息传递逻辑规范(Message Passing Logical Specification)中描述了所有请求和响应包格式。注: 图3.7假设地址为32位,DeviceID为8位。

DeviceID如是一个8位字段,它最多可以寻址系统中的256个节点。如果使用16位地址,系统最多可以容纳64K个节点。
数据流包括一个循环冗余码(CRC)字段,以确保正确接收数据。CRC值保护整个数据包,除了ackID和PHY字段的一位保留位(rsv)。外围设备在硬件上自动检查CRC。如果CRC正确,接收设备将发送一个接受包的控制符。如果CRC不正确,则发送一个不接受的包控制符,以便重试传输。
2. 控制符
控制符(Control Symbols)是管理链路维护、包定界(Packet Delimiting)、包确认(Packet Acknowledgment)、错误报告和错误恢复的物理层消息元素。所有传输的数据包都由包的开始和包的结束分隔符分隔。SRIO控制符的长度为24位,由它们自己的CRC保护(见图3.8)。控制符号提供两种功能: stype0符号表示发送该符号的端口的状态,stype1符号是接收端口或发送分隔符
(Transmission Delimiters)需要的。它们具有以下格式,详见
Physical layer 1×/4×LPSerial Specification的第3节。

控制符号由符号开头的特殊字符分隔。如果控制符号包含数据包分隔符(数据包开始、