串行RapidIO(Serial RapidIO,SRIO):协议介绍

目录

  • 一、RapidIO背景介绍
  • 二、RapidIO协议概述
    • 2.1 操作与控制符号
    • 2.2 包格式
  • 三、I/O逻辑操作与包格式
    • 3.1 引言
    • 3.2 常用的I/O逻辑操作
      • 读操作(NREAD, RESPONSE with data)
      • 写操作(NWRITE)和流写操作(SWRITE)
      • 带响应的写操作(NWRITE_R,RESPONSE with no data)
      • 原子操作(Atomic Operations, RESPONSE with data)
    • 3.3 请求包格式(Ftype = 2、5、6)
    • 3.4 响应包格式(Ftype = 13)
  • 四、维护操作与包格式(Ftype = 8)
  • 五、消息操作与包格式
    • 5.1 引言
      • 消息模型
    • 5.2 门铃事务(DOORBELL,Ftype = 10)
    • 5.3 消息事务(MESSAGE, Ftype = 11)
      • 消息的响应事务(RESPONSE, Ftype = 13)
  • 六、总结


本文是基于Xilinx平台SRIO介绍(一)RapidIO协议介绍的内容作读书笔记。

一、RapidIO背景介绍

RapidIO采用三层分级体系结构,包括逻辑层、传输层和物理层该分级结的如下图所示:

串行RapidIO(Serial RapidIO,SRIO):协议介绍_第1张图片

逻辑层:位于最高层,定义全部协议和包的格式,它们为端点器件发起和完成事务提供必要的信息;

传输层:位于中间层,定义RapidIO 地址空间和在端点器件间传输包所需要的路由信息

物理层:规范在整个分级结构的底部,包括器件级接口的细节,如包传输机制、流量控制、电气特性和低级错误管理等功能。

串行RapidIO是指物理层采用串行差分模拟信号传输的RapidIO标准。

在Xilinx的一部分FPGA里面已经集成了GTP,GTX或GTZ等高速串行收发电路,这些是FPGA实现RapidIO高速传输的物理层基础。

二、RapidIO协议概述

2.1 操作与控制符号

RapidIO每一个操作是基于请求和响应事务的,而请求事务或响应事务是需要数据包进行通信的。

:即数据包,是系统中端点器件间的基本通信単元。每个数据包可包含各种不同意义的数据,数据在包中的位置、位数和格式需要根据协议来确定。

发起器件或主控器件(Initiator):产生事务的期间,事务会被发送至目标器件进行处理。

目标器件(Target):响应事务的器件,根据事务的规定完成相应的操作。

交换器件(Fabric):在RapidIO中通常不会将发起器件和目标期间直接连在一起,而是通过介于其间的交换器件相连接。

RapidIO事务:与事务的含义相同,指访问并可能更新数据库中各种数据项的程序执行单元,RapidIO事务被封装在数据包中。

控制符号:用于管理RapdIO物理层互连的事务流,也用于包确认、流量控制信息和维护功能。

RapidIO是基于事务实现操作的,如下图所示。

串行RapidIO(Serial RapidIO,SRIO):协议介绍_第2张图片

发起器件向目标器件的请求过程如下:

  1. 发起器件(Initiator or Requestor)产生一个请求事务(Request),并将该事务封装至相应的请求包内

  2. 该请求包传送至交换器件(Fabric),交换器件向发起器件返回一个控制符号表示收到该请求包。

  3. 交换器件将该包转发至目标器件(Target or Destination)

  4. 目标器件收到请求包,并向交换器件返回一个控制符号表示收到该请求包,这就完成了此次操作的请求过程。

目标器件响应发起器件的请求过程如下:

  1. 目标器件(Target)完成要求的操作,产生响应事务(Response),并将其封装至响应包内。

  2. 该响应包传送至Fabric,Fabric向Target返回一个控制符号表示收到该响应包。

  3. Fabric将该包转发至Initiator

  4. Initiator收到该响应包,并向Fabric返回一个控制符号表示收到该响应包,这就完成了此次操作的整个过程。

