赞
踩
1、SRIO简介
SRIO是面向嵌入式系统开发提出的高可靠、高性能、基于包交换的新一代高速互联技术,已于2004年被国际标准化组织(ISO)和国际电工协会(IEC)批准为ISO/IECDIS 18372标准。SRIO则是面向串行背板、DSP和相关串行数据平面连接应用的串行RapidIO接口。串行RapidIO包含一个3层结构的协议,即物理层、传输层、逻辑层。物理层定义电气特性、链路控制、低级错误管理、底层流控制数据;传输层定义包交换、路由和寻址机制;逻辑层定义总体协议和包格式。可以实现最低引脚数量,采用DMA传输,支持复杂的可扩展拓扑,多点传输;可选的1.25 Gbps、2.5 Gbps、3.125 Gbps和5Gbps四种速度能满足不同应用需求。主要用于在微处理器、DSP、通信和网络处理器、系统内存和外围设备之间传递数据和控制信息。RapidIO 适用于点对点的设备间通讯,不需要经过一个中央处理器进行调度,就可以完成设备间的通讯,并且包长度简单,效率相对于PCIe要更高,有效数据传输速度更快。
在 RapidIO体系结构中定义了6种基本的I/O操作, 下表给出了这6种基本的I/O操作、用来执行相应操作的事务和对操作的描述:
操作 | 使用的事务 | 描述 |
读 | NREAD、RESPONSE | 从目标器件中读数据 |
写 | NWRITE | 往目标器件中写数据 |
有响应写 | NWRITE_R、RESPONSE | 往目标器件中写数据,写完后等待目标响应 |
流写 | SWRITE | 面向大数据量DMA传输优化写数据 |
Atomic | ATOMIC、RESPPONSE | 原子操作,读-修改-写,事务不能被打断 |
维护 | MAINTENANCE | 以RapidIO专用寄存器为目标的事务 |
2、请求包格式
RapidIO处理器发起一个请求包给目标器件,目标器件收到这个请求包后给一个响应包到处理器(这个请求包需要目标器件的响应),比如存储器读操作。
一个完整的数据请求包如下,红色标注部分是逻辑层的相关信号:
包信息 | S | AclkID | Rsrv | Prio | TT | Ftype | Target Address | Source Address |
位宽 | 1 | 3 | 4 | 2 | 2 | 4 | 8or16 | 8or16 |
Transaction | Size | Source TID | Deivce Offset Address | Optional Data Payload | CRC | |||
4 | 4 | 8 | 32,48,64 | 8 to 256(Bytes) | 2 |
在整个字段中,Ftype和Ttype两个字段唯一的确定了包的类型,各字段的含义如下表所示:
字段 | 含义 |
Ftype | 格式类型,与Ttype共同确定包的格式 |
Ttype | 事务类型,与Ftype共同确定包的格式 |
Wrsize/Rdsize | 该字段根据包的类型来决定是写事务数据的大小还是读事务数据的大小,这个字段配合wdptr字段一起使用 |
Src TID | 包的事务ID号 |
Extended Addrss | 扩展地址,这是一个可选字段,指定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 | 要传输的数据(8~256 Bytes) |
3、响应包格式
当一个RapidIO端点完成由另一个RapidIO端点发起的请求时,该端点就会发送一个响应事务。响应事务包总是以与请求事务包相同的方式被发送和路由。从广义上说,第12、13、14 和15类格式(Ftype=12表示的就是第12类格式)是响应类事务的格式。通常,第 12和14类是保留的,第15类由具体应用定义, 第13类才是主要的响应类事务。第13类包格式返回状态,数据(如果需要)和请求者的事务ID。带有“ERROR”状态或没有预期的数据裁荷的响应的RESPONSE包没有数据载荷。响应包使用第13类格式来响应除维护和无响应写之外的所有请求包。
一个完整的数据响应包格式如下,红色标注部分是逻辑层的相关信号:
包信息 | S | AclkID | Rsrv | Prio | TT | Ftype | Target Address | Source Address |
位宽 | 1 | 3 | 4 | 2 | 2 | 4 | 8or16 | 8or16 |
Transaction | Status | Source TID | Optional Data Payload | CRC | ||||
4 | 4 | 8 | 8 to 256(Bytes) | 2 |
维护响应包响应维护请求。响应包的逻辑层各个字段含义如下:
字段 | 值 | 含义 |
Ftype | 4’b1101 | 格式类型,与Ttype一起确定包的格式,对于一个有效的响应包来说,此字段的值固定为4’b1101,也就是16进制的d |
Ttype | 4’b0000 | 不携带数据的响应 |
4’b0001~4’b0111 | 保留 | |
4’b1000 | 携带数据的响应 | |
4’b0001~4’b0110 | 保留 | |
Status | 4’b0000 | DONE状态:表示请求事务得到了正确的响应 |
4’b0001~4’b0110 | 保留 | |
4’b0111 | ERROR状态:表示请求事务出现了不可恢复的错误,未能得到正确的响应 | |
4’b1000~4’b1011 | 保留 | |
4’b1100~4’b1111 | 用户可自定义响应 | |
Target TID | 目标事务号 | |
Data Payload | 响应包携带的数据,如果是不携带数据的响应,那么这个字段就不存在 |
4、I/O读写操作
4.1 读操作
读操作由一个NREAD事务和一个RESPONSE事务组成,NREAD事务由请求方(Requestor)发起,目标方(Destination)正确的处理请求方发过来的响应以后会给请求方反馈正确的响应以及请求方读取的数据。
4.2 写操作和流写操作
写操作(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事务不需要接收目标方的响应,所以当事务被目标方处理完以后并不会给发起方反馈任何信息。
4.3 带响应的写操作
带响应的写操作(write-with-response operations)由NWRITE_R事务和RESPONSE事务组成。它的整个请求操作和NWRITE事务的请求操作完全相同,但是在目标方正确处理请求方的NWRITE_R事务以后,目标方会给请求方反馈一个响应包告诉请求方事务已经被正确的处理。这种机制可以有效的保证数据传输的稳定性。
4.4 原子操作
原子操作(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事务进行初始化。
I/O事务的端口类型是AXI4-Stream类型,维护事务的端口类型是AXI4-Lite类型。
默认情况下,例子工程会使用srio_request_gen.v模块和srio_quick_start.v模块来产生I/O事务与维护事务。其中instruction_list.vh头文件定义了待发送的I/O事务,maintenance_list.vh头文件定义了待发送的维护事务。
注意:每个srio_request_gen.v模块会消耗一个块RAM(Block RAM),每个srio_response_gen.v模块会消耗两个块RAM(Block RAM)。
5、SRIO IP内部结构
SRIO IP主要由物理层(Physical Layer)、逻辑和传输层(Logical (I/O) and Transport Layer (LOG))、缓冲区(Buffer Design (BUF))三个部分组成;
6、 逻辑层接口
逻辑层接口被划分为几个模块来控制并解析发送和接收数据包。逻辑层分为三个接口:用户接口、传输接口、配置接口。
用户接口:包括能发起和接收包的端口。当生成IP核的时候可以配置端口的数目和事务类型,同时也能通过AXI4-Lite接口发起维护事务对本地或者远程的寄存器进行访问与配置。用户接口包括三个可选的端口分别为消息端口(Messaging Port),维护端口(Maintenance Port)和用户自定义端口(User-Defined Port)。
传输接口:包含发送和接收两个端口,它是用来连接中间的Buffer,对于RapidIO的顶层模块来说,这两个接口不可见。
配置接口:也包含两个端口。其中配置主机端口(Configuration Master Port)用来读写本地配置空间。逻辑配置寄存器端口(LOG Configuration Register Port),它可以用来读写一部分逻辑层或传输层配置寄存器。
7、HELLO包格式
为了简化RapidIO包的构建过程,RapidIO核的事务传输接口(ireq,treq,iresp,tresp)可以配置为HELLO(Header Encoded Logical Layer Optimized)格式。这种格式把包的包头(Header)域进行标准化,而且把包头和数据在接口上分开传输,这将简化控制逻辑并且允许数据与发送边界对齐,有助于数据的管理。 RapidIO协议不支持传输的数据量大于256字节的情况,并且逻辑层(Logical)也不能把大于256字节的数据量分割为小的数据量进行发送。
关于HELLO格式数据包传输的用户端传输协议;此段传输一共5个周期,第一个包头包含多种控制信号信息,后面四个周期分别对应4个DW数据传输。
图7-1 基础的HELLO数据包传输
根据不同的传输类型可以选择不同的Hello包,包头信息也有差别,HELLO包传输格式如下图所示(地址有效只有34位有效):
图7-2 HELLO数据包传输格式
该传输协议包括了一个背靠背数据包传输,在等待一个周期后又开始下一个数据包传输,下一个数据一个包头加上两个DW数据原则上3个周期就传输完成,但由于停顿(可能是处理其他事物)总共消耗了5个周期才传输完成;
图7-3 多个数据包传输
8、IP创建及介绍
在vivado 2017.4版本中可以创建Serial RapidIO Gen2 IP,可通过pg007_srio_gen2详细了解SRIO的相关接口信号和协议。
有关IP的创建、相关代码及仿真实现可阅读文章SRIO的IP例程及仿真实现。
9、PCIe转SRIO桥接芯片
井芯PRB0400是一款兼容PCIe Gen2和RapidIO Gen2协议的高性能数据传输桥接芯片,主要用于满足高可靠低延时计算处理系统内部各组件之间的互连需求,实现PCIe协议网络和RapidIO协议网络之间数据互联互通。
井芯PRB0400支持芯片到芯片、板到板间的高效能数据通信,可用于连接CPU、DSP、FPGA等构成的密集型电子系统,用于解决PCIe网络与RapidIO网络的连接问题,同时内嵌DMA引擎和消息传递引擎,可以在无需主控处理器弱参与的情况下实现大量数据的高效传输。
在系统设计上,井芯PRB0400可实现原位替代对标的国际产品,并兼容其官方驱动。此外,井芯PRB0400兼容国内主流CPU和DSP,并完成了对应的生态测试。目前已完成与飞腾、龙芯、x86、Zynq等PCIe RC设备对应的生态测试,实现了国际厂商相关产品在硬件和软件两个层面的原位替代。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。