FPGA基础----PCIE的结构与TLP包

1. 前言

虽然在一个小团队里面,一般都不会深入这个底层来实现具体的TLP包,要么是Riffa,要么是XDMA。但是架不住面试的时候有人会问啊,这就很恼火了啊。那怎么办,还不是只有来看看基础才能维持得了生活的样子,自己写又不会。其实Github上还真是有人实现过如此底层的,一个开源项目是pcileech.说起来这个项目的一个用途是来做游戏破解的,像什么逃离塔克夫,吃鸡的硬外挂都是基于这个来做的。

2. PCIe的拓扑结构

下面的这个图就是现实的PCIe的拓扑结构,说句实在话,这个图里面包含的内容是巨他妈的多。
在这里插入图片描述

2.1 PCIe总线上的设备

  • 根端口
    • 连接CPU和存储器系统,以及其他PCIe设备(Switch 和 Endpoint)的设备。
    • ROOT Point就相当于整个PCIe系统的主管。
  • 交换器
    • 根据地址,ID或者隐含的方式来进行路由TLP包
    • 配置空间为Type1类型的
  • 端点设备
    • 配置空间为Type0型
    • 可以被主板连接和挂载。

虽然上面的图,看着是一个比较简单的图,但是内容确实真的不少,想要进一步弄清楚这个PCIe的系统是如何工作的,还需要进一步的知识储备才可以。

2.2 如何区分PCIe系统中的各个设备

2.2.1 PCIe配置空间

在前面的PCIe的拓扑结构当中,我们首先看到交换器Switch和端点设备Endpoint之间具有不同类型的配置空间,这个配置空间实际包含了这个设备自身的信息,这些信息在标定这个设备的时候具有十分重要的作用。
PCIe的配置空间的结构如下图所示:
在这里插入图片描述
在这个配置空间当中,有一些十分重要的参数,比如设备ID,厂商ID,还有这个设备的功能ID,这些参数,能够使PC主机正确地识别到我们的PCIe设备。
在这里插入图片描述
在PCIe系统当中,用于确定某一个设备在PCIe总线上的位置是通过ID来完成。而这个ID又可以通过
总线ID —>设备ID—>功能ID所组成的。其中这个功能ID和前面的配置空间当中的class code有较大的关系,一般class code可以来指定设备的功能,比如网卡,声卡,显卡等。
正确配置了这个PCIe设备之后,在系统上电启动的时候,若成功检测,就会为这个PCIe设备分配ID了和地址了。

2.2.2主机访问端点设备

前面介绍了主机能够为PCIe分配ID和地址,那么主机是如何来访问一个端点设备的呢?这就需要来看PCIe设备的BAR空间了,这个BAR空间,也就是在前面我们设置这个PCIe设备的时候的Base Address Register了。
在这里插入图片描述
在设置BAR空间的时候,可以设置BAR空间的大小,那么主机在初始化这些设备的时候就会为它在主机的内存里面分配对应的地址空间。
这里有一个比较有意思的地方就是,PCIe的端点设备向主机只提供了BAR空间是可见的,也就是说,主机是看不到PCIe设备除了BAR空间之外的其他内容的。
比如,PCIe设备就是FPGA板卡,FPGA板卡上面有一个DDR设备,主机PC是看不到这个设备的。
有意思的是,主机却又能够和FPGA板卡上的内存设备进行数据的交互,这是因为使用了DMA的操作,这种操作不需要PC主机的之间干预,能够完成ROOT和ENDPOINT之间的直接的数据搬移。
这个BAR空间还支持64位地址和32位地址,两个32位地址的BAR空间,可以构成一个64位地址的BAR空间。

3 PCIe设备之间的数据交互

3.1 PCIe设备的结构

在进行PCIe设备之间的数据交互的时候,首先需要来看一下PCIe的各个层级,以及对应的每个层会干些什么事。有过以太网开发经验的小伙伴,一定对OSI这个物理模型有了解,其实PCIe的这个物理模型有相似之处。
在这里插入图片描述

  • 物理层Physical Layer
    • PCS:物理编码层,完成高速接口的一些编码工作,比如8B/10B,64B/66B这种编码
    • PMA:物理媒介层,完成的就是向Serdes的串并转换,差分转换这种功能。
  • 数据链路层 Data Link Layer
    • 在数据链路层主要就是加上一些校验码,控制字等等。
  • 事务层Transaction Layer
    • 传输层,也就是我们开发者,需要开始关系的地方了,这里就涉及到了PCIe系统当中传递的最基本的数据包,也就是TLP包的格式了。
  • 软件层 Software Layer
    • 软件层也就是更加靠近应用的地方了,用户可以在这上面来设计实现自己的协议和功能。