2.2 包格式

RapidIO包由代表3级规范体系结构(逻辑log、传输trans和物理phy)的多个字段组成。下面分别解释请求包和响应包的包格式。

请求包以物理层字段开始,

S:指示这是一个包还是一个控制符号,S=0表示是一个包,S=1表示是控制符号

AckID:表明fabric将用控制符号来确认哪一个包。

Prio:指示用于流量控制的包优先级。

TT:指示传输地址的机制类型

Ftype:Format type,指示正被请求的事务

Target Address:目标地址,指示包应被传送到的器件的地址

Source Address:源地址,指示产生包的器件的地址

Transation:事务,也可写作Ttype(Transaction type),配合Ftype指示正在被请求的事务

Size:长度,等于编码后事务的长度。

SourceTID:源事务ID,RapidIO器件在两个端点器件间最多允许有256个未完成的事务。

Device Offset Address:器件偏移地址,用于存储器映射事务。

Optional Data Payload:RapidIO事务数据有效载荷,写事务必须附带数据的有效裁荷,长度从8到256字节不等。

CRC:Cyclic Redundancy Check,即循环冗余校验码,所有包以16bit(2个字节)结束。

响应包与请求包类似。

Status:状态,指示是否成功完成了事务。

SourceTID:该字段的值与请求包中Source ID字段的值相等。

下图是请求包与响应包的包格式的参考示意图,数字表示该字段所需大小,默认单位为bit

串行RapidIO(Serial RapidIO,SRIO):协议介绍_第3张图片

对于用户来说,最需要关注的就是 逻辑层(上图中蓝色部分) 各个字段的含义,逻辑层中Ftype与Transaction两个字段唯一的确定了该请求包的功能。

下表列出了Ftype与Transaction所确定的包事务功能,注意不同的事务类型逻辑层字段组成可能不太相同,在后面的章节将会作具体介绍,此处仅给出Ftype和Transaction的取值。

Ftype Transaction 事务类型 功能
0~1 —— Reserve
2 4’b0100 NREAD 读指定地址
2 4’b1100 ATOMIC increment 先从指定的地址中读取数据,把传递的数据加1,再向该地址写入,此操作为原子操作,不可打断
2 4’b1101 ATOMIC decrement 先从指定的地址中读取数据,把传递的数据减1,再向该地址写入,此操作为原子操作,不可打断
2 4’b1110 ATOMIC set 把指定地址中的数据每个bit全部写1
2 4’b1111 ATOMIC clear 把指定地址中的数据清0(每个bit全部清零)
3~4 —— Reserve
5 4’b0100 NWRITE 往指定的地址写数据
5 4’b0101 NWRITE_R 往指定的地址写数据,写完成以后接收目标器件(Target)的响应
5 4’b1101 ATOMIC test/swap 对指定地址中的数据进行测试并交换,此操作为原子操作,不可打断
6 4’bxxxx SWRITE 以流写方式写指定的地址,与NWRITE以及NWRITE_R相比,此方式效率最高
7 —— Reserve
8 4’b0000 MAINTENANCE read request 发起读配置,控制,状态寄存器请求
8 4’b0001 MAINTENANCE write request 发起写配置,控制,状态寄存器请求
8 4’b0010 MAINTENANCE read response 产生读配置,控制,状态寄存器请求
8 4’b0011 MAINTENANCE write response 产生写配置,控制,状态寄存器请求
8 4’b0100 MAINTENANCE write request 端口写请求
9 —— Reserve
10 4’bxxxx DOORBELL 门铃
11 4’bxxxx MESSAGE 消息
12 —— Reserve
13 4’b0000 RESPONSE no data 不带有效数据的响应包
13 4’b1000 RESPONSE with data 带有效数据的响应包
14~15 —— Reserve

原子是指不可被进一步分割的最小粒子。
原子操作则是指不会被线程调度机制打断的操作。这种操作一旦开始,就一直运行到结束,操作顺序不可被打断,也不可被切割只可执行其中一小部分。
原子操作 - 百度百科

