PCI相关(4)- PCIe总线事务-TLP格式及路由

事务层是 PCIe 总线层次结构的最高层,该层次将接收 PCIe 设备核心层的数据请求,并将其转换为 PCIe 总线事务,PCIe 总线使用的这些总线事务在 TLP 头中定义。PCIe 总线继承了 PCI/PCI-X 总线的大多数总线事务,如存储器读写、I/O 读写、配置读写总线事务,并增加了 Message 总线事务和原子操作等总线事务。

在 PCIe 总线中,Non-Posted 总线事务分两部分进行,首先是发送端向接收端提交总线读写请求,之后接收端再向发送端发送完成(Completion)报文。PCIe 总线使用 Split 传送方式处理所有 Non-Posted 总线事务,存储器读、I/O 读写和配置读写这些 Non-Posted 总线事务都使用 Split 传送方式。PCIe 的事务层还支持流量控制和虚通路管理等一系列特性,而 PCI总线并不支持这些新的特性。

在 PCIe 总线中,不同的总线事务采用的路由方式不相同。PCIe 总线继承了 PCI 总线的地址路由和 ID 路由方式,并添加了“隐式路由”方式。

PCIe 总线使用的数据报文首先在事务层中形成,这个数据报文也被称之为事务层数据报文,即 TLP,TLP 在经过数据链路层时被加上 Sequence Number 前缀和 CRC 后缀,然后发向物理层。

数据链路层还可以产生 DLLP(Data Link Layer Packet)。DLLP 和 TLP 没有直接关系,DLLP 是产生于数据链路层,终止于数据链路层,并不会传递到事务层。DLLP 不是 TLP 加上前缀和后缀形成的。数据链路层的报文 DLLP 通过物理层时,需要经过8/10b 编码,然后再进行发送。数据的接收过程是发送过程的逆过程,但是在具体实现上,接收过程与发送过程并不完全相同。

4.1 TLP 的格式

当处理器或者其他 PCIe 设备访问 PCIe 设备时,所传送的数据报文首先通过事务层被封装为一个或者多个 TLP,之后才能通过 PCIe 总线的各个层次发送出去。TLP 的基本格式如下图。

 

一个完整的 TLP 由1个或者多个 TLP Prefix、TLP 头、Data Payload(数据有效负载)和TLP Digest 组成。TLP 头是 TLP 最重要的标志,不同的 TLP 其头的定义并不相同。TLP 头包含了当前 TLP 的总线事务类型、路由信息等一系列信息。在一个 TLP 中,Data Payload 的长度可变,最小为0,最大为1024DW。

TLP Digest 是一个可选项, 一个 TLP 是否需要 TLP Digest 由 TLP 头决定。Data Payload也是一个可选项,有些 TLP 并不需要 Data Payload,如存储器读请求、配置和 I/O 写完成TLP 并不需要 Data Payload。

TLP 头由3个或者4个双字(DW)组成。其中第一个双字中保存通用 TLP 头,其他字段与通用 TLP 头的 Type 字段相关。一个通用 TLP 头由 Fmt、Type、TC、Length 等字段组成,如下图所示。

 

如果存储器读写 TLP 支持64位地址模式时,TLP 头的长度为4DW,否则为3DW。而完成报文的 TLP 头不含有地址信息,使用的 TLP 头长度为3DW。其中 Byte 4~Byte 15的格式与 TLP相关,下文将结合具体的 TLP 介绍这些字段。

(1)通用 TLP 头的 Fmt 字段和 Type 字段

Fmt 和 Type 字段确认当前 TLP 使用的总线事务,TLP 头的大小是由3个双字还是4个双字组成,当前 TLP 是否包含有效负载。具体情况如下图所示

 

其中所有读请求 TLP 都不带数据,而写请求 TLP 带数据,而其他 TLP 可能带数据也可能不带数据,如完成报文可能含有数据,也可能仅含有完成标志而并不携带数据。在 TLP 的Type 字段中存放 TLP 的类型,即 PCIe 总线支持的总线事务。该字段共由5位组成,其含义如下图所示。

 

由上表所示,存储器读写请求、IO 读写请求、配置读写请求的 type 字段相同,如存储器读和写请求的 Type 字段都为0b0 0000。此时 PCIe 总线规范使用 Fmt 字段区分读写请求,当 Fmt 字段是“带数据”的报文,一定是“写报文”;当 Fmt 字段是“不带数据”的报文,一定是“读报文”。

