1.1 包与控制符号
RapidIO操作是基于请求和响应事务的。
包是系统中端点器件间的基本通信単元。发起器件或主控器件产生一个请求事务,该事务被发送至目标器件。目标器件于是产生一个响应事务返回至发起器件来完成该次操作。RapidIO事务被封装在包中,而包则包含确保将事务可靠传送至目标端点的所有必需的位字段。通常不会将RapidIO端点相互直接连在一起,而是通过介于其间的交换结构(fabric)连接。名词“交换结构”指的是提供系统互连的单个或多个交换器件的集合。
控制符号用于管理RapdIO物理层互连的事务流,也用于包确认、流量控制信息和维护功能。下图显示了如何在 RapidIO系统中传送事务。
上图中,系统中的发起器件(Initiator)通过产生一个请求事务(Request)开始一次操作。该请求包传送至交换结构器件(Fabric),通常是一个交换机,交换结构器件发出控制符号确认收到了该请求包,然后交换结构将该包转发至目标器件(Target),这就完成了此次操作的请求过程。目标器件(Target)完成要求的操作,产生响应事务(Response)。通过交换结构(Fabric)将承载该事务的响应包传送回发起器件(Initiator).传送时使用控制符号对每一跳(hop)进行确认。一旦响应包到达发起器件(Initiator)并得到确认,就可认为此次操作已经完成。
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 | 门铃 |
11 | 4’bxxxx | MESSAGE | 消息 |
12 | —— | Reserve | 无 |
13 | 4’b0000 | RESPONSEno data | 不带有效数据的响应包 |
4’b1000 | RESPONSEwith data | 带有效数据的响应包 | |
14~15 | —— | Reserve | 无 |
RapidIO事务的类型大概有以下几种:
功能 | 事务类型 |
---|---|
I/O非一致功能 | NREAITED(读非共享存储器) |
NWRITE、NWRITE_R、SWRITE(写非共享存储器) | |
原子(ATOMIC)(读-修改-写至非共享存储器) | |
基于端口的功能 | 门铃(DOORBELL)(产生中断) |
消息(MESSAGE)(对端口写) | |
系统支持功能 | 维护(MAINTENANCE)(读写配置、控制、状态寄存器) |
用户定义功能 | 对专用事务开放 |
高速缓存一致性功能 | 读(READ)(读全局共享高速缓存器) |
READ_TO_DOWN(写全局共享高速缓存器) | |
抛弃(CASTOUT)(交出全局共享高速缓存器拥有权) | |
IKILL(指令缓冲失效) | |
DKILL(数据缓冲失效) | |
刷新(FLUSH)(返回全局共享高速缓存器至存储器) | |
IO_READ(读非缓冲全局共享高速缓存器的副本) | |
操作系统支持功能 | TLBIE(TLB失效) |
TLBSYNC(TLB强迫完成失效) |
当数据必须被系统中的多个处理器件共享时,必须由协议维护和管理多个器件对共享数据的临时占用,许多嵌入式系统用软件机制实现该协议。如果存储器空间可被多个器件访问,可以使用锁或者信号量来保证器件间正确的访问次序。在其他情况下,处理部件可能只有访问本地存储器空间的权利,在这些“非共享”的系统中,需要一种机制把数据从一个处理器件传递到另一个器件。使用消息传递(Message Passing)信箱(Mailbox)可以实现这种机制。
RapidIO提供了一种有用的消息传递机制, RapidlO消息传递协议描述了支持信箱和门铃通信的事务。RapidIO信箱是一个端口,器件间可通过它发送消息。接收器件在消息到达后对其进行处理。RapidIO消息的长度从0到4096字节不等。一个接收器件有1~4个可寻址消息队列来捕获输人的消息。
RapidIO门铃 (Doorbell )是一种基于端口的轻量级事务,可用于带内(in-band)中断。门铃消息包括一个由软件定义的16位字段,该字段可用来在两个器件间传达多种不同意图的消息。
支持全局共享的分布式存储器系统是RapidIO协议的扩展功能之一。这意味着可以把存储器放到系统中不同的物理位置上, 可以正确地在不同处理器件间缓存。
RapidIO制定了一种基于目录的一致性解决方案来支持这种方法。使用这种方法,每个存储器控制器都有责任跟踪每个数据元素的当前副本在系统中位于什么位置,为一致域中的每个器件维护一个目录,跟踪每个器件的修改、共享、位置(MSL)等简単的一致性状态。
流量控制是任何互连技术的重要内容。流量控制是指在任意时间互连技术采用某些规则和机制,根据这些规则和机制决定任意时间从可能获得的若干事务中选择哪一事务进行发送。流量控制的目的是使器件完成系统中的事务,避免被其他事务阻塞。基于总线的互连技术使用仲裁算法来确保器件进行恰当的转发操作,确保高优先级的事务优先于低优先级的事务得到转发。采用交换的互连技术,事务从系统的不同位置进入,从而无法使用集中式的仲裁机制。这就需要一种管理系统中的事务流的方法。RapidIO使用若干补充机制来获得系统中平稳的数据流并避免系统死锁。
RapidIO逻辑层的包被定义为一连串的比特,并且与物理层实现无关。这意味着RapidIO协议在串行与并行接口,铜线与光纤介质下都能正常工作。在Xilinx FPGA中已经集成了GTP,GTX或GTH等高速串行收发器,所以在FPGA实现RapidIO高速传输协议都是采用的串行物理层而并非并行物理层。串行物理层使用8B/10B编码用到的字符(K码)完成定界,利用这种方式,发送器件使用K码作为定界符,为接收器件指明包或控制符号的开始和结束。
串行RapidIO规范使用物理编码子层(PCS)和物理媒介附属子层(PMA)在发送方将包转化成串行比特流。并在接收方提取出该比特流。除了在发送前进行编码和在接收后进行解码操作,PCS层还负责空闲序列(idle sequence) 产生、通道分段(lane striping)、通道对齐(lane alignment)、以及接收方通道合并(lane destriping)的操作。PCS层使用8B/10B编码技术在链路上传送数据,8B/10B编码模块把8位数据编码转换为10位做据,编码后的数据包括原始数据和可恢复的时钟信息。PCS层还提供了一种机制,用于自动决定端口的工作模式是在单通道(1-lane)模式还是四通道(4-lane)模式。PCS层也可弥补发送方和接收方之间的时钟差。
PMA层负责逐个通道地将10位并行码组(code-group)数据串行化为串行比特流或将串行比特流并行化为10位并行码组数据。接收数据时, PMA层独立地、逐个通道地将接收到的比特流对齐到10位码组边界,然后向PCS层提供连续的10位码组流,每一通道分配一个码组流,10位码组对于PCS层以上各层是不可见的。