1.1 引言
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专用寄存器为目标的事务 |
1.2 请求包格式
RapidIO处理器发起一个请求包给目标器件(Target),目标器件收到这个请求包以后给一个响应包到处理器(前提是这个请求包需要目标器件的响应),比如存储器读操作。一个典型的请求包的格式如下图所示
对于用户来说,最需要关注的就是逻辑层(上图中蓝色部分)各个字段的含义,Ftype与Ttype两个字段唯一的确定了包的类型,具体的对应关系请参考2.2节。逻辑层各个字段的含义如下表所示
字段 | 含义 |
---|---|
Ftype | 格式类型(Format Type),与Ttype共同唯一的确定包的格式 |
Ttype | 事务类型(Transaction Type),与Ftype共同唯一的确定包的格式 |
Wrsize/Rdsize | 此字段根据包的类型来决定是写事务数据的大小还是读事务数据的大小,这个字段配合wdptr(word pointer)字段一起使用 |
Src TID | 包的事务ID(Transaction ID)号 |
Extended Address | 扩展地址,这是一个可选字段,指定50-bit物理地址的高16-bit或者66-bit物理地址的高32-bit |
Address | 29-bit的物理地址,由于RapidIO传输以一个双字(double-word)为基本单元,大多数嵌入式系统是32位的,所以一个字(word)占用4个字节,一个双字(double-word)占用8个字节,所以29-bit的物理地址指向的一个存储单元实际上是占用8个字节的,这样用29-bit的物理地址实际上可以访问4G(2^32)的内存空间 |
Wdptr | 字指针(Word pointer),配合Wrsize/Rdsize字段来指明数据的大小以及对齐方式,详细的说明请查看RapidIO_Rev_2.2_Specification第33页 |
Xamsbs | 扩展地址最高位(Extended address most significant bits),把物理地址进一步扩展2位,由于29-bit的地址已经可以访问4G内存空间,在最高位扩展2位以后就可以访问16G的内存空间 |
Data Payload | 要传输的数据 |
1.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 | —— | 响应包携带的数据,如果是不携带数据的响应,那么这个字段就不存在 |
1.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事务进行初始化。原子操作的整个操作示意图如下图所示