目录

  • 前言:SRIO 、RapidIO、GT 有什么关系?
  • 一、SRIO IP核概述
    • 1.1. 概述
    • ​​​​​​​1.2 SRIO核架构
  • 二、接口介绍
    • 2.1. 逻辑层接口LOG(重点)
      • 2.1.1 I/O端口
      • 2.1.2 消息端口
      • 2.1.3 用户自定义端口
      • 2.1.4 维护端口
      • 2.1.5 状态(Status)
    • 2.2 Buffer接口BUF
    • 2.3 物理层接口PHY
    • 2.4 寄存器空间
  • 三、HELLO包格式(重点)
    • 3.1 HELLO格式及字段定义
    • 3.2两种传输情况
    • 3.3HELLO格式传输时序图
    • 3.4 AXI4-Stream协议
  • 四、SRIO Stream格式
  • 五、事务类型(重点)

本文是基于Xilinx平台SRIO介绍(二)SRIO IP核基础知识的内容作读书笔记。

前言:SRIO 、RapidIO、GT 有什么关系?

RapidIO :RapidIO是为满足和未来高性能嵌入式系统需求而设计的一种开放式互连技术标准。

SRIO :Serial RapidIO,即串行RapidIO;另外还有并行RapidIO。

GT :高速串行通信接口,因为FPGA在硬件上已经集成了GT高速串行通信接口,所以SRIO都以GT为物理层来实现SRIO通信协议。

一、SRIO IP核概述

1.1. 概述

RapidIO互连架构,与目前大多数流行的集成通信处理器、主机处理器和网络数字信号处理器兼容,是一种高性能、包交换的互连技术。它能够满足高性能嵌入式工业在系统内部互连中对可靠性、增加带宽,和更快的总线速度的需求。

RapidIO标准定义为三层:逻辑层、传输层和物理层。

逻辑层定义了总体协议和包格式。它包括了RapidIO设备发起和完成事务的必要信息。

传输层提供了RapidIO包传输过程中的路由信息。

物理层描述设备级接口细节,例如包传输机制、流控、电气特性和低级错误管理。

这种划分不需要对传输层或物理层规范进行修改,就可以灵活的给逻辑层规范添加新的事务类型。

RapidIO核的设计标准来源于RapidIO Interconnect Specification rev2.2,它支持1x,2x和4x三种模式,每通道的速度支持1.25Gbaud,2.5Gbaud,3.125Gbaud,5.0Gbaud和6.25Gbaud五种。

RapidIO核分为逻辑层(Logical Layer),缓冲(Buffer)和物理层(Physical Layer)三个部分。

​​​​​​​1.2 SRIO核架构

RapidIO核分为逻辑层(LOG),缓冲(BUF)和物理层(PHY)三个部分。如下图所示:

二、接口介绍

RapidIO核把三个子核封装在一起,它提供了一个高层次,低维护的接口。

先放一张总结性的脑图:

接下来我们详细介绍SRIO各子层的各个接口。

2.1. 逻辑层接口LOG(重点)

逻辑层(LOG)被划分成几个模块来控制并解析发送和接收数据包。逻辑层(LOG)有三个接口:用户接口(User Interface),传输接口(Transport Interface)和配置接口(Configuration Fabric Interface)。

下图是逻辑层接口的示意图:

用户接口:包括能发起和接收包的端口,是用户最需要关注的接口。当生成IP核的时候可以配置端口的数目和事务类型,同时也能通过AXI4-Lite接口发起维护事务对本地或者远程的寄存器进行访问与配置。

用户接口包含I/O端口集和三个可选的端口,三个可选的端口分别为消息端口(Messaging Port),维护端口(Maintenance Port)和用户自定义端口(User-Defined Port)。这些接口都在模块的顶层,每种事务类型都在指定的端口上传输。

其中,任何支持的I/O事务例如NWRITEs,NWRITE_Rs,SWRITEs,NREADs和RESPONSEs(不包括维护事务的responses)全部都在I/O端口上发送或者接收。

消息(Message)事务能在I/O端口传输或者在消息端口传输,这取决于是否在IP核的配置选择分离I/O端口与Message端口。

门铃(Doorbell)事务只能在I/O端口传输,而不能在Message端口上传输。

维护(Maintance)事务包只能在维护端口上传输。

如果事务是由用户自定义的一种不支持的类型,那么这类事务就可以在用户自定义端口上传输,如果用户自定义的端口在IP核的配置中未使能,那么用户自定义的包会被丢弃。

