参考:串行RapidIO: 高性能嵌入式互连技术 | 德州仪器
SRIO协议技术分析 - 知乎
PG007
目录
一、SRIO介绍
1.1 概要
1.2 SRIO与传统互联方式的比较
1.3 串行SRIO标准
1.4 SRIO层次结构:
1.4.1 逻辑层
1.4.2 传输层协议
1.4.3 物理层
二、Xilinx SRIO系统架构
1、速度等级支持
2、架构
2.2.1 逻辑层接口
2.2.1.1 I/O Port
2.2.1.2 Message Port:
2.2.1.3 Maintenance port:
2.2.1.4 User-Defined Port:
3、BUFFER
4、Physical Layer Interface
5、 Clocking
三、SRIO传输包格式
3.1 HELLO 包格式
3.2 HELLO传输报文的大小要求
四、SRIO事务类型
一、SRIO介绍
1.1 概要
在嵌入式系统应用领域,DSP,FPGA,PowerPC等嵌入式处理器的出现后,工程师将多种处理器组合,形成模块。模块通过背板相连,形成整机,实现更大的系统应用。新的嵌入式系统互联结构必须具备以下特点:
- 架构独立,不依赖具体的硬件和软件。
- 灵活的拓扑结构,不局限于PC架构的星状结构。
- 传输速率高,并向下兼容。
- 具有流控功能,错误校验及广播功能。
- 具有分层结构,后续功能扩展不影响其他层次
针对以上需求,2000年,存储领域的OEM和FPGA/DSP/交换结构芯片制造商成立了RapidIO Trade Association 组织。提供了一种针对嵌入式运用的低延时的、基于包交换与分发结构的新型总线结构,被命名为RapidIO,又被成为SRIO。
SRIO支持3C连接:Chip-to-Chip、Card-to-Card、Chassis-to-Chassis。
(1)从灵活性的角度来说,SRIO协议可支持嵌入式系统的星状、网状、环状、树状及菊花链等多种拓扑结构。
(2)从架构独立性的角度来讲,SRIO协议是由硬件实现,所以对现存的操作系统和运用软件是透明的。它支持读、写、流、原子操作等及消息传递机制,应用层软件简单。
(3)从速率、带宽性能及可裁剪上讲,SRIO1.3版支持1.25、2.5、3.125Gbps。采用8B/10B编码,带宽利用率高。
1.2 SRIO与传统互联方式的比较
随着高性能嵌入式系统的不断发展,芯片间及板间互连对带宽、成本、灵活性及可靠性的要求越来越高,传统的互连方式,如处理器总线、PCI总线和以太网,都难以满足新的需求 。
1.3 串行SRIO标准
RapidIO行业协会成立于2000年,其宗旨是为嵌入式系统开发可靠的,高性能,基于包交换的互连技术。RapidIO协议的简要发展历史是:
- 2001年初,最初的标准被发布
- 2002年6月,1.2版标准发布
- 2005年6月,1.3版标注发布
串行RapidIO是物理层采用串行差分模拟信号传输的RapidIO标准。SRIO 1.x 标准支持的信号速度为1.25GHz、2.5GHz、3.125GHz;正在制定的RapidIO 2.0标准将支持5GHz、6.25GHz.
目前,几乎所有的嵌入式系统芯片及设备供应商都加入了RapidIO行业协会。
1.4 SRIO层次结构:
RapidIO标准被定义为三个层:逻辑层、传输层和物理层。
逻辑层定义了总体协议和数据包格式。这是端点启动和完成事务所必需的信息。
传输层提供了数据包从端点移动到端点所需的路由信息。
物理层描述了设备级的接口细节,如数据包传输机制、流量控制、电气特性和低级错误管理。此分区提供了向逻辑规范中添加新的事务类型的灵活性,而不需要对传输或物理层规范进行修改。
像以太网一样,RapidIO也是基于包交换的互连技术。RapidIO包由包头、可选的载荷数据和16bits CRC校验组成。包头的长度因为包类型不同可能是十几到二十几个字节。每包的载荷数据长度不超过256字节,这有利于减少传输时延,简化硬件实现。下图包格式定义兼顾了包效率及组包/解包的简单性。RapidIO交换器件仅需解析前后16bits,以及源/目地器件ID,这简化了交换器件的实现。
1.4.1 逻辑层
逻辑层定义了操作协议和相应的包格式。RapidIO支持的逻辑层业务主要是:直接IO/DMA (Direct IO/Direct Memory Access)和消息传递(Message Passing)。
直接IO/DMA模式是最简单实用的传输方式,其前提是主设备知道被访问端的存储器映射。在这种模式下,主设备可以直接读写从设备的存储器。直接IO/DMA在被访问端的功能往往完全由硬件实现,所以被访问的器件不会有任何软件负担。
对上层应用来说,发起直接IO/DMA传输主要需提供以下参数:目地器件ID、数据长度、数据在目地器件存储器中的地址。
直接IO/DMA模式又可进一步分为以下几种传输格式:
- NWRITE: 写操作,不要求接收端响应。
- NWRITE_R: 带响应的NWRITE(NWRITE with Response),要求接收端响应。
- SWRITE:流写(Stream Write),数据长度必须是8字节的整数倍,不要求接收端响应。
- NREAD: 读操作。
SWRITE是最高效的传输格式;带响应的写操作或读操作效率则较低,一般只能达到不带响应的传输的效率的一半。
消息传递(Message Passing)模式则类似于以太网的传输方式,它不要求主设备知道被访问设备的存储器状况。数据在被访问设备中的位置则由邮箱号(类似于以太网协议中的端口号)确定。从设备根据接收到的包的邮箱号把数据保存到对应的缓冲区,这一过程往往无法完全由硬件实现,而需要软件协助,所以会带来一些软件负担。
下表比较了直接IO/DMA和消息传递模式。
1.4.2 传输层协议
RapidIO是基于包交换的互连技术,传输层定义了包交换的路由和寻址机制。
RapidIO网络主要由两种器件,终端器件(End Point)和交换器件(Switch)组成。终端器件是数据包的源或目的地,不同的终端器件以器件ID来区分。RapidIO支持8 bits 或 16 bits器件ID,因此一个RapidIO网络最多可容纳256或65536个终端器件。与以太网类似,RapidIO也支持广播或组播,每个终端器件除了独有的器件ID外,还可配置广播或组播ID。交换器件根据包的目地器件ID进行包的转发,交换器件本身没有器件ID。
RapidIO的互连拓扑结构非常灵活,除了通过交换器件外,两个终端器件也可直接互连
1.4.3 物理层
为了支持全双工传输,串行RapidIO收发信号是独立的,所以每一个串行RapidIO口由4根信号线组成。标准的1x/4x 串行RapidIO接口,支持四个口,共16根信号线。这四个口可被用作独立的接口传输不同的数据;也可合并在一起当作一个接口使用,以提高单一接口的吞吐量。
下图为德州仪器TMS320C6455 DSP 1x/4x 串行RapidIO接口框图
发送时,逻辑层和传输层将组好的包经过CRC编码后被送到物理层的FIFO中,“8b/10b编码”模块将每8bit数据编码成10bits数据,“并/串转换”模块将10bits并行数据转换成串行bits,发送模块把数字bit转换成差分交流耦合信号在信号线上发送出去。这里的8b/10编码的主要作用是:
- 保证信号有足够的跳变,以便于接收方恢复时钟。串行RapidIO没有专门的时钟信号线,接收端靠数据信号的跳变恢复时钟。所以需要把信号跳变少的8bits数据(如全0或全1)编码成有一定跳变的10bits数据。另外,也使得总体数据中0和1的个数均衡,以消除直流分量,保证交流耦合特性;
- 8b/10编码可扩大符号空间,以承载带内控制符号。10bits能表示1024个符号,其中256个表示有效的8bits数据,剩下的符号中的几十个被用作控制符号。控制符号可被用作包分隔符,响应标志,或用于链路初始化,链路控制等功能;
- 8b/10编码能实现一定的检错功能。1024个符号中,除了256个有效数据符号和几十个控制符号外,其它符号都是非法的,接收方收到非法符号则表示链路传输出错。
接收的过程则正好相反,首先接收方需要根据数据信号的跳变恢复出时钟,用这个时钟采样串行信号,将串行信号转换为10bits的并行信号,再按8b/10b编码规则解码得到8bits数据,最后做CRC校验并送上层处理。
数据被正确的接收时,接收端会发送一个ACK响应包给发送端;如果数据不正确(CRC错或非法的10bits符号),则会送NACK包,要求发送方重传。这种重传纠错的功能由物理层完成,而物理层功能往往由硬件实现,所以不需要软件干预。
二、Xilinx SRIO系统架构
1、速度等级支持
SRIO IP核支持1x 2x 4x Line Width,单个Lane的速度支持1.25Gbps、2.5Gbps、3.125Gbps、5.0Gbps、6.25Gbps。(所以用到的应该是CPLL)
2、架构
主要包括:逻辑层(LOG)、共享BUFFER(BUF)、PHY层(PHY)
LOG:只要定义传输的事务,以及具体的帧结构。
BUF:共享BUFFER,主要用来进行跨时钟域,因为逻辑层和PHY层之间的时钟是不同的。
PHY:主要用来进行数据编码、流控、字节对齐等功能。
2.2.1 逻辑层接口
主要包括:
用户接口:用户接口主要包括I/O接口和三个可选的接口 (消息接口、维护接口、用户定义接口)。主要看一下I/O Port。
2.2.1.1 I/O Port
I/O接口所支持的基本操作如下:
操作 | 使用的事务 | 描述 |
读 | NREAD、RESPONSE | 从目标器件中读数据 |
写 | NWRITE | 向目标器件写数据 |
带响应的写 | NWRITE_R | 向目标器件写数据,目标器件执行完之后回复响应 |
流写 | SWIRTE | 大量数据写操作 |
门铃 | DOORBELL |
I/O Port支持的报文格式:HELLO 报文、SRIO Stream报文
I/O支持两种接口格式:
Condensed I/O:Condensed I/O就是一种压缩的数据接口。一个AXI-Stream通道用来传输所有的与发送相关的所有包类型,一个AXI-Stream通道用来接收所有的与接收相关的所有包类型。
Initiator/Target Port:一种标准的接口,将不同的事务传输进行分离。主要分为4个接口,如下图
ireq:用来发送本地生成的请求。
iresp:用来接收对端发送过来的响应。
treq:用来接收对端的请求。
tresp:用来向对端发送响应。
2.2.1.2 Message Port:
Message Port主要用来传输消息事务,但消息事务也可以使用I/O端口。消息传递端口是一个可选的接口(消息也可以组合到I/O端口上,并使用Vivado集成设计环境(IDE)设置将其视为写入事务)。一个单独的消息传递端口遵循启动器/目标样式。启动器/目标端口样式允许将针对远程设备的事务与针对本地端点的事务分离。
2.2.1.3 Maintenance port:
用来传输维护数据包。如果启用了维护端口,则它将使用AXI4-Lite接口。AXI4-Lite界面允许用户应用程序定位本地或远程配置空间。
2.2.1.4 User-Defined Port:
如果是用户自定义的数据,则应该使用User-Defined Port,用户自定义的数据包传输到其它的接口会被丢弃。用户定义的端口是一个可选的端口,它有两个AXI4-流通道,其中一个通道用于传输方向,另一个通道用于接收方向。用户定义的端口仅使用SRIO流格式。
3、BUFFER
Buffer支持8、16、32个数据包的深度,可以tx缓冲区和rx缓冲区。
TX缓冲区是一个存储和转发缓冲区,旨在为低的包到包的延迟来最大限度地提高流吞吐量。传输缓冲区必须保存每个包,直到它被链路伙伴设备成功接收为止,此时包被释放,为额外的包腾出空间。在缓冲区中积累多个未发送包的情况下,通常发生在流控制时,BUF根据类型和优先级对包进行重新排序,首先发出响应包,然后发出请求。BUF还可以在必要时处理跨时钟与处理。在生成IP核时,可以添加或删除跨时钟域逻辑。(在多lane时,跨时钟域逻辑是非常推荐的)
接收缓冲区作为FIFO,用于将数据存储和转发到LOG接收路径中。接收缓冲区还具有跨时钟域逻辑,它允许逻辑层/用户设计和PHY以不同的时钟速率运行。与传输缓冲区设计一样,这种逻辑被推荐用于多lane。
4、Physical Layer Interface
物理层(PHY)处理链路训练(链路建立)、初始化和协议。在这个工作中包括插入CRC和确认标识符到输出的数据包。PHY还可以与串行收发器进行接口。
5、 Clocking
PHY可以在两个时钟域上运行: phy_clk,这是主核心时钟,和gt_pcs_clk,这是用于串行收发器接口。gt_clk不由PHY使用,但由串行收发器接口使用。gt_pcs_clk是gt_clk速率的一半。作为一般规则,phy_clk等于(gt_clk *操作链路宽度)/4。所以对于一个2x的核,phy_clk的频率是gt_clk的一半。如果核心列车下降到1x模式,phy_clk必须切换到gt_clk速率的四分之一。串行收发器还需要一个使用收发器的的参考时钟(refclk)。当生成核心时,参考时钟频率被选择(可用选项取决于体系结构和线路速率。
时钟 | 频率关系 | |
phy_clk | phy_clk = (gt_clk * link width)/4 | 主要的核时钟 |
gt_pcs_clk | gt_pcs_clk = 1/2 * gt_clk | 主要终于Serial Transceiver interface |
refclk | 见下表 | 用于Serial Transceiver interface |
log_clk | log_clk >=phy_clk | |
cfg_clk | cfg_clk = log_clk | 配置寄存器接口时钟 |
不同lane下的时钟关系:
对于7系列FPGAs,使用MMCM从串行收发器(GT)参考时钟生成时钟。时钟方案的方框图如下:
三、SRIO传输包格式
3.1 HELLO 包格式
为了简化数据包的构造,可以将用户接口端口配置为使用Header Encoded Logical Layer Optimized (HELLO) 格式。这种格式允许数据包类型的报头字段放置位置的标准化。它还将报头和数据分割成接口上单独的传输。这导致了更简单的控制逻辑,并允许数据对齐以传输边界,以简化数据管理。
字段 | 位置 | |
TID | [63:56] | 包的事务ID。SRIO规范只允许在给定的时间有一个给定TID和Source/Destination ID的未完成的数据包 |
FTYPE | [55:52] | 对于数据包的事务分类。HELLO报文所支持的FTYPE主要有2,5,6,A,B,D。根据生成IP核的选择,IP核可能只支持一个子集。 |
TTYPE | [51:48] | 数据包的事务类型。仅对FTYPE为2、5、13的数据包定义一些其它的功能。 |
priority | [46:45] | 数据包的优先级。请求数据包必须仅使用优先级0-2。响应包优先级应该是请求优先级+1 |
CRF | [44] | 数据包的关键请求流标志。 |
size | [43:36] | 数据有效负载大小,以字节为单位,减去1 |
Error(E) | [35] | 除了响应数据包之外,其他都是保留的。当此位被设置表示数据包错误。 |
address | [33:0] | 事务的字节地址。 |
info | [31:16] | 只用于DDRBELL数据包 |
msglen-1 | [63:60] | 构成消息序列的数据包数;仅适用于消息消息。 |
msgseg-1 | [59:56] | 此数据包所表示的消息段;仅适用于MESSAGEs。保留用于单段消息。 |
mailbox | [9:4] | 事务处理目标的邮箱;仅适用于消息包。除了单段消息外,还保留了上面的四个位。 |
letter | [1:0] | 仅为消息包使用的字母字段。指示邮箱中的一个插槽 |
S、E、R、xh、O、P | [63:56] | S-开始。如果设置,则该包是正在传输的新PDU的第一段。 E-结束。如果设置了,表示这一包是PDU的最后一段。如果S和E都设置了,则代表这一次PUD传输只有这一个数据包 R-保留 xh-不支持 O-奇数。如果设置了,负载的数量有奇数了半字。 P-Pad。如果设置了,那么Pad用于填充到半字节的边界。 |
cos | [43:36] | 服务分类 |
streamID | [31:16] | 端到端流量流标识符。 |
length | [15:0] | PDU的长度 |
3.2 HELLO传输报文的大小要求
HELLO数据包中的size字段是传输中的字节数减去一(有效范围为0到255,对应真实大小为1到256字节)。size和address字段必须与相应的RapidIO数据包类型的有效size、address和wdptr字段相对应。RapidIO核不能把Size域中的非法值修正为实际RapidIO包中Size域的有效值,所以需要对HELLO格式包的Size域提供一个正确的值。由于AXI4-Stream协议中tdata信号为8个字节,也就是一个双字(Double Word),所以Size域的值需要分两种情况讨论:传输的数据量小于8字节和传输的数据量大于8字节。
传输的数据量小于8字节(Sub-DWORD Accesses):
对于传输的数据量小于8字节的情况,address字段和size字段用来决定有效的字节位置(tkeep信号必须为0xff),但是仅仅能导致RapidIO包中rdsize/wrsize和wdptr为有效值的address和size值组合才是被允许的,下图是HELLO格式中address和size两个字段与有效字节位置的对应关系示意图(图中灰色部分为有效字节位置)
例如,对size=2,address=34’h1_1234_5675这两个组合来说,由于size=2,所以往address中写入的数据个数为3(size+1)个字节,而address的最低3位为5(3’b101),通过上图可知,有效字节的位置是第7、6、5三个字节。对于size和address[2:0]值的组合不在上图中的情况都是非法的,这是应该避免的,比如,size=2, address=34’h1_1234_5673这种组合就属于非法的组合。
传输的数据量大于8字节(Large Accesses):
对于传输的数据量大于8字节,并且地址的起始字节偏移不为0的情况必须把数据分成多次进行传输,其中未对齐的小于8字节的段就可以通过上图中size和address的有效组合来确定有效字节的位置。另一种解决办法是,读操作的数据量大小可以被增加到下一个支持的大小,然后从对应的响应中剥离出必要的数据。
因此,对于数据量为1个双字(8个字节)或更大的情况,address的最低3位必须为0,RapidIO手册给读写事务定义了范围从1到256个字节的可支持的数据量。请求事务的数据量如果大于一个双字(8个字节),那么数据量应该通过四舍五入到最接近的支持的值。读写事务有效的HELLO格式的数据量为:7,15,31,63,95(仅支持读事务),127,159(仅支持读事务),191(仅支持读事务),223(仅支持读事务)和255。
对于写事务的数据量介于以上这些支持的数据量中间的情况,在通道的tlast信号为1之前应该给RapidIO核提供必要的数据量,仅仅提供的数据才能被发送。同理,用户的设计提供的数据可能少于期望的数据量,那么实际的数据量应该被写入,传输应该假设完成。
RapidIO协议不支持传输的数据量大于256字节的情况,并且逻辑层(Logical)也不能把大于256字节的数据量分割为小的数据量进行发送。如果不满足这个要求可能会导致致命的链路错误,在这种错误情况下,链路可能会不断重传数据量大于256字节的包。
HELLO格式数据的包头(Header)在用户接口的第一个有效时钟上,如果发送的事务携带数据负载,那么数据负载紧接着包头(Header)后面进行连续发送。包的Source ID和Destination ID放在tuser信号中并与包头(Header)一样,在第一个有效时钟下进行发送,发送完毕以后,tuser信号的数据被忽略。
下图是携带有数据负载HELLO格式包在用户接口上传输的时序图,这个传输有4个双字(32个字节)的数据负载,加上包头,整个传输一共花费了5个时钟周期。用户只需要把想要发送的数据按照下图的时序图送入RapidIO核的AXI4-Stream接口,RapidIO核就能把它转化为标准的RapidiO串行物理层的包发出去从而完成一次事务的交互。
下图是一种更复杂的传输示意图。首先,有两个背靠背(back-to-back)单周期包(包不带数据负载,仅包含一个包头)。包的边界通过拉高tlast信号进行指示。在单周期包传输完毕以后,主机等待了一个时钟周期才开始发送下一个包。在发送第三个包的过程中,主机(Master)和从机(Slave)分别通过拉低tvalid和tready信号一个时钟周期来暂停数据的发送,由于第三个包的数据负载为2个双字,所以传输第三个包一共消耗了3个有效时钟,加上2个无效的时钟周期,一共消耗了5个时钟周期。
四、SRIO事务类型
SRIO(Serial Rapid IO)事务(transaction)类型有SRIO包(packet)中的Ftype和Ttype决定,其中比较重要的是:
Nread(Ftype = 2,Ttype = 4),功能是读制定的地址;
NWRITE(Ftype = 5,Ttype = 4)表示往指定的地址写数据;
NWRITE_R(Ftype = 5,Ttype = 5),表示往指定的地址写数据,写完之后接收目标期间的响应,即所谓的带响应的写;
SWRITE(Ftype = 6,Ttype 保留),表示以流写方式写指定的地址,与NWRITE以及NWRITE_R相比,这种方式效率最高;
DOOREBELL(Ftype = 10,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 | 无 |