三、I/O逻辑操作与包格式
3.1 引言
I/O逻辑操作支持RapidIO存储空间的基本读写,它可以通过请求和响应事务对来完成。请求和响应事务对穿越 RapidIO交换结构运行, 但当事务穿越交换结构时RapidIO交换结构并不跟踪该事务。从交换结构的角度看, 请求事务和与之对应的响应事务间并没有明确的关系。虽然系统中可能存在多个中间交换器件和由此引起的多次包转发,但是从RapidlO逻辑层的角度来说,请求事务和响应事务只有一个(如果需要响应的话),中间交换器件不区分请求和响应事务,它们的作用只是转发事务到它们的最终目的地。
在 RapidIO体系结构中定义了6种基本的I/O操作, 下表给出了这6种基本的I/O操作、用来执行相应操作的事务和对操作的描述,
3.2 请求包格式
RapidIO处理器发起一个请求包给目标器件(Target),目标器件收到这个请求包以后给一个响应包到处理器(前提是这个请求包需要目标器件的响应),比如存储器读操作。一个典型的请求包的格式如下图所示
对于用户来说,最需要关注的就是逻辑层(上图中蓝色部分)各个字段的含义,Ftype与Ttype两个字段唯一的确定了包的类型,具体的对应关系请参考2.2节。逻辑层各个字段的含义如下表所示
3.3 响应包格式
当一个RapidIO端点完成由另一个RapidIO端点发起的请求时,该端点就会发送一个响应事务。响应事务包总是以与请求事务包相同的方式被发送和路由。从广义上说,第12、13、14 和15类格式(Ftype=12表示的就是第12类格式)是响应类事务的格式。通常,第 12和14类是保留的,第15类由具体应用定义, 第13类才是主要的响应类事务。第13类包格式返回状态,数据(如果需要)和请求者的事务ID。带有“ERROR”状态或没有预期的数据裁荷的响应的RESPONSE包没有数据载荷。响应包使用第13类格式来响应除维护和无响应写之外的所有请求包。维护响应包响应维护请求。一个典型的响应包的格式如下图所示
逻辑层各个字段的含义如下表所示
字段 |
值 |
含义 |
Ftype |
4’b1101 |
格式类型(Format Type),与Ttype唯一的确定包的格式,对于一个有效的响应包来说,此字段的值固定为4’b1101,也就是16进制的d |
Ttype |
4’b0000 |
不携带数据的响应 |
4’b0001~4’b0111 |
保留 |
|
4’b1000 |
携带数据的响应 |
|
4’b1001~4’b1111 |
保留 |
|
Status |
4’b0000 |
DONE状态:表示请求事务得到了正确的响应 |
4’b0001~4’b0110 |
保留 |
|
4’b0111 | ERROR状态:表示请求事务出现了不可恢复的错误,未能得到正确的响应 | |
4’b1000~4’b1011 |
保留 |
|
4’b1100~4’b1111 |
用户自定义响应 | |
Target TID |
—— |
目标事务ID(Transaction ID)号 |
Data Payload |
—— | 响应包携带的数据,如果是不携带数据的响应,那么这个字段就不存在 |
3.4 常用的I/O逻辑操作事务
1、读操作(NREAD)
读操作由一个NREAD事务和一个RESPONSE事务组成,NREAD事务由请求方(Requestor)发起,目标方(Destination)正确的处理请求方发过来的响应以后会给请求方反馈正确的响应以及请求方读取的数据。整个操作的示意图如下所示
2、写操作(NWRITE)和流写操作(SWRITE)
写操作(write operations)和流写操作(streaming-write operations)分别由NWRITE和SWRITE事务组成。请求方可以用这两种事务往目标方指定的地址写入数据。NWRITE事务允许多个双字(double-word),字(word),半字(half-word)和字节(byte)作为数据负载(Data Payload)进行传输,但前提是必须对数据进行适当的补0(padded)并进行8字节边界对齐。而SWRITE事务相当于用NWRITE事务传输双字(double-word)的情况,并且SWRITE事务具有更少的头部开销(SWRITE事务的包格式中把Ttype,Rdsize/Wrsize和srcTID三个字段全部定义为了Extended Address字段的一部分,所以头部开销变少)。NWRITE事务和SWRITE事务不需要接收目标方的响应,所以当事务被目标方处理完以后并不会给发起方反馈任何信息。NWRITE事务与SWRITE事务的操作示意图如下图所示
3、带响应的写操作(NWRITE_R)
带响应的写操作(write-with-response operations)由NWRITE_R事务和RESPONSE事务组成。它的整个请求操作和NWRITE事务的请求操作完全相同,但是在目标方正确处理请求方的NWRITE_R事务以后,目标方会给请求方反馈一个响应包告诉请求方事务已经被正确的处理。这种机制可以有效的保证数据传输的稳定性。NWRITE_R事务的处理流程如下图所示
4、原子操作(Atomic Operations)
原子操作(Atomic Operations)又叫做读-修改-写操作(Read-modify-Write Operations),它是由ATOMIC事务和RESPONSE事务组成,许多协处理器单元使用该操作来执行非一致性(non-coherent)存储器的同步。它允许携带的数据量为一个字(4个字节),一个半字(2个字节)或者一个字节,其他数据量都是不被允许的。
原子操作既包含了读操作,也包含了写操作。目标方读取指定地址的数据,并把读取的数据返回给请求方,然后对数据执行相关的操作,最后在写回指定的地址。这个过程不会被任何其他的事务干扰或者打断。对数据执行的操作包括加1运算(increment),减1运算(decrement),测试和交换(test-and-swap),置1操作(set)和清0操作(clear),在这些操作中,只有测试和交换(test-and-swap),比较和交换(compare-and-swap)以及交换(swap)需要处理单元提供数据。原子操作的目标数据可以用NWRITE事务进行初始化。原子操作的整个操作示意图如下图所示
四、维护操作与包格式
第8类事务维护事务用于访问 RapidIO能力寄存器(CARs,Capability Registers)、命令和状态奇存器( CSRs,Command and Status Register) ,本地定义的寄存器(Locally-Refined Registers)以及数据结构(Data Structures)。与其他的请求格式不同,维护操作的请求和响应包格式都是第8类包格式。第8 类包不含地址字段,只含写请求和读响应的数据载荷。
WRSIZE字段规定了多双字事务数据载荷的最大长度。数据载荷的长度不能超过这个最大长度,但是如果需要的话,可以比这个最大长度小。维护读请求和维护请求都产生正确的维护响应 。
维护事务的请求包格式如下图所示
维护事务的响应包格式如下图所示
维护事务包格式中逻辑层各个字段(Hopcount字段不属于逻辑层,下表同样列出它的含义)的含义如下表所示
字段 |
值 |
含义 |
Ftype |
8 |
第8类事务代表维护类事务,维护类事务中这个字段固定为8 |
Ttype |
4’b0000 |
指定一个维护读请求 |
4’b0001 | 指定一个维护写请求 |
|
4’b0010 | 指定一个维护读响应 | |
4’b0011 | 指定一个维护写响应 |
|
4’b0100 | 指定一个维护写端口请求 |
|
4’b0101~4’b1111 |
保留 |
|
Hopcount |
Hopcount |
|
Config Offset |
用于读写CAR/CSR寄存器的双字偏移量 |
|
Src TID |
维护请求包的事务ID |
|
Target TID |
维护响应包的事务ID |
|
Status |
4’b0000 |
DONE状态:表明请求的事务成功完成 |
4’b0001~4’b0110 |
保留 |
|
4’b0111 |
ERROR状态:检查到不可恢复的错误 |
|
4’b1000~4’b1011 |
保留 |
|
4’b1100~4’b1111 |
用户定义 |
维护操作由维护请求事务和维护响应事务组成,处理器可以通过这类事务访问CARs/CSRs等寄存器中的数据。如果发起的维护请求事务需要一个响应,那么目标方正确处理了维护请求事务以后会给请求方反馈一个维护响应包而不是由NWRITE_R事务或NREAD事务产生的正常响应包。它支持读取配置寄存器的操作执行长度是字(4字节),也可以是双字( 8字节)或设计者自已指定的双字的整数倍长,但执行长度最多不得超过64 字节。所有写配置寄存器的操作的执行长度规定与读操作相同。维护操作的示意图如下图所示