流写是指面向大数据量DMA传输优化写数据。
DMA - 百度百科
DMA原理介绍
DMA之理解

下面根据上表中不同的包类型(事务类型)描述具体的操作过程和包组成。

三、I/O逻辑操作与包格式

3.1 引言

I/O逻辑操作是指针对RapidIO存储空间的基本读写,正如前文所述,是基于请求和响应事务对来完成。

在Initiator和Target之间可能有多层交换结构Fabric,从Fabric的角度看,请求事务和与之对应的响应事务间并没有明确的对应关系,而且Fabric也不区分不跟踪请求和响应事务,Fabric只负责转发。

在 RapidIO体系结构中定义了5种基本的I/O操作,包括读(NREAD、RESPONSE)、写(NWRITE)、流写(SWRITE)、有响应写(NWRITE_R、RESPONSE)、原子操作(ATOMIC、RESPONSE),下面作详细介绍

下面将先介绍这几个IO操作,之后再介绍不同事务的请求包和响应包格式。

3.2 常用的I/O逻辑操作

读操作(NREAD, RESPONSE with data)

读操作由一个NREAD事务和一个RESPONSE with data事务组成。

● NREAD:由请求方(Initiator or Requestor)发起,表示读目标地址的数据

● RESPONSE with data:目标方(Target or Destination)正确处理请求方发过来的请求以后,给请求方反馈正确的响应以及请求方读取的数据。

整个操作的示意图如下所示

串行RapidIO(Serial RapidIO,SRIO):协议介绍_第4张图片

