1.3 PCIE协议是如何组织、沟通的?



内容简介

2024-01-18

    全文共1949字,阅读大约需要5分钟,主要是概述性的介绍PCIE实现数据传递的方案和内容,主要包括:

1、PCIE协议的分层结构

2、PCIE协议支持的事务类型有哪些?

3、PCIE有怎样的传输机制

4、PCIE的路由方案是什么?

    PCIE的实现方案是非常复杂的,我们看协议规范有860页的描述,而且字还那么小,总的来说就是两种传输机制、三层逻辑结构、四种事务类型。在这里只是概述性的说一下。

1、协议相关代码采用分层的方式进行组织的,分为事务层、链路层和物理层,以此实现用户数据的交互;

2、数据类型被分为内存、I/O、配置和消息四类,分别完成不同的功能。

3、数据交换是基于请求与完成(响应)的机制,也分为Non-Posted和Posted两种模式,Posted意思发送数据不需要接收端响应,而Non-Posted是要求接收端对发送数据进行响应。

01

PCIE协议的分层结构

    对于复杂的协议,分层是必须要做的事情,无论平时写的业务逻辑,还是像TCP/IP、SRIO等行业内的公用协议,都做了分层。对实现功能有着明确、合理的划分,不仅增加代码的可读性,更有助于提高其可读性,并利于扩展。PCIE或者说PCI协议,也是进行了层级划分,如下图所示,划分为事务层、数据链路层和物理层三层。这些层中的每一层分为两个部分,一部分是发送数据内容,一部分是接收信息。


1、事务层

    事务层是PCIE协议的对外接口层,用户对数据进行组帧和解析是在本层进行,本层产生的数据包称之为事务层数据包,即(Transaction Layer Packets,TLP)。此外事务层还具有基于信用积分的流控功能,支持不同事务类型的不同形式的数据传输。

2、数据链路层

    数据链路层充当事务层和物理层之间的中间阶段,主要职责包括链路管理和数据完整性,包括错误检测和纠正。

    数据链层在传输链路上接收事务层的TLP数据包添加序列号和校验码交给物理层,而且链路层非常尽责,会对事务层交付的数据包进行缓存,如果检测到传输错误会进行重发,直到接收正确或确定链路通信失败。

    链路层还具有链路管理功能,并有相应的数据包,称之为“数据链路层数据包(DLLP)”该数据包是实现两个组件间的数据交换,并没有路由功能,换言之,如果一包数据要跨过大山大河到达接收端,中间经过无数站点,DLLP数据包只在两站之间进行数据交换,主要实现的功能有流量控制、电源管理、应答机制和虚拟通道。

3、物理层

    物理层分为两个部分,一部分是逻辑子层,一部分是电气子层。逻辑子层模块负责与数据链路层的数据交换,会对接收链路层事务进行再次封装,对接收电气子层事务进行解析,并会进行8B/10B编码或者128B/130B编码,进行传递之间的转换和极性反转等工作,电气子层则更多的负责时钟数据恢复、均衡等电气操作。物理层数据包称之为PLP,Physical Layer Packet。

02

PCIE协议的事务类型

PCIE协议总共规定了Memory、I/O、配置和消息四种事务类型,其中前三种是从PCI继承过来的,消息是PCIE所扩展的。

1、内存事务

    其实内存事务并不一定是读写内存,而是代表一种大数据量的数据交换方式,PCIE支持内存事务类型的读写以及原子操作(AtomicOp)。

2、I/O事务

    I/O事务是被PCIE嫌弃的一类事务,会逐渐被弃用并被MMIO替代。MMIO(Memory-Mapped I/O,内存映射I/O)是一种访问设备寄存器和配置空间的机制。在PCIe架构中,MMIO是一种I/O访问方法,它允许软件通过内存地址范围来读取或写入设备寄存器的值而不是通过传统的I/O端口方式。

3、配置

    每个 PCIe 设备都有一组配置寄存器,包含设备的重要信息、功能设置以及与设备通信所需的控制寄存器等。在PCIE设备应用前必须经过配置阶段。

4、消息

    消息是PCIE新增的一种事务类型,用来取代PCI的一些边带信号,使得所有的信号传递都通过报文来实现。PCIE支持的消息事务有中断、电源管理、错误消息等共8项,会在第二章介绍事务类型。

03

PCIE的传输机制

    正如前文所述,数据交换是基于请求与完成(响应)的机制分为Non-Posted和Posted两种模式。这种分类也是满足不同的需求,例如内存模式进行大量的数据交换,如果每发送一包就要求响应,则会大大降低传输效率,但对于一些事务,为了保证可靠性是必须响应的故有两种模式。对于Non-Posted模式并不是说数据包发送过去就不管不顾了,接收端会在链路层向发送端发送响应信号。

04

PCIE的路由方案

    何为路由,百度说就是按某条线路发送。有时候有些词真的很阻碍我们对些知识的理解,例如路由,再例如学arm时候的中断向量表,对于初学者来说,很让人费解。

    在我看来路由强调的是发送端和接收端间的通信,与之相对应的是点对点通信。点对点通信不需要考虑拥塞等问题,就是两点间的数据交换,而路由链路就可能很长,中间有很多的中转站,我们要保证数据在中转站不出错就需要更多的机制。

    PCIE的路由方案有三种,分别是ID路由、地址路由和模糊路由。

1、ID路由

    ID路由即BDF路由方案,即采用Bus Number、Device Number和Function Number来确定目标设备的位置。这是一种兼容PCI的路由方案,主要用于设备的配置、带数据和不带数据的返回数据包。

2、地址路由

    地址路由包括对IO和Memory两种事务类型的路由,在帧头中包含了目的设备的地址信息,处理器会为每个设备分配一段地址信息,这也是数据包传输过程中的标志符。

3、模糊路由

    模糊路由(Implicit Routing,又译为隐式路由)只能用于Message的路由。用来实现电源管理、错误信号、热插拔、虚拟通道等功能,具体也是在下文描述。

    综上,事务层数据类型分为四大类,Memory、I/O、配置和消息,每一大类均有很多小类,而且具有三种路由模式即ID路由、地址路由和模糊路由,又有两种传输机制即Non-Posted和Posted,帧格式有分为3DW和4DW两种类型,似乎很乱,也确实内容不少,而且不止于此,其实就是为了满足不同功能设备在PCIE架构下进行数据交换的需求。在接下来的各个章节会对PCIE的各个层面种种功能进行具体的阐述。

欢迎关注公众号领取PCIE相关资料







快来扫描下方二维码关注公众号,领取站内所有相关资料,所有哦~

有建议、有需求、有疑问、联系我

<