PCIe 总线的数据报文传送方式与 PCI 总线数据传送有类似之处。其中存储器写 TLP 使用 Posted 方式进行传送,而其他总线事务使用 Non-Posted 方式。

PCIe 总线规定所有 Non-Posted 存储器请求使用 Split 总线方式进行数据传递。当 PCIe设备进行存储器读、I/O 读写或者配置读写请求时,首先向目标设备发送数据读写请求 TLP,当目标设备收到这些读写请求 TLP 后,将数据和完成信息通过完成报文(Cpl 或者 CplD)发送给源设备。

其中存储器读、I/O 读和配置读需要使用 CplD 报文,因为目标设备需要将数据传递给源设备;而 I/O 写和配置写需要使用 Cpl 报文,因为目标设备不需要将任何数据传递给源设备,但是需要通知源设备,写操作已经完成,数据已经成功地传递给目标设备。

在 PCIe 总线中,进行存储器或者 I/O 写操作时,数据与数据包头一起传递;而进行存储器或者 I/O 读操作时,源设备首先向目标设备发送读请求 TLP,而目标设备在准备好数据后,向源设备发出完成报文。

(2)TC字段

TC 字段表示当前 TLP 的传送类型,PCIe 总线规定了8种传输类型,分别为 TC0~TC7,缺省值为 TC0,该字段与 PCIe 的 QoS 相关。PCIe 设备使用 TC 区分不同类型的数据传递,而多数 EP 中只含有一个 VC,因此这些 EP 在发送 TLP 时,也仅仅使用 TC0,但是有些对实时性要求较高的 EP 中,含有可以设置 TC 字段的寄存器。

(3)Attr 字段

Attr 字段由3位组成,其中第2位表示该 TLP 是否支持 PCIe 总线的 ID-based Ordering;第1位表示是否支持 Relaxed Ordering;而第0位表示该 TLP 在经过 RC 到达存储器时,是否需要进行 Cache 共享一致性处理。

 

强序模型:在数据的整个传送路径中,PCIe 设备在处理相同类型的 TLP时,如 PCIe 设备发送两个存储器写 TLP 时,后面的存储器写 TLP 必须等待前一个存储器写TLP 完成后才能被处理,即便当前报文在传送过程中被阻塞,后一个报文也必须等待。

Relaxed Ordering 模型:后一个存储器写 TLP 可以穿越前一个存储器写 TLP,提前执行,从而提高了 PCIe 总线的利用率。

(4)TH 位、TD 位和 EP 位

TH 位为1表示当前 TLP 中含有 TPH(TLP Processing Hint)信息,TPH 是 PCIe V2.1总线规范引入的一个重要功能。TLP 的发送端可以使用 TPH 信息,通知接收端即将访问数据的特性,以便接收端合理地预读和管理数据,

TD 位表示 TLP 中的 TLP Digest 是否有效,为1表示有效,为0表示无效。而 EP 位表示当前 TLP 中的数据是否有效,为1表示无效,为0表示有效。

(5)AT 字段

AT 字段与 PCIe 总线的地址转换相关。在一些 PCIe 设备中设置了 ATC(Address Translation Cache)部件,这个部件的主要功能是进行地址转换。只有在支持 IOMMU 技术的处理器系统中,PCIe 设备才能使用该字段。

(6)Length 字段

Length 字段用来描述 TLP 的有效负载(Data Payload)大小[3]。PCIe 总线规范规定一个TLP 的 Data Payload 的大小在1B~4096B 之间。PCIe 总线设置 Length 字段的目的是提高总线的传送效率。

在 PCIe 总线中,目标设备可以通过 Length 字段提前获知源设备需要发送或者请求的数据长度,从而合理地管理接收缓冲,并根据实际情况进行Cache 一致性操作。

Length 字段以 DW 为单位,其最小单位为1个 DW。如果 PCIe 主设备传送的单位小于1个 DW 或者传送的数据并不以 DW 对界时,需要使用字节使能字段,即“DW BE”字段。

4.2 TLP的路由

TLP 的路由是指 TLP 通过 Switch 或者 PCIe 桥片时采用哪条路径,最终到达 EP 或者 RC的方法。PCIe 总线一共定义了三种路由方法,分别是基于地址(Address)的路由,基于 ID的路由和隐式路由(Implicit)方式。

存储器和 I/O 读写请求 TLP 使用基于地址的路由方式,这种方式使用 TLP 中的 Address字段进行路由选径,最终到达目的地。