写操作(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事务的操作示意图如下图所示

串行RapidIO(Serial RapidIO,SRIO):协议介绍_第5张图片

带响应的写操作(NWRITE_R,RESPONSE with no data)

带响应的写操作(write-with-response operations)由NWRITE_R事务和RESPONSE事务组成。

● NWRITE_R:与NWRITE事务的请求操作完全相同,即向目标地址写入数据

● RESPONSE with no data :目标方正确处理请求方的NWRITE_R事务以后,目标方会反馈一个响应包告诉请求方事务已经被正确的处理。

这种机制可以有效的保证数据传输的稳定性。NWRITE_R事务的处理流程如下图所示

串行RapidIO(Serial RapidIO,SRIO):协议介绍_第6张图片

原子操作(Atomic Operations, RESPONSE with data)

原子操作(Atomic Operations)又叫做读-修改-写操作(Read-modify-Write Operations),它是由ATOMIC事务和RESPONSE事务组成。

Atomic事务不可被打断,许多协处理器单元使用原子操作来执行非一致性(non-coherent)存储器的同步。它允许携带的数据量为一个字(4个字节),一个半字(2个字节)或者一个字节,其他数据量都是不被允许的。

Atomic类事务有5种,包括:

● Atomic increment:请求方先向目标方发起Atomic increment操作并告知其地址,之后目标方读取指定地址的数据并响应给请求方。请求方将该数据+1,再令目标方写入原地址,目标方写入之后再响应给请求方写入完成。整个操作完成。

● Atomic decrement:与Atomic increment流程相同,只不过请求方对数据的操作为减1。

● Atomic set:指定地址中的数据每个bit全部写1

● Atomic clear:指定地址中的数据每个bit全部写0

● Atomic test and swap:对指定地址的数据进行测试和交换(不懂测试的含义)

原子操作的目标数据可以用NWRITE事务进行初始化。

● RESPONSE:在执行原子操作的过程中,需要目标方对请求方反馈数据,或是响应请求。有时需要带数据有时则不需要

原子操作的整个操作示意图如下图所示

串行RapidIO(Serial RapidIO,SRIO):协议介绍_第7张图片

3.3 请求包格式(Ftype = 2、5、6)

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

串行RapidIO(Serial RapidIO,SRIO):协议介绍_第8张图片

对于用户来说,最需要关注的就是逻辑层(上图中蓝色部分) 各个字段的含义,Ftype与Ttype两个字段唯一的确定了包的类型,具体请参考2.2节表格。

逻辑层各个字段的含义如下表所示

Ftype Transaction 事务类型 功能
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相比,此方式效率最高
字段 含义
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 要传输的数据

3.4 响应包格式(Ftype = 13)

当一个RapidIO端点(发起器件Initiator)完成由另一个RapidIO端点(目标器件Target)发起的请求时,该端点就会发送一个响应事务。

响应事务包与请求事务包有相同的发送方式和路由方式。

Ftype = 13的响应包响应除维护(Ftype = 8)和无响应写之外的所有请求包。维护响应包响应维护请求。

一个典型的响应包的格式如下图所示

串行RapidIO(Serial RapidIO,SRIO):协议介绍_第9张图片

逻辑层各个字段的含义如下表所示

Ftype Transaction 事务类型 功能
13 4'b0000 Reserve
4'b0001~4'b0111 Response with data 携带数据的响应
4'b1000 Reserve
4'b1001~4'b1111 Response with no data 不携带数据的响应
字段 取值范围 含义
Status 4'b0000 DONE:请求事务得到了正确的回应
4'b0001~4'b0110 Reserve
4'b0111 ERROR:请求事务出现了不可恢复的错误,未能得到正确的响应
4'b1000~4'b1011 Reserve
4'b1100~4'b1111 用户自定义响应
Target TID —— 目标事务ID(Transaction ID)号
Data Payload —— 响应包携带的数据。如果是不携带数据的响应,那么这个字段就不存在

四、维护操作与包格式(Ftype = 8)

维护事务(Ftype = 8)用于访问 RapidIO能力寄存器(CARs,Capability Registers)、命令和状态奇存器( CSRs,Command and Status Registers) ,本地定义的寄存器(Locally-Refined Registers)以及数据结构(Data Structures)。

第8类包不含地址字段,只含写请求和读响应的数据载荷。

维护事务的请求包格式如下图所示

串行RapidIO(Serial RapidIO,SRIO):协议介绍_第10张图片

维护事务的响应包格式如下图所示

串行RapidIO(Serial RapidIO,SRIO):协议介绍_第11张图片

维护事务包格式中逻辑层部分字段(Hopcount字段不属于逻辑层,下表同样列出它的含义)的含义如下表所示

Ftype Transaction 事务类型 功能
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 request 指定一个维护写端口请求
4'b0101~4'b1111 Reserve 保留
字段 取值范围 含义
Wrsize/Rdsize 规定了多双字事务数据载荷的最大长度。数据载荷的长度不能超过这个最大长度,维护读请求和维护请求都产生正确的维护响应。这个字段配合wdptr(word pointer)字段一起使用
Wdptr 字指针(Word pointer),配合Wrsize/Rdsize字段来指明数据的大小以及对齐方式,详细的说明请查看《RapidIO_Rev_2.2_Specification》第33页
Hopcount 跳数是一个8-bit字段,用于确定维护事务的目标交换器件。RapidIO交换器件没有器件ID,跳数是可供选择的寻址交换器件机制
Config Offset 用于读写CAR/CSR寄存器的双字偏移量
Src TID 维护请求包的事务ID
Target TID 维护响应包的事务ID
Status 4'b0000 DONE状态:表明请求的事务成功完成
4'b0000~4'b0110 Reserve
4'b0111 ERROR状态:检查到不可恢复的错误
4'b1000~4'b1011 Reserve
4'b1100~4'b1111 用户自定义

维护操作由维护请求事务和维护响应事务组成,处理器可以通过这类事务访问CARs/CSRs等寄存器中的数据。

如果发起的维护请求事务需要一个响应,那么目标方正确处理了维护请求事务以后会给请求方反馈一个维护响应包(MAINTANCE read response 或 MAINTANCE write response)而不是由NWRITE_R事务或NREAD事务产生的正常响应包(Ftype =13)。

它支持读取配置寄存器的操作执行长度是字(4字节),也可以是双字( 8字节)或设计者自已指定的双字的整数倍长,但执行长度最多不得超过64 字节。所有写配置寄存器的操作的执行长度规定与读操作相同。

维护操作的示意图如下图所示
串行RapidIO(Serial RapidIO,SRIO):协议介绍_第12张图片

五、消息操作与包格式

5.1 引言

当数据必须被系统中的多个处理器件共享时,必须由协议维护和管理多个器件对共享数据的临时占用,许多嵌入式系统用软件机制实现该协议。

如果存储器空间可被多个器件访问,可以使用信号量(semaphores,也称旗语)、自旋锁(spin lock)和处理器间中断来保证器件间正确的访问次序,即线程同步。在其他情况下,处理部件可能只有访问本地存储器空间的权利。

在这些“非共享”的系统中,需要一种机制把数据从一个处理器件传递到另一个器件。使用消息传递(Message Passing)信箱(Mailbox)可以实现这种机制。

对于RapidIO而言,提供了一种有用的消息传递机制, RapidlO消息传递协议描述了支持信箱和门铃通信的事务

● RapidIO信箱是一个端口,器件间可通过它发送消息。接收器件在消息到达后对其进行处理。RapidIO消息的长度从0到4096字节不等。一个接收器件有1~4个可寻址消息队列来捕获输人的消息。

● RapidIO门铃 (Doorbell )是一种基于端口的轻量级事务,可用于带内(in-band)中断。门铃消息包括一个由软件定义的16位字段,该字段可用来在两个器件间传达多种不同意图的消息。

除了上述的消息传递系统,其实最常见的还是使用直接存储器访问(Direct Memory Access, DMA)

DMA (直接存储器访问) - 百度百科
DMA原理介绍
DMA之理解

这DMA与消息传递两种模型的主要差别是,DMA事务由源端操纵,而消息由目标端操纵。即DMA源端不仅需要访问目标,还必须知道目标的地址空间。
消息的源端仅需访问目标,而不需要对目标地址空间的可见性。在分布式系统中,通常DMA和消息机制是结合使用的。

消息模型

RapidIO体系结构包括一种可以用于消息的包传输机制。RapidIO消息模型应满足下列目标:

1、消息由一个或多个事务组成,这些事务可以通过无序的互连发送和接收。

2、发送者可以有多个正在排队等待发送的未完成的消息。

3、发送者可以在低优先级消息前发送高优先级消息,也可以为了发送一个高优先级消息而抢占低优先级消息,并在高优先级消息完成后恢复低优先级消息(基于优先级的并发性)。

4、发送者无需了解接收者的内部结构或存储器映射。

5、消息接收者控制它本身的本地地址空间。

6、如果需要,接收者可以有多个未完成的正在排队等待服务的消息。

7、如果需要,接收者可以接收多个并发的多事务(multiple-transaction)消息。

RapidIO消息传递逻辑规范定义了两种不同的包格式用于消息事务:

第10类包格式(Ftype = 10)用来发送非常短的16位数据载荷,也称为门铃(DOORBELL)事务,门铃事务很适合发送处理器间的中断。

多事务消息(MESSAGE)用第11类包发送最多4096字节的数据载荷。

下面将分别介绍两种事务

5.2 门铃事务(DOORBELL,Ftype = 10)

门铃事务格式没有数据载荷。
串行RapidIO(Serial RapidIO,SRIO):协议介绍_第13张图片

Ftype Reserved 事务类型 功能
10 8'b0 DOORBELL 门铃事务
字段 取值范围 含义
Source TID 请求方的事务ID
Info(msb) 发送信息的高8位
Info(lsb) 发送信息的低8位。 如果信息是用数字表示的,而且长度大于8位,那么数据符合低地址存放高字节(big-endian)的格式。比特流中先到达的是高字节。

门铃事务适合向处理器递送中断信息,在这种情况下,信息字段用来向接收者传递中断级别和目标信息,除此以外,还可以在处理器件间发送信号量。

一个完整的门铃操作由DOORBELL事务和RESPONSE事务(通常是DONE响应)组成。处理单元用这个操作将非常短的消息通过Fabric发送到另一个处理器部件。

门铃事务包括用于保持事务信息的信息字段。该事务没有数据载荷。它的信息字段是由软件定义的,可以用于任何目的。通常,运行在处理器上的操作系统会定义门铃事务使用的信息字段的意义。

收到门铃事务的处理器部件将包放进处理器部件中的门铃消息队列,该队列可以在硬件或者本地存储器中实现。

一个完整的门铃操作如下图所示

串行RapidIO(Serial RapidIO,SRIO):协议介绍_第14张图片

5.3 消息事务(MESSAGE, Ftype = 11)

第11类包为消息事务格式包,总有数据载荷(Data Payload),并且数据载荷长度总是双字(64-bits或8-bytes)长度的整数倍,最大的消息操作载荷是4096字节,该载荷由16个消息事务组成,每个事务携带256字节的数据载荷。完成一次数据消息操作最多需要16个单独的消息事务。

一个消息请求包的格式如下图所示:

串行RapidIO(Serial RapidIO,SRIO):协议介绍_第15张图片

图中逻辑层各个字段的含义如下表所示

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取0000_00 ~ 1111_11分别对应着mailbox编号0 ~ 63

消息标识符信息:包括信箱mbox、消息分段msgseg和消息长度msglen,用于计算应该把事务数据存放在本地存储器的什么位置。

例如,假设接受处理部件的信箱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字节)

