RapidIO 逻辑层IO操作与Message操作的原理和区别
阅读原文时间:2022年05月20日阅读:3

接上一篇 SRIO RapidIO (SRIO)协议介绍(一)

1     说明

查看协议手册时会发现,逻辑层的操作分成了IO和Message 2类动作,那么为什么要分成2类操作?从原理和应用角度来看IO和message的区别是什么呢?

1、 分成2类是为了应对不同的互联类型,IO操作主要为了应对远端的内存访问,设备间可以访问彼此的物理内存;

2、 Message操作提供了一个基于消息的通用、安全的数据传输方式,设备间无法访问对方的物理内存,但是又需要进行数据的场景Messages and doorbells are port based operations that allow devices to communicate with each other without visibility to each other’s address space. The packet contains an identification value pertaining to the message, and the receiver defines the memory location for the message to be buffered.

A doorbell is a simple sixteen bit message sent to a target device, which is useful for generating an interrupt.

A message provides inter-device communication through explicit messages instead of direct memory access. It can consist of up to sixteen packets, where each packet can contain up to 256 bytes, enabling messages up to a maximum of four kilobytes.

3、 RapidoIO是基于请求、相应的传输机制,其中IO请求操作占据了FTYPE(frame type包类型)的0-8(主要为FTYPE2 - Request Class,FTYPE5 - Write Class,FTYPE6 - Streaming Write Class),Message请求操作占据了FTYPE的10-11(主要为FTYPE10 - Doorbell Class,FTYPE11 - Message Class);

参考 https://blog.csdn.net/m0_52840978/article/details/121666138?spm=1001.2014.3001.5501 (该链接内容参考自 《RapidIO: The Next Generation Communication Fabric For Embedded Application》)

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字段的值相等。下图是请求包与响应包的包格式示意图

图 1‑1 请求包与回应包格式

对于用户来说,最需要关注的就是逻辑层(上图中蓝色部分)各个字段的含义,逻辑层中Ftype与Ttype(Ttype字段和上图中的Transaction字段是同一个字段,只不过叫法不同而已)两个字段唯一的确定了这个请求包的功能。下表列出了Ftype与Ttype所确定的包含义

表 1‑1 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

RESPONSE

no data

不带有效数据的响应包

4’b1000

RESPONSE

with data

带有效数据的响应包

14~15

——

Reserve

2     IO操作

先看看spec的说法:

The operations described in this section are used for I/O accesses to physical addresses in the target of the operation. Examples are accesses to non-coherent memory, ROM boot code, or to configuration registers that do not participate in any globally shared system memory protocol. These accesses may be of any specifiable size allowed by the system.

为了访问Target设备的物理内存,比如非连续的内存、ROM配置代码、非全局系统共享内存的配置寄存器(简单理解为寄存器即可);

Spec中列出的类型如下:

本文不对各个类型的包格式做详细说明,请参考Spec即可

RapidIO处理器发起一个请求包给目标器件(Target),目标器件收到这个请求包以后给一个响应包到处理器(前提是这个请求包需要目标器件的响应),比如存储器读操作。一个典型的请求包的格式如下图所示

图 2‑1 请求包格式,只需要关注logic layer

图 2‑2 header各个字段的含义

当一个RapidIO端点完成由另一个RapidIO端点发起的请求时,该端点就会发送一个响应事务。响应事务包总是以与请求事务包相同的方式被发送和路由。从广义上说,第12、13、14 和15类格式(Ftype=12表示的就是第12类格式)是响应类事务的格式。通常,第 12和14类是保留的,第15类由具体应用定义, 第13类才是主要的响应类事务。第13类包格式返回状态,数据(如果需要)和请求者的事务ID。带有“ERROR”状态或没有预期的数据裁荷的响应的RESPONSE包没有数据载荷。响应包使用第13类格式来响应除维护和无响应写之外的所有请求包。维护响应包响应维护请求。一个典型的响应包的格式如下图所示

图 2‑3 响应包格式 ,只关注逻辑层即可

图 2‑4 响应包中逻辑层各个字段的定义(Ftype是固定的,没有标出)

图 2‑5 Spec中描述的Ftype13对应的响应格式

3     Message操作

消息是一种编程模型,常用于分布式内存的计算系统,在这个模型中,计算单元只运行访问自己的本地内存,那么多个计算单元之间的数据交互就可以通过消息这样的安全传输机制,发送者无需访问接收方的物料内存,而是把消息字段固定发送到接收者的某块本地内存中即可,然后接收方通过中断通知本地逻辑将内存的消息字段读走进行处理。

Message passing is a programming model commonly used in distributed memory system machines. In this model, processing elements are only allowed to access memory that is local to themselves, and communication between processing elements is handled through specialized hardware manipulated through application or OS software. For two processors to communicate, the sending processor writes to a local message passing device that reads a section of the sender’s local memory and moves that information to the receiving processor’s local message passing device. The recipient message passing device then stores that information in local memory and informs the recipient processor that a message has arrived, usually via an interrupt. The recipient processor then accesses its local memory to read the message.

3.2.1     Data Message

一个消息源可以生成一个最多由16个独立包组成的4096字节长度的消息。实际上,会由不同长度的需求,这种机制也允许更小的包长。

A source may generate a single message operation of up to 16 individual packets containing as much as 256 data bytes per packet. A variety of data payload sizes exist, allowing a source to choose a smaller size data payload if needed for an application. RapidIO defines all data message packets as containing the same amount of data with the exception of the last one, which can contain a smaller data payload if desired. The packets are formatted with three fields: • One field specifies the size of the data payload for all except

第11类包为消息事务格式包。第11类包总有数据载荷,并且数据载荷长度总是双字(64-bits或8-bytes)长度的整数倍。没有规定子双字(sub-double-word)消息,如果需要的话,可以由软件管理子双字消息。

消息的响应事务也是由第13类包产生,与NREAD事务和NWRITE_R事务响应包不同的是,消息事务的响应包中的target_info字段占用了普通响应包中的target ID字段的位置,具体的响应包格式见下图

图 3‑1 消息响应

3.2.2     Doorbell Message

第10类包格式是门铃事务格式。它没有数据载荷。

The doorbell operation, consisting of the DOORBELL and RESPONSE transactions (typically a DONE response) as shown in Figure 3-1, is used by a processing element to send a very short message to another processing element through the interconnect fabric. The DOORBELL transaction contains the info field to hold information and does not have a data payload. This field is software-defined and can be used for any desired purpose

图 3‑2 门铃包格式

上图中Ftype字段固定为10,表示这是一个门铃事务,8位的Reserved字段应该置0,Source TID指的是请求方的事务ID, info(msb)表示的是发送信息的高8位,info(lsb)表示的是发送信息的低8位。如果信息是用数字表示的,而且长度大于8位,那么数据符合低地址存放高字节(big-endian)的格式。比特流中先到达的是高字节。门铃事务适合向处理器递送中断信息,在这种情况下,信息字段用来向接收者传递中断级别和目标信息,除此以外,还可以在处理器件间发送信号量。

4     总结

用Spec的图进行说明,我们还是只关注逻辑层即可,这个图只是为了方便我们区别各类传输格式。