第一章 PCIe基础概念

各位同学好,我是老张。做芯片系统这行十几年了,PCIe这块我自认为还算有点心得。今天咱们先聊聊PCIe的基础概念,这部分你要是搞明白了,后面学USB子系统会轻松很多。

1.1 PCIe总线架构概述

PCIe,全称是Peripheral Component Interconnect Express。说白了,就是芯片和外部设备之间的一条高速公路。

我刚开始接触PCIe时,总觉得它跟老式的PCI差不多。后来踩过坑才明白——这俩完全是两码事。PCI是并行总线,所有设备共享一条总线;PCIe是串行总线,每个设备都有自己的专用通道。

打个比方:PCI就像一条单车道公路,所有车都挤在一起走。PCIe呢?它像高速公路,每个设备都有自己的车道,互不干扰。

核心特点:

  • 点对点串行连接——每个设备独享带宽
  • 差分信号传输——抗干扰能力强
  • 可扩展性强——从x1到x16,通道数灵活配置
  • 热插拔支持——我曾在项目中遇到过设备带电插拔导致系统崩溃,后来发现是没处理好热插拔时序

PCIe的带宽怎么算?很简单:
单通道(x1)速率 × 通道数 × 编码效率。
比如PCIe 3.0,单通道8GT/s,编码128b/130b,效率约98.5%。
x16的带宽就是:8 × 16 × 0.985 ≈ 126 GB/s。

嗯,这里要注意:实际可用带宽还要扣除协议开销,大概能到80%左右。

1.2 PCIe拓扑结构

PCIe的拓扑结构,我习惯把它想象成一个树形结构。树根是Root Complex,树枝是Switch,树叶是Endpoint。

Root Complex(根复合体)

Root Complex,简称RC。它是CPU和PCIe总线之间的桥梁。我做过一个项目,RC的设计直接决定了整个系统的性能上限。

RC的主要职责:

  • 管理PCIe总线枚举和配置
  • 处理来自Endpoint的请求
  • 转发中断和错误信息

你想想看,RC要是设计不好,整个PCIe树都跟着遭殃。我曾经遇到过RC的配置空间没初始化好,导致所有Endpoint都枚举失败,查了三天才找到问题。

Switch(交换器)

Switch,说白了就是个数据转发器。它把来自RC的数据包分发到各个Endpoint。

Switch内部有多个虚拟通道(VC),每个VC可以独立配置优先级。我建议在设计时,把实时性要求高的设备(比如NVMe SSD)放在高优先级VC上。

小技巧:Switch的端口可以配置为上行端口(Upstream)和下行端口(Downstream)。上行端口连RC,下行端口连Endpoint。别搞反了,我曾经见过有人把下行端口连到RC上,结果系统直接不认设备。

Endpoint(端点)

Endpoint就是实际的功能设备。比如显卡、网卡、SSD控制器,这些都是Endpoint。

Endpoint分为两种:

  • Function Endpoint——标准功能设备
  • Legacy Endpoint——兼容老PCI的设备

我建议新设计尽量用Function Endpoint,Legacy Endpoint的兼容性问题太多,调试起来很头疼。

1.3 PCIe分层协议

PCIe协议分三层:事务层、数据链路层、物理层。每层各司其职,有点像公司里的部门分工。

事务层(Transaction Layer)

事务层是最上层,负责生成和处理数据包。它把CPU发来的读写请求封装成TLP(事务层包)。

TLP的类型:

  • Memory Read/Write——内存读写
  • IO Read/Write——IO读写(老设备用)
  • Configuration Read/Write——配置空间读写
  • Message——消息传递(中断、错误等)

我记得有一次调试,发现设备老是超时。查了半天,原来是事务层没处理好Completion超时。嗯,这个坑我印象很深。

数据链路层(Data Link Layer)

数据链路层负责可靠传输。它给TLP加上序列号和CRC校验,确保数据不丢、不乱、不错。

这一层有个重要机制——ACK/NAK重传。发送方发完数据包后,必须等接收方回复ACK。如果收到NAK或者超时没收到ACK,就重传。

注意:数据链路层的重传机制虽然可靠,但会引入延迟。我建议在设计时,对延迟敏感的设备(比如GPU)要合理配置重传超时时间,别设得太长,也别设得太短。

物理层(Physical Layer)

物理层是最底层,负责把数据变成电信号发出去。它分为逻辑子层和电气子层。

逻辑子层负责:

  • 字节拆解和重组
  • 加扰和解扰(减少电磁干扰)
  • 链路训练和初始化

电气子层负责:

  • 差分信号驱动
  • 时钟恢复
  • 阻抗匹配

物理层这块,我建议重点关注链路训练。链路训练失败是PCIe最常见的故障之一。我曾经遇到过因为PCB走线阻抗不匹配,导致链路训练一直失败,最后换了板材才解决。

小结

好了,PCIe基础概念就聊到这儿。总结一下:

  • PCIe是串行点对点总线,带宽高、可扩展
  • 拓扑结构是树形:RC → Switch → Endpoint
  • 协议分三层:事务层、数据链路层、物理层

下一章咱们聊聊PCIe的配置空间和枚举过程,这部分在实际调试中特别重要。到时候我会分享一些我踩过的坑,保证让你少走弯路。

有什么问题,欢迎在课后交流。我是老张,咱们下节课见。