基于公式:

目标地址 = 信箱2基地址(Mailbox_2_base) + (消息分段 x 标准长度)

计算该数据消息所含的32字节数据存放到本地存储器地址0x3040,即0x3000 + (0x0002 x 0x0020) = 0x3040

这个简单的寻址结构使得接收处理部件很容易计算存储消息数据的目标存储结构的地址。不仅计算起来容易,而且接收者的目标存储器结构的位置对发送者也是不可见的。这允许仅在处理器部件间提供基于消息通信的安全系统研发工作。

消息的响应事务(RESPONSE, Ftype = 13)

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

其中消息响应包中逻辑层Ftype字段,Ttype字段,Status字段以及Data Payload字段的含义与普通响应包中各字段的含义完全相同(见3.4节)。

Target_info字段由letter,mbox和msgseg三个字段组成,这三个字段的含义与消息请求包中这三个字段的含义完全相同(见5.3节),惟一地标识系统中每个请求和响应部件对的消息包,与其他请求类型使用的事务 ID的作用一样。

串行RapidIO(Serial RapidIO,SRIO):协议介绍_第16张图片

由消息和响应(一般是DONE响应)事务组成的数据消息操作如下图所示,处理部件的支持消息传递的硬件用它向另一个处理部件发送数据消息。

串行RapidIO(Serial RapidIO,SRIO):协议介绍_第17张图片

