SRIO是面向嵌入式系统开发提出的高可靠、高性能、基于包交换的新一代高速互联技术,已于2004年被国际标准化组织(ISO)和国际电工协会(IEC)批准为ISO/IECDIS 18372标准。SRIO则是面向串行背板、DSP和相关串行数据平面连接应用的串行RapidIO接口。串行RapidIO包含一个3层结构的协议,即物理层、传输层、逻辑层。物理层定义电气特性、链路控制、低级错误管理、底层流控制数据;传输层定义包交换、路由和寻址机制;逻辑层定义总体协议和包格式。可以实现最低引脚数量,采用DMA传输,支持复杂的可扩展拓扑,多点传输;可选的1.25 Gbps、2.5 Gbps、3.125 Gbps和5Gbps四种速度能满足不同应用需求,是未来十几年中嵌入式系统互联的最佳选择之一。 (摘自百度百科)
RapidIO操作:
RapidIO是基于请求和响应事务,包是系统中端点器件间的基本通信単元。发起器件或主控器件产生一个请求事务,该事务被发送至目标器件。目标器件于是产生一个响应事务返回至发起器件来完成该次操作。 RapidIO事务被封装在包中,而包则包含确保将事务可靠传送至目标端点的所有必需的位字段。通常不会将RapidIO端点相互直接连在一起,而是通过介于其间的交换结构(fabric)连接。名词“交换结构”指的是提供系统互连的单个或多个交换器件的集合。
控制符号用于管理RapdIO物理层互连的事务流,也用于包确认、流量控制信息和维护功能。下图显示了如何在 RapidIO系统中传送事务。
上图中,系统中的发起器件(Initiator)通过产生一个请求事务(Request)开始一次操作。该请求包传送至交换结构器件(Fabric),通常是一个交换机,交换结构器件发出控制符号确认收到了该请求包,然后交换结构将该包转发至目标器件(Target),这就完成了此次操作的请求过程。目标器件(Target)完成要求的操作,产生响应事务(Response)。通过交换结构(Fabric)将承载该事务的响应包传送回发起器件(Initiator).传送时使用控制符号对每一跳(hop)进行确认。一旦响应包到达发起器件(Initiator)并得到确认,就可认为此次操作已经完成。
Rapid IO协议由逻辑层、传输层和物理层构成。最明显的一个特点就是Rapid IO采用了单一的公用传输层规范来相容、会聚不同的逻辑层和物理层,单一的逻辑层实体增强了Rapid IO的适应性。
逻辑层定义了操作协议;传输层定义了包交换、路由和寻址机制;物理层定义了电气特性、链路控制和纠错重传等。
和以太网一样,RapidIO也是基于包交换的互连技术。RapidIO包由包头、可选的载荷数据和16bits CRC校验组成。包头的长度因为包类型不同可能是十几到二十几个字节。每包的载荷数据长度不超过256字节,这有利于减少传输时延,简化硬件实现。
SRIO事务及其类型:
SRIO(Serial Rapid IO)事务(transaction)类型有SRIO包(packet)中的Ftype和Ttype决定,其中比较重要的是:
NRED(Ftype = 2,Ttype = 4),功能是读制定的地址;
NWRITE(Ftype = 5,Ttype = 4)表示往指定的地址写数据;
NWRITE_R(Ftype = 5,Ttype = 5),表示往指定的地址写数据,写完之后接收目标期间的响应,即所谓的带响应的b(Ftype = 6,Ttype 保留),表示以流写方式写指定的地址,与NWRITE以及NWRITE_R相比,这种方式效率最高;
DOOREBELL(Ftype = 10,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 | 门铃 |
11 | 4’bxxxx | MESSAGE | 消息 |
12 | —— | Reserve | 无 |
13 | 4’b0000 | RESPONSE no data | 不带有效数据的响应包 |
4’b1000 | RESPONSE with data | 带有效数据的响应包 | |
14~15 | —— | Reserve | 无 |
I/O逻辑操作支持RapidIO存储空间的基本读写,它可以通过请求和响应事务对来完成。请求和响应事务对穿越 RapidIO交换结构运行, 但当事务穿越交换结构时RapidIO交换结构并不跟踪该事务。从交换结构的角度看, 请求事务和与之对应的响应事务间并没有明确的关系。虽然系统中可能存在多个中间交换器件和由此引起的多次包转发,但是从RapidlO逻辑层的角度来说,请求事务和响应事务只有一个(如果需要响应的话),中间交换器件不区分请求和响应事务,它们的作用只是转发事务到它们的最终目的地。
在 RapidIO体系结构中定义了6种基本的I/O操作, 下表给出了这6种基本的I/O操作、用来执行相应操作的事务和对操作的描述,
操作 | 使用的事务 | 描述 |
读 | NREAD、RESPONSE | 从目标器件中读数据 |
写 | NWRITE | 往目标器件中写数据 |
有响应写 | NWRITE_R、RESPONSE | 往目标器件中写数据,写完后等待目标的响应 |
流写 | SWRITE | 面向大数据量DMA传输优化写数据 |
Atomic | ATOMIC、RESPONSE | 原子操作,读-修改-写,事务不能被打断 |
维护 | MAINTENANCE | 以RapidIO专用寄存器为目标的事务 |
门铃事务格式:
它没有数据载荷,包格式如下:
上图中Ftype字段固定为10,表示这是一个门铃事务,8位的Reserved字段应该置0,Source TID指的是请求方的事务ID, info(msb)表示的是发送信息的高8位,info(lsb)表示的是发送信息的低8位。如果信息是用数字表示的,而且长度大于8位,那么数据符合低地址存放高字节(big-endian)的格式。比特流中先到达的是高字节。门铃事务适合向处理器递送中断信息,在这种情况下,信息字段用来向接收者传递中断级别和目标信息,除此以外,还可以在处理器件间发送信号量。
一个完整的门铃操作由DOORBELL事务和RESPONSE事务(通常是DONE响应)组成。处理单元用这个操作将非常短的消息通过互连结构发送到另一个处理器部件。门铃事务包括用于保持事务信息的信息字段。该事务没有数据载荷。它的信息字段是由软件定义的,可以用子任何目的。通常,运行在处理器上的操作系统会定义门铃事务使用的信息字段的意义。收到门铃事务的处理器部件将包放进处理器部件中的门铃消息队列,该队列可以在硬件或者本地存储器中实现。
消息事务
第11类包为消息事务格式包。第11类包总有数据载荷,并且数据载荷长度总是双字(64-bits或8-bytes)长度的整数倍。没有规定子双字(sub-double-word)消息,如果需要的话,可以由软件管理子双字消息。一个消息请求包的格式如下图所示
图中逻辑层各个字段的含义如下表所示
字段 | 值 | 含义 |
Ftype | 11 | Ftype=11表示这是一个MESSAGE事务 |
Msglen | 消息长度(Message Length):指的是组成该消息的包的总数。值为0时表明该包是一个单包消息,值为15(4’b1111)时,表明这是一个由16个包组成的消息。 | |
Ssize | 标准消息包数据大小(Stardard message packet data size)。该字段告诉消息接收者一个单独消息操作除消息中最后一个包外组成消息的所有包的数据载荷大小。这样可以防止发送者过度延长最后一个包的数据字段并允许接收者正确的将包放入本地存储器 | |
4’b0000~4’b1000 | 保留(Reserved) | |
4’b1001 | 8字节(byte) | |
4’b1010 | 16字节(byte) | |
4’b1011 | 32字节(byte) | |
4’b1100 | 64字节(byte) | |
4’b1101 | 128字节(byte) | |
4’b1110 | 256字节(byte) | |
4’b1111 | 保留(Reserved) | |
Letter | 信件。该字段用来识别信箱(MailBox)中的一个槽(SLOT)。该字段允许发送方同时发送最多4个消息到接收方的同一个信箱中 | |
Mbox | 信箱(MailBox)。该字段用来指定目标处理部件中的接收信箱 | |
Msgseg | 消息段(Message Segment)。该字段用来表明该包是组成消息的包中的第几个包。值为0表明该包是消息的第一个包。值为15(4’b1111)表明该包是消息的第16个包。 | |
Xmbox | 对于单包数据消息事务,该字段用来指明目标信箱的高四位。该字段与Msgseg占用相同的字段。Xmbox字段和mbox字段组合使用的定义如下: xmbox || mbox : mailbox number 0000 00 : mailbox 0 0000 01 : mailbox 1 0000 10 : mailbox 2 0000 11 : mailbox 3 0001 00 : mailbox 4 …… 1111 11 : mailbox 63 |
尽管RapidIO规范使用信箱(MailBox)、信件(Letter)和消息分段(Message Segment)之类的术语,但是这些字段在逻辑上指的是一个8位的消息标识符信息。消息标识符信息可以用来惟一的标识和管理任意两个处理部件之间最多256个不同的消息流。接收处理部件的消息传递硬件会根据该信息计算应该把事务数据存放在本地存储器的什么位置。
例如,假设接受处理部件的信箱0、信箱1、信箱2和信箱3的起始地址分别为地址0x1000、0x2000、0x3000和0x4000,处理部件接收到的消息事务带有下列字段:
A、消息长度为6个包(msglen = 4’b0110)
B、消息段是第3个包(msgseg = 4’b0011)
C、信箱为信箱2(mbox = 2’b10)
D、信件为1(letter = 2’b01)
E、标准大小为32字节(ssize = 4’b1011)
F、数据载荷为32字节(由于这不是最后一个事务, 所以数据载荷应该是32字节)
处理部件的消息传递硬件使用这些信息来决定将这部分数据消息所含32字节数据存放到本地存储器地址0x3040。
目标地址 = 信箱2基地址(Mailbox_2_base) + (消息分段x标准长度)
0x3040 = 0x3000 + (0x0002 x 0x0020)
这个简单的寻址结构使得接收处理部件很容易计算存储消息数据的目标存储结构的地址。不仅计算起来容易,而且接收者的目标存储器结构的位置对发送者也是不可见的。这允许仅在处理器部件间提供基于消息通信的安全系统研发工作。
消息的响应事务也是由第13类包产生,与NREAD事务和NWRITE_R事务响应包不同的是,消息事务的响应包中的target_info字段占用了普通响应包中的target ID字段的位置,具体的响应包格式见下图
其中消息响应包中逻辑层Ftype字段,Ttype字段,Status字段以及Data Payload字段的含义与普通响应包中各字段的含义完全相同, Target_info字段由letter,mbox和msgseg三个字段组成,这三个字段的含义与消息请求包中这三个字段的含义完全相同,这里不再赘述。
由消息和响应(一般是DONE响应)事务组成的数据消息操作如下图所示,处理部件的支持消息传递的硬件用它向另一个处理部件发送数据消息。完成一次数据消息操作最多需要16个单独的消息事务。消息事务数据载荷的大小是双字长度(8个字节)的整数倍。最大的消息操作载荷是4096字节,该载荷由16个消息事务组成,每个事务携带256字节的数据载荷。信件( letter),信箱(mbox)和消息段(msgseg)组合在一起,惟一地标识系统中每个请求和响应部件对的消息包,与其他请求类型使用的事务 ID的作用一样。