● 传输接口:包含发送和接收两个端口,它是用来连接中间的Buffer,对于RapidIO的顶层模块来说,这两个接口不可见。

● 配置接口:也包含两个端口。其中配置主机端口(Configuration Master Port)用来读写本地配置空间。逻辑配置寄存器端口(LOG Configuration Register Port),它可以用来读写一部分逻辑层或传输层配置寄存器。

2.1.1 I/O端口

I/O端口能被配置为两种类型:Condensed I/O 或 Initiator/Target。这两种类型可以在IP核的配置中进行选择。

I/O端口的数据流协议是AXI4-Stream协议,它支持两种类型的包格式,分别是HELLO格式与SRIO Stream格式。

Condensed I/O端口类型减少了用于发送和接收I/O包的端口数目。它只用一个AXI4-Stream通道来发送所有类型的包,同样,也只用一个AXI4-Stream通道去接收所有类型的包。Condensed I/O端口示意图如下:

Initiator/Target端口类型把请求事务与响应事务分别处理,所以一共有4个AXI4-Stream通道用于I/O事务的传输。Initiator/Target端口的示意图如下图所示,其中灰色的箭头表示请求事务,黑色的箭头表示响应事务。

各通道含义如下:

ireq:本地设备(Local Device)生成的请求在该通道发送

iresp:本地设备(Local Device)通过该通道接收远程设备(Remote Device)发来的响应包,以完成整个事务的交互过程。

treq:本地设备(Local Device)通过该通道接收远程设备(Remote Device)发来的请求

tresp:本地设备(Local Device)通过该通道发送远程设备(Remote Device)的响应包,以完成整个事务的交互过程。

在顶层模块中,变量名与通道的对应关系如下:

    s_axis_ireq* 对应于ireq通道m_axis_iresp* 对应于iresp通道m_axis_treq* 对应于treq通道s_axis_tresp* 对应于tresp通道

2.1.2 消息端口

消息端口是一个可选的接口,消息事务既能在I/O端口上发送,也能在独立的消息端口上发送。独立的消息端口类型为Initiator/Target类型。下图是消息端口的示意图:

msgireq:本地设备(Local Device)生成的请求在该通道发送

msgiresp:本地设备(Local Device)通过该通道接收远程设备(Remote Device)发来的响应包,以完成整个事务的交互过程。

msgtreq:本地设备(Local Device)通过该通道接收远程设备(Remote Device)发来的请求

msgtresp:本地设备(Local Device)通过该通道发送远程设备(Remote Device)的响应包,以完成整个事务的交互过程。

在顶层模块中,变量名与通道的对应关系如下:

    s_axis_msgireq* 对应于msgireq通道m_axis_msgiresp* 对应于msgiresp通道m_axis_msgtreq* 对应于msgtreq通道s_axis_msgtresp* 对应于msgtresp通道

2.1.3 用户自定义端口

用户自定义端口是一个可选的端口,它包括两个AXI4-Stream通道,一个用于发送另一个用来接收。用户自定义端口仅仅支持SRIO Stream格式的事务。下图是用户自定义端口的示意图:

在顶层模块中,变量名与接口的对应关系如下:

    s_axis_usrtx* 对应于user_io_tx接口m_axis_usrrx* 对应于user_io_rx接口

2.1.4 维护端口

维护端口使用的是AXI4-Lite接口协议,AXI4-Lite接口允许用户访问本地或远程配置空间。下图是AXI4-Lite维护端口示意图:

上图中从右到左的黑色箭头表示请求(Requests)通道,从左到右的灰色箭头表示响应(Responses)通道。每个通道有独立的ready/valid握手信号。

2.1.5 状态(Status)

用户接口的状态信号包括deviceid和port_decode_error,定义如下表所示

信号 方向 描述
deviceid[15:0] 输出 Base DeviceID CSR(偏移地址为0x60)寄存器的值
port_decode_error 输出 此信号为高说明用户自定义端口未使能,一个不支持的事务被接收并立即丢弃。当下一个支持的事务包在任意用户接口被接收以后此信号被拉低。这个信号同步于log_clk信号

2.2 Buffer接口BUF

开门见山的说:所有Buffer层的接口对于RapidIO顶层都是不可见的。是不是松了一口气~

Buffer的目的是对发送和接收的包进行缓冲。Buffer对于保证包发送和流控操作是非常有必要的,Xilinx提供了一个可配置的Buffer解决方案,可以在系统性能和资源利用率之间权衡选择。

2.3 物理层接口PHY

物理层(PHY)用来处理链路训练(Link Training),初始化(Initialization)和协议(Protocol),同时还包括包循环冗余校验码(CRC)与应答标识符的插入。