配置读写报文、“Vendor_Defined Messages”报文、Cpl 和 CplD 报文使用基于 ID的路由方式,这种方式使用 PCI 总线号[1](Bus Number)进行路由选径。在 Switch 或者多端口 RC 的虚拟 PCI-PCI 桥配置空间中,包含如何使用 PCI 总线号进行路由选径的信息。

隐式路由方式主要用于 Message 报文的传递。在 PCIe 总线中定义了一系列消息报文,包括“INTx Interrupt Signaling”,“Power Management Messages”和“Error Signal Messages”等报文。在这些报文中,除了“Vendor_Defined Messages”报文,其他所有消息报文都使用隐式路由方式,隐式路由方式是指从下游端口到上游端口进行数据传递的使用路由方式,或者用于 RC 向 EP 发出广播报文。

(1)基于地址的路由

在 PCIe 总线中,存储器读写和 I/O 读写 TLP 使用基于地址的路由方式。PCIe 设备使用的地址路由方式与 PCI 设备使用的地址路由方式类似。只是 PCIe 设备使用 TLP 进行数据传送,而 PCI 设备使用总线周期进行数据传送。使用地址路由方式进行数据传递的 TLP 格式下图。

 

在PCI桥的配置寄存器空间中,包含一个桥片能够接收的物理地址范围。PCIe 总线通过这个物理地址范围实现基于地址的路由。相关字段如下图所示

 

具体传输过程此处略。

(2)基于ID的路由

在 PCIe 总线中,基于 ID 的路由方式主要用于配置读写请求 TLP、Cpl 和 CplD 报文,此外 Vendor_Defined 消息报文也可以使用这种基于 ID 的路由方式。而在 PCI 总线中,只有配置读写周期才使用 ID 进行数据传递。

基于 ID 的路由方式与基于地址的路由方式有较大的不同,基于 ID 路由方式的 TLP 头格式也与基于地址路由方式的头格式不同,报文格式如下。

 

使用 ID 路由方式的 TLP 头,其 Byte8~11字段与基于地址路由的 TLP 不同。基于 ID 路由的 TLP,使用 Bus Number、Device Number 和 Function Number 进行路由寻址。从软件的角度上看,PCIe 总线与 PCI 总线兼容,只是在 PCIe 总线中,每一个 PCIe设备使用唯一的 PCI 设备号,但是每一个设备仍然可以有多个子设备(Function)。

配置读写请求 TLP 是使用“基于 ID 路由”的一组重要报文,其主要作用是读写 PCIe总线的 EP、Switch 及 PCIe 桥片的配置寄存器,以完成 PCIe 总线的配置。在处理器系统上电之后需要进行 PCI 总线系统的枚举,为 PCI 总线分配总线号,并设置 Switch、PCIe 桥片或者 EP 的配置寄存器,如 Limit 寄存器组、Base 寄存器组、BAR 寄存器、Subordinate Bus Number、Secondary Bus Number 和 Primary Bus Number 等一系列配置寄存器。

 

(3)隐式路由

PCIe 总线规定消息请求报文使用隐式路由方式。在 PCIe 总线中,有许多消息是直接发向 RC 或者来自 RC 的广播报文,这些报文不使用地址或者 ID 进行路由,而是使用 Msg 和 MsgD报文的 Route 字段进行路由,这种路由方式被称为隐式路由。

PCIe 总线定义了一些用于中断请求、错误状态处理、锁定总线事务、热插拔信号处理和“Vendor_Defined Messages”消息报文。这些消息报文需要使用隐式路由方式进行传递。消息报文的 Route 字段的含义如下图所示。

 

使用隐式路由方式的 TLP,其 Route 字段为“000”,“011”,“100”或者“101”。当一个报文使用隐式路由向 EP 发送时,EP 将对 Route 字段进行检查,如果这个报文是“来自 RC 的广播报文”,或者是“本地报文”,EP 将接收此报文。

如果 Switch 收到一条使用隐式路由的 TLP 时,将根据报文 Route 字段的不同而分别处理。如果 Switch 的上游端口接收了一条来自 RC 的广播消息,则将该报文发向所有的下游端口;如果 Switch 接收了一条来自下游端口发向 RC 的消息报文时,Switch 将此报文直接转发到上游端口,直至 RC;如果 Switch 接收了一条使用隐式路由方式的本地消息报文,则Switch 接收并终结此报文,不再上传或下推。

