一、RapidIO背景介绍
RapidIO是由Motorola和Mercury等公司率先倡导的一种高性能、 低引脚数、 基于数据包交换的互连体系结构,是为满足和未来高性能嵌入式系统需求而设计的一种开放式互连技术标准。RapidIO主要应用于嵌入式系统内部互连,支持芯片到芯片、板到板间的通讯,可作为嵌入式设备的背板(Backplane)连接。
RapidI0采用三层分级体系结构,该分级结的如下图所示
其中逻辑层位于最高层.定又全部协议和包的格式,它们为端点器件发起和完成事务提供必要的信息;传输层规范位于中间层,定义了RapidIO地址空间和在端点器件间传输包所需要的路由信息,物理层规范在整个分级结构的底部,包括器件级接口的细节,如包传输机制、流量控制、电气特性和低级错误管理等功能.
Rapid IO分为并行Rapid IO标准和串行Rapid IO标准,串行RapidIO是指物理层采用串行差分模拟信号传输的RapidIO标准。在Xilinx的一部分FPGA里面已经集成了GTP,GTX或GTZ等高速串行收发电路,这些是FPGA实现RapidIO高速传输的物理层基础。
二、RapidIO协议概述
2.1 包与控制符号
RapidIO操作是基于请求和响应事务的。
包是系统中端点器件间的基本通信単元。发起器件或主控器件产生一个请求事务,该事务被发送至目标器件。目标器件于是产生一个响应事务返回至发起器件来完成该次操作。 RapidIO事务被封装在包中,而包则包含确保将事务可靠传送至目标端点的所有必需的位字段。通常不会将RapidIO端点相互直接连在一起,而是通过介于其间的交换结构(fabric)连接。名词“交换结构”指的是提供系统互连的单个或多个交换器件的集合。
控制符号用于管理RapdIO物理层互连的事务流,也用于包确认、流量控制信息和维护功能。下图显示了如何在 RapidIO系统中传送事务。
上图中,系统中的发起器件(Initiator)通过产生一个请求事务(Request)开始一次操作。该请求包传送至交换结构器件(Fabric),通常是一个交换机,交换结构器件发出控制符号确认收到了该请求包,然后交换结构将该包转发至目标器件(Target),这就完成了此次操作的请求过程。目标器件(Target)完成要求的操作,产生响应事务(Response)。通过交换结构(Fabric)将承载该事务的响应包传送回发起器件(Initiator).传送时使用控制符号对每一跳(hop)进行确认。一旦响应包到达发起器件(Initiator)并得到确认,就可认为此次操作已经完成。
2.2 包格式
RapidIO包由代表3级规范体系结构的多个字段组成。下图显示了典型的请求包和响应包的格式,这些包的格式属于并行物理层包格式,串行物理层包的格式与此稍有不同。某些字段是依赖于具体的上下文的, 并不会在所有的包中出现。
请求包以物理层字段开始, S位指示这是一个包还是一个控制符号(S=0表示是一个包,S=1表示是控制符号), AckID表明交换结构器件将用控制符号来确认哪一个包。PRIO字段指示用于流量控制的包优先级。TT、目标地址( Target Address)和源地址( Source Address)字段指示传输地址的机制类型、包应被传送到的器件的地址和产生包的器件的地址。Ftype和事务(Transation)指示正被请求的事务。长度(Size)字段等于编码后事务的长度, RapidIO事务数据的有效裁荷(Payload)长度从1到256字节不等。SrcTID(源事务ID)指示事务ID, RapidIO器件在两个端点器件间最多允许有256个未完成的事务。对于存储器映射事务,跟随在srcTID后面的是器件偏移地址 (Device Offset Address ) 字段。写事务必须附带数据的有效裁荷,所有包以16位(2个字节)循环冗余校验码(CRC)结束。
响应包与请求包类似。状态(Status)字段指示是否成功完成了事务。目标TID(目标事务ID)字段的值与请求包中源事务 ID字段的值相等。下图是请求包与响应包的包格式示意图
对于用户来说,最需要关注的就是逻辑层(上图中蓝色部分)各个字段的含义,逻辑层中Ftype与Ttype(Ttype字段和上图中的Transaction字段是同一个字段,只不过叫法不同而已)两个字段唯一的确定了这个请求包的功能。下表列出了Ftype与Ttype所确定的包含义
Ftype (Format Type) |
Ttype (Transaction Type) |
包类型
|
功能 |
0~1 |
—— |
Reserve |
无 |
2 |
4’b0100 |
NREAD |
读指定的地址 |
4’b1100 |
ATOMIC increment |
先往指定的地址中传递数据,在把传递的数据加1,此操作为原子操作,不可打断 |
|
4’b1101 |
ATOMIC decrement |
先往指定的地址中传递数据,在把传递的数据减1,此操作为原子操作,不可打断 |
|
4’b1110 |
ATOMIC set |
把指定地址中的数据每个bit全部写1 |
|
4’b1111 |
ATOMIC clear |
把指定地址中的数据清0(每个bit全部清零) |
|
3~4 |
—— |
Reserve |
无 |
5 |
4’b0100 |
NWRITE |
往指定的地址写数据 |
4’b0101 |
NWRITE_R |
往指定的地址写数据,写完成以后接收目标器件(Target)的响应 |
|
4’b1101 |
ATOMIC test/swap |
对指定地址中的数据进行测试并交换,此操作为原子操作,不可打断 |
|
6 |
4’bxxxx |
SWRITE |
以流写方式写指定的地址,与NWRITE以及NWRITE_R相比,此方式效率最高 |
7 |
—— |
Reserve |
无 |
8 |
4’b0000 |
MAINTENANCE read request |
发起读配置,控制,状态寄存器请求 |
4’b0001 |
MAINTENANCE write request |
发起写配置,控制,状态寄存器请求 |
|
4’b0010 |
MAINTENANCE read response |
产生读配置,控制,状态寄存器响应 |
|
4’b0011 |
MAINTENANCE write response |
产生写配置,控制,状态寄存器响应 |
|
4’b0100 |
MAINTENANCE write resquest |
端口写请求 |
|
9 |
—— |
Reserve |
无 |
10 |
4’bxxxx |
DOORBELL |