2.4 寄存器空间

RapidIO的寄存器空间包含:能力寄存器空间(CAR)和命令和状态寄存器空间(CSR)。CAR和CSR的寄存器一样都在逻辑层LOG实现。更多寄存器空间内容请查阅《PG007》P.51

下面我们继续介绍重点内容HELLO包格式!

三、HELLO包格式(重点)

为了简化RapidIO包的构建过程,RapidIO核的事务传输接口(ireq,treq,iresp,tresp)可以配置为HELLO(Header Encoded Logical Layer Optimized)格式。

这种格式把包的包头(Header)域进行标准化,而且把包头和数据在接口上分开传输,这将简化控制逻辑并且允许数据与发送边界对齐,有助于数据的管理。

3.1 HELLO格式及字段定义

HELLO格式的包如下图所示:《PG007》P.76

保存,写包头数据的时候查阅~

其中,各个字段的定义如下表所示:

字段

位置

描述

TID

[63:56]

包的事务ID(Transaction ID),RapidIO手册规定在给定的时机,RapidIO包只能有唯一的TID与Src ID对。

FTYPE

[55:52]

包的事务类(Transaction Class),HELLO格式支持的FTYPEs为2,5,6,A,B和D。

TTYPE

[51:48]

包的事务类型(Transaction Type),当FTYPE的值为2,5或D时,不同的TTYPE值对应于包的不同功能。

Priority

[46:45]

包的优先级。请求包的优先级值为0~2,响应包的优先级值为请求包的优先级加1

CRF

[44]

包的关键请求流标志(Critical Request Flow)

Size

[43:36]

有效数据负载的字节数减1,如果这个字段的值为0xFF,那么表示有效数据为256(0xFF + 1)个字节

Error

[35]

当这个字段为1时表示包处于错误状态

Address

[33:0]

事务的字节地址

Info

[31:16]

信息域。仅在门铃事务(DOORBELL)中包含此字段

Msglen-1

[63:60]

消息事务(MESSAGE)中包的个数。仅在消息事务(MESSAGE)中包含此字段

Msgseg-1

[59:56]

包中的消息段,仅在消息事务(MESSAGE)中包含此字段,如果是单段(signal-segment)消息,此字段保留

Mailbox

[9:4]

包的目标邮箱,仅在消息事务(MESSAGE)中包含此字段,除了单段(signal-segment)消息以外,此字段的高四位是保留位

Letter

[1:0]

包的信件,仅在消息事务(MESSAGE)中包含此字段,指示了邮箱中的一个插槽

S,E,R,xh,O,P

[63:56]

S:起始位,当此字段为1时表示这个包是新PDU(Protocol Data Unit)的第一个分段。

E:结束位,当此字段为1时表示这个包是新PDU(Protocol Data Unit)的最后一个分段。当S和E均为1时表示PDU仅包含一个包。

R:保留位。

Xh:扩展头(Extended Header)。目前版本不支持

O:奇数(Odd),当此字段为1时表示数据负载有奇数个半字。

P:填充位(Pad)。当此字段为1时,一个填充字节用于去填充数据到半字(half-word)边界

Cos

[43:36]

服务类(Class of service)

StreamID

[31:16]

点到点的数据流标识符

Length

[15:0]

协议数据单元(Procotol Data Unit,PDU)长度

3.2两种传输情况

    HELLO格式的包中Size域的值等于传输的字节的总数减1,Size域的有效值范围为0~255(特别注意:size以字节byte为单位!),对应于实际传输的字节数量1~256。HELLO格式中的size和address域必须对应于RapidIO包中有效的size,address和wdptr域,所以HELLO格式的size和address字段的值存在一些限制条件。RapidIO核不能把Size域中的非法值修正为实际RapidIO包中Size域的有效值,所以需要对HELLO格式包的Size域提供一个正确的值。由于AXI4-Stream协议中tdata信号为8个字节,也就是一个双字(Double Word),所以Size域的值需要分两种情况讨论:传输的数据量小于8字节和传输的数据量大于8字节。

(1)传输的数据量小于8字节(Sub-DWORD Accesses):