下面的图就是各层传输的数据的格式了,我们主要是关注在事务层的数据包,也就是TLP包。
在这里插入图片描述

3.2 TLP包格式类型

TLP包的结构如下图所示,可以看到这是一个包头长度位3DW的TLP数据包,TLP数据包的包头有3DW和4DW的,区别就是访问的地址类型是不一样的。
在这里插入图片描述
在上面的结构当中Ftm字段和Type字段,共同决定了TLP包的结构和类型。
Ftm字段决定了TLP包的包头长度和TLP包是否带有数据可以参考下面的表格来看其作用。Ftm[0]用来指是TLP包是3DW头还是4DW头。Ftm[1]用来指示TLP包是否带有数据。
在这里插入图片描述
在上面的这些TLP包当中,我们能够很容易的看到有一些TLP是挺对称的。这个争取在下一次再写篇博客来好好记录一下吧,今天先记录一个大概。
一般我们可以把这些不同的TLP包分为以下4个大类:
在这里插入图片描述

3.3 TLP包的路由方式

知道了TLP包的大概的结构之后,如何来进行TLP包的传输呢,这里就需要来掌握TLP包的一个路由方式了。其路由方式如下图所示:
在这里插入图片描述

  • MRd,MWr,MRdLk
    • 内存写请求,内存读请求,带锁定的内存读请求,这几个都比较好理解,这几个TLP包都需要去操作内存,因此必须要知道对应的需要访问的内存地址才可以,因此采用的是地址路由的方式。
  • IORd,IOWr
    • 一般IO操作都是一些低速的操作,比如主机来访问BAR空间这种,这种访问也需要知道对应的访问的BAR的地址才可以,因此需要采用地址路由的方式。
  • CFG相关
    • 这些TLP包很好理解,是来对这个设备进行配置的,如何来确定某个设备在PCIe系统当中的位置呢,就需要我们在前面介绍到的这个ID了,也就是总线ID,设备ID和功能ID,共同决定了某一个设备的ID,主机才能去设置对应的设备。
  • CPL, CPLD
    • 完成包也挺好理解,完成包对应的是需要对请求发起点的一个响应,因此根据请求发起点的一个唯一表示,来找到需要返回的对象,ID路由就是一种很好的方式。

3.4 TLP包传输举例

下图中是一个端点设备读取内存的一个例子,可以看到,PCIe的端点设备,首先发起一个TLP的读数据请求包,这里采用地址路由的方式,准确地去访问具体地内存地址,根设备接收到这个TLP包之后,就会根据TLP包地内容将DDR中的数据通过DMA的方式进行获取,然后通过CPLD包通过地址路由的方式返回到对应的PCIe设备当中。最终PCIe设备能够接收到返回的数据,也就是成功地获取到内存当中的数据。
在这里插入图片描述

  • 14
    点赞
  • 83
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PCI Express (PCIe) TLP (Transaction Layer Packet) 是 PCI Express 协议的一个重要部分,它用于在不同的 PCIe 设备之间传输数据。PCIe TLP 由四个部分组成:头部、有效载荷、可选的可扩展有效载荷和 FCS(帧校验序列)。 具体来说,PCIe TLP 的格式如下: |---------------------------| | PCIe TLP 头部 (12 字节) | |---------------------------| | 有效载荷 (0 - 1024 字节) | |---------------------------| | 可扩展有效载荷 (0 - 1024 字节) | |---------------------------| | FCS(帧校验序列)(4 字节) | |---------------------------| PCIe TLP 头部括以下字段: - TC(传输类别):指定 TLP 的类型,比如请求(Memory Read/Write)、Completion 等。 - TD(传输方向):指定 TLP 的传输方向,是从上游设备到下游设备还是相反。 - EP(端点):指定 TLP 的目标设备端口号。 - Length(长度):指定有效载荷的长度。 - First DW BE(第一个双字节字节 Enable):指定有效载荷的第一个双字节的哪些字节是有效的。 - Last DW BE(最后一个双字节字节 Enable):指定有效载荷的最后一个双字节的哪些字节是有效的。 - Tag(标签):可选字段,用于匹配请求和 Completion TLP。 - Requester ID(请求者 ID):可选字段,用于标识发起 TLP 的设备。 - Completer ID(完成者 ID):可选字段,用于标识处理 TLP 的设备。 PCIe TLP 的有效载荷可以是数据、地址或控制信息。可扩展有效载荷在某些情况下用于传输额外的数据或信息。FCS 是一个校验序列,用于检测传输中的错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值