六、总结

RapidIO的事务大致就上面几种,下图把所有的事务都放在一起以便于大家更快的查看相关的包格式与各个字段的位置。

串行RapidIO(Serial RapidIO,SRIO):协议介绍_第18张图片

这里有几点值得注意的是:

1、 每个包的逻辑层字段与上文所讲的各个包的逻辑层字段定义完全相同

2、 上图物理层字段的前10位所代表的字段ackID,rsvd,crf以及prio与正文中包格式的物理层字段有所出入,这是因为正文所讲解的包都是并行物理层的包格式,而上图中是串行物理层的包格式,所以物理层字段会有一点点区别。

3、 上图每个包CRC字段的后面还有一些字段是正文中包格式所没有讲到的。

这里特地解释一下:由于RapidIO包的总长度大于80个字节以后,RapidIO包会对前80个字节生成一个2字节CRC码并补0使字节边界对齐。然后80字节以上的数据放在处理完毕以后的数据后面继续发送,发送完毕以后生成第二个CRC码并补0使字节边界再次对齐,其中第二个CRC校验码是第一个CRC校验码的延续。因此上图中会出现后面的那些字段。后面我会写一篇博客教大家怎么使用RapidIO核,到时候看完这种大于80字节传输的时序图就能明白这个过程了。

你可能感兴趣的:(标准总线接口协议,fpga开发,数字IC)