PS : 这种情况我们后文会对example design的仿真进行具体介绍。

      对于传输的数据量小于8字节的情况,address字段和size字段用来决定有效的字节位置(tkeep信号必须为0xff),但是仅仅能导致RapidIO包中rdsize/wrsize和wdptr为有效值的address和size值组合才是被允许的,下图是HELLO格式中address和size两个字段与有效字节位置的对应关系示意图(图中灰色部分为有效字节位置)《PG007》P.78例如,(后文example design中的一个案例)对size=5,address=34’h1_1234_5672这两个组合来说,由于size=5,所以往address中写入的数据个数为6(size+1)个字节,而address的最低3位为2(3’b010),通过上图可知,有效字节的位置是第7、6、5、4、3、2六个字节。对于size和address[2:0]值的组合不在上图中的情况都是非法的,这是应该避免的,比如,size=5, address=34’h1_1234_5673这种组合就属于非法的组合。

(2)传输的数据量大于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字节的包。所以我们发送数据的时候要注意自己拆分数据。

3.3HELLO格式传输时序图

    HELLO格式数据的包头(Header)在用户接口的第一个有效时钟上,如果发送的事务携带数据负载,那么数据负载紧接着包头(Header)后面进行连续发送。包的Source ID和Destination ID放在tuser信号中并与包头(Header)一样,在第一个有效时钟下进行发送,发送完毕以后,tuser信号的数据被忽略。下图是携带有数据负载HELLO格式包在用户接口上传输的时序图,这个传输有4个双字(32个字节)的数据负载,加上包头,整个传输一共花费了5个时钟周期。用户只需要把想要发送的数据按照下图的时序图送入RapidIO核的AXI4-Stream接口,RapidIO核就能把它转化为标准的RapidiO串行物理层的包发出去从而完成一次事务的交互。

基本的HELLO包传输时序图(重点掌握,会用这种就OK~)
《PG007》P.79

    下图是一种更复杂的传输示意图。首先,有两个背靠背(back-to-back)单周期包(包不带数据负载,仅包含一个包头)。包的边界通过拉高tlast信号进行指示。在单周期包传输完毕以后,主机等待了一个时钟周期才开始发送下一个包。在发送第三个包的过程中,主机(Master)和从机(Slave)分别通过拉低tvalid和tready信号一个时钟周期来暂停数据的发送,由于第三个包的数据负载为2个双字,所以传输第三个包一共消耗了3个有效时钟,加上2个无效的时钟周期,一共消耗了5个时钟周期。

高级的HELLO包传输时序图

3.4 AXI4-Stream协议

    RapidIO核事务收发接口采用的协议是AXI4-Stream协议。AXI4-Stream协议用ready/valid握手信号在主从设备之间传输信息。AXI4-Stream协议用tlast信号指示传输的最后一个数据从而确定包的边界,用tkeep字节使能信号指示数据中的有效字节,它还包括有效数据tdata信号以及用户数据tuser信号用来传输实际的包数据。

tkeep : 规定只能为8’hff;

tvalid : 表示你的数据有效;

tdata : 你要发送的数据(先发一个HELLO头,再发数据)

tready : 核输出,表示准备好接收你的数据了

tlast : 表示最后一个数据

tuser : 一般发ID号,注意只在第一个时钟周期有效。

而对于我们逻辑设计而言,只需要设计这几个用户接口就OK,是不是超级简单!!!

四、SRIO Stream格式

    因为HELLO格式比较简单,一般使用HELLO格式!所以SRIO STREAM格式没用过,放张图,有兴趣的去PG007具体研究。

五、事务类型(重点)

开门见山的说:事务类型是重点,因为要安装事务类型组包,但是呢,保存以供查阅就就好~《PG007》P.168

RapidIO协议定义了七种事务类型,每种事务类型执行不同的功能。RapidIO包格式中的FTYPE字段与TTYPE字段共同确定了事务的类型,与标准RapidIO协议不同的是,RapidIO核中定义了第9类事务(FTYPE=9)——DATA STREAMING事务,它是一类带有数据负载的写事务,而标准RapidIO协议中第9类事务是保留事务。详细的对应关系如下表所示:

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

——

DATA Streaming

数据流写,请求事务包含有效数据

10

4’bxxxx

DOORBELL

门铃

11

4’bxxxx

MESSAGE

消息

12

——

Reserve

13

4’b0000

RESPONSE

no data

不带有效数据的响应包

4’b1000

RESPONSE

with data

带有效数据的响应包

14~15

——

Reserve