如果 RC 收到一个使用隐式路由的 TLP 时,将根据报文 Route 字段而分别处理这些 TLP。如果该 Route 字段为0b000和0b101,RC 将接收该 TLP,并作相应的处理;如果为0b100,RC将接收该 TLP,并结束该 TLP 报文的传递。

### PCIe 基于地址的路由原理及实现方式 #### 1. 路由机制概述 PCIe 的通信依赖于事务层包 (Transaction Layer Packet, TLP),其中包含了必要的信息用于完成数据传输。基于地址的路由PCIe 中的一种重要路由方式,主要用于内存读写操作和其他需要明确目标地址的操作。这种路由方式的核心在于解析 TLP 中的目标地址字段,并将其映射到具体的物理路径上。 在 PCIe 架构中,根复合体 (Root Complex, RC) 和交换机 (Switch) 是负责路由的主要组件[^2]。它们通过分析 TLP 头部中的地址信息来决定数据包应转发至哪个下游端口或最终目的地。 --- #### 2. 地址空间划分与映射 PCIe 支持多种类型的地址空间,包括配置空间、I/O 空间和内存空间。每种地址空间都有特定的作用范围和访问规则: - **内存空间**: 主要用于主机与终端设备之间的大规模数据传递。 - **I/O 空间**: 提供一种轻量级的数据交互手段,适用于少量控制命令的发送。 - **配置空间**: 存储设备属性及其状态信息,便于初始化和管理。 当发起一次基于地址的请求时,源设备会将目标地址编码进 TLP 数据帧中。随后,沿途的 PCIe 组件依据预定义的地址映射表逐一匹配并逐步缩小可能的目的地集合,直至找到确切的接收方为止[^1]。 --- #### 3. 具体实现过程 以下是基于地址的路由的具体实现流程: - 当某个 EP(Endpoint)或者 RC 发起一条带有具体地址的信息流时,该消息会被封装成标准格式TLP- 接下来,在经过每一个中间节点——无论是单纯的 switch 还是由多个逻辑单元构成更复杂的 bridge 结构——都会提取出此条目内的目的地址部分做进一步处理; - 如果当前节点发现自己能够满足这个条件,则直接接受;否则继续沿指定方向传播下去直到抵达实际消费者那里结束整个旅程[^3]。 在此过程中涉及到的关键技术点包括但不限于以下几方面: - **地址解码**: 需要在各个层次上精确识别哪些位代表什么含义以便做出正确判断。 - **优先级调度**: 对不同类型的任务给予适当权重以优化整体性能表现。 - **错误检测与纠正**: 确保即使在网络拥塞或其他异常情况下也能维持稳定可靠的通讯链路质量。 --- #### 4. FPGA 实现案例 对于某些定制化需求较高的场景下,可以采用可编程门阵列(FPGA) 来构建专属解决方案。例如 Altera Cyclone IV GX 系列提供了强大的功能集支持开发者灵活调整内部架构从而更好地适应特定应用场景的要求[^4]。这不仅限于简单的寄存器文件设定而是深入到底层细节层面进行全面掌控使得我们可以针对不同工作负载特性设计最优策略组合达到最佳效果。 ```python def configure_pcie_route(fpga_config): """ Configures the PCIe route based on address mapping using an FPGA. Args: fpga_config (dict): Configuration parameters for the FPGA setup. Returns: str: Confirmation message indicating successful configuration. """ # Example of setting up a basic routing table within an FPGA environment routing_table = { 'memory_space': {'start_addr': 0x8000_0000, 'end_addr': 0xFFFF_FFFF}, 'io_space': {'start_addr': 0x7E00_0000, 'end_addr': 0x7EFF_FFFF} } if not validate_fpga_parameters(fpga_config): raise ValueError("Invalid FPGA configuration provided.") apply_routing_rules(routing_table) return "PCIE Route configured successfully." def validate_fpga_parameters(config): """Validates whether given FPGA config meets requirements.""" required_keys = ['clock_speed', 'data_width'] return all(key in config for key in required_keys) def apply_routing_rules(table): """Applies defined rules to set up internal FPGA pathways.""" pass # Placeholder function; actual implementation depends heavily on hardware specifics ``` 上述代码片段展示了如何通过软件接口设置一个基础版的 PCIe 路由表格,并验证输入参数的有效性。虽然简化了很多真实世界里的复杂度考量因素但它依然能很好地说明核心理念即根据预先确定好的准则动态调整信号走向达成预期目标。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值