串行RapidIO(Serial RapidIO,SRIO):IP核基础知识相关推荐

  1. 【高速接口-RapidIO】Xilinx SRIO IP 核详解

    目录 原文链接:https://www.cnblogs.com/liujinggang/p/10072115.html 一.RapidIO核概述 二.RapidIO核接口说明 2.1 逻辑层接口 2. ...

  2. 【Verilog基础】ROM IP 核基础知识

    本小节为大家介绍一种较为常用的存储类 IP 核--ROM 的使用方法. ROM 是只读存储器(Read-Only Memory)的简称,是一种只能读出事先所存数据的固态半导体存储器.其特性是一旦储存资 ...

  3. 【FPGA】SRIO IP核的三层协议的作用?

    SRIO这种高速串口复杂就复杂在它的协议上,三层协议:逻辑层,传输层以及物理层. 数据手册会说这三层协议是干什么的呢?也就是分工([FPGA]SRIO IP核系统总览以及端口介绍(一)(User In ...

  4. 【FPGA】SRIO IP核系统总览以及端口介绍(一)(User Interfaces 之 I/O Port)

    系统总览 RapidIO标准分为三层:逻辑,传输和物理. 逻辑层定义整体协议和数据包格式. 这是端点启动和完成事务(transaction)所必需的信息. 传输层提供数据包从端点移动到端点所需的路由信 ...

  5. 【FPGA】SRIO IP核系统总览以及端口介绍(二)(I/O Port 含义介绍)

    上篇博文:[FPGA]SRIO IP核系统总览以及端口介绍(一)(User Interfaces 之 I/O Port)根据数据手册PG007,介绍到了逻辑层接口的IO口,今天想研究下,这些端口如何使 ...

  6. eip协议通信_工业通讯 | EtherNET/IP协议基础知识(Part 3)||附视频讲解

    点击蓝字 关注我们 相关阅读: EtherNet/IP OSI参考模型及其物理层.数据链路层与网络层的功能特点: EtherNET/IP协议基础知识(Part 1)||附视频讲解 Encapsulat ...

  7. 【FPGA】SRIO IP核系统介绍之事务类型(Transaction)

    RapidIO规范定义了几种事务类型. 每种事务类型执行不同的功能. IP核的事务支持是通过Vivado®集成设计环境(IDE)设置的. 表3-1列出了已定义的事务类型,并指示事务所属的LOG端口. ...

  8. 【FPGA】SRIO IP核系统总览以及端口介绍(三)(Messaging Port、User-Defined Port介绍)

    Messaging Port 消息传递端口是可选接口(消息也可以组合到I / O端口上,并使用Vivado集成设计环境(IDE)设置视为写入事务). 单独的Messaging端口遵循Initiator ...

  9. iOS中为何用串行队列(Serial Queue)也无法保证对象读写操作的同步?

    问题现象 我们知道iOS有串行和并行两种分发队列(DispatchQueue), 其中串行队列每次只能执行一个任务,通常被当做一种很好的同步器来使用. 但是,下面使用串行队列却也无法达到同步读写cou ...

最新文章

  1. transact-sql数组(转)
  2. 快速学习正则表达式,不用死记硬背,这里有份中文资源和互动学习网站
  3. b+tree数据结构可视化_数据结构: B+Tree及其应用
  4. python多元线性回归模型案例_Python 实战多元线性回归模型,附带原理+代码
  5. mysql select内部原理_数据库SQL SELECT查询的工作原理
  6. 开源软件的安全性风险_开源安全性,Google惊喜等
  7. pixhawk学习笔记-----mavlink
  8. 用Java语言编写的随机彩色验证码
  9. 剑指:合并两个排序的链表
  10. Java下载服务器文件
  11. plsql误删除数据,怎么恢复?
  12. 权重较高的几个分类信息网站
  13. 券商理财和银行理财的不同
  14. 2020年鼠年正月十二 淡然面对
  15. iPhone通过CPU确定手机型号
  16. Elasticsearch exception [type=action_request_validation_exception, reason=Validation Failed:
  17. 稀疏数组真心话大冒险
  18. dtft频移性质_傅里叶变换纪实
  19. InnoDB执行delete时到底做了什么?
  20. post上传图片获取不到值

热门文章

  1. Java中Thread详解(一篇就够了)
  2. 创建网页的桌面快捷方式,快速打开网页
  3. 使Gradle构建更快 2016年2月5日奥列格Shelajev3评论 推特 inShare 70 上次我们谈到了构建系统,我们看着一些建议可能会使您的Maven构建更快。我们得到的结果是迷人的和对
  4. 利用路由策略解决路由引入中产生的路由环路和次优路径问题
  5. 手把手教你怎么免费为微信公众号接入智能客服
  6. php 将字符串 变为 数组,php将字符串转换为数组
  7. RequireJs配置
  8. PYthon打印10000以内的所有素数
  9. Linux下快速删除大量文件/文件夹方法--rsync
  10. python时域波形特征分析