2. PCIe体系结构:层次结构

今天咱们来聊聊PCIe最核心的骨架——它的三层架构。很多人学了很久PCIe,一说起事务层、数据链路层、物理层,总觉得是背概念。我刚开始做这行时也这么觉得,直到被一个链路训练问题折磨了一周……嗯,从那以后我才真正理解,这三层是怎么一环扣一环工作的。

说白了,PCIe的层次结构就像公司里的三个部门:事务层是业务部,负责“我们要传输什么”;数据链路层是质检部,保证传输不出错;物理层是物流部,管的是把货(电气信号)实实在在发出去。你看,放在一起就很好理解了。

2.1 事务层(Transaction Layer)

事务层在最上层,它负责的事情简单说就是——完成包的组装和解析。你想想看,你的NVMe驱动要读一块数据,它不会直接跟物理线路打交道,而是把请求封装成一个TLP(事务层包),然后往下扔。

事务层的核心职责:

  • TLP组装与解析:把读、写、配置、消息等请求打包成标准格式
  • 事务排序:处理不同事务间的优先级和顺序关系
  • 流量控制(Flow Control):管理发送端和接收端的缓冲区状态,防止数据溢出

我记得在我早期调试NVMe SSD时,遇到过一个问题:盘在特定负载下时不时丢失请求。折腾了好久,最后发现是事务层的VC(虚拟通道)没配好,导致写请求被阻塞了。所以后来我给团队定了个规则——调试NVMe问题,先查事务层,别急着捅到物理层去。

TLP的主要类型:

类型用途个人避坑点
Memory TLP内存读写,最常用注意地址对齐
I/O TLP传统I/O空间访问新设计尽量不用
Configuration TLP配置空间访问枚举阶段的关键包
Message TLP中断、错误上报等INTx与MSI差异很大
我的小技巧: 如果你在用逻辑分析仪抓TLP,建议先关注Fmt和Type字段。这两个字段决定了包的种类,一眼就能看完正在做什么操作。

2.2 数据链路层(Data Link Layer)

事务层把TLP交到数据链路层。这一层的底色是什么?两个字——可靠。它存在的意义,就是保证事务层交下来的包能准确无误地传到对端。

  1. 序列号添加:每个TLP被加上一个12位的序列号(Seq Num),方便去重
  2. CRC校验(LCRC):32位循环冗余校验,检测传输错误
  3. 链路层ACK/NAK协议:通过DLLP(数据链路层包)完成重传机制

你可能觉得,为什么有了CRC还要加上序列号和重传?我曾经也被问到过这个问题。事实是——物理链路再快也难免有偶发错误,比如一个bit翻转。如果没有数据链路层这层保障,上层看到的就是损坏数据,轻则程序崩溃,重则数据损坏到无法修复。

避坑指南: 我曾经在一个Gen3项目中,链路训练一直通过,但数据搬运出错。排查了两天,发现是数据链路层的ACK包响应超时阈值没调对,导致大量虚假重传。这一点在长距离传输或转接卡场景中特别容易出现。

数据链路层和事务层之间通过流控信用(Flow Control Credit)交互。发送端必须先向接收端申请“信用”,确认对方有接收空间,才发送TLP。为什么要这样?你想象一下,如果不管对方有没有缓冲区就猛发——那数据不就丢了吗?

2.3 物理层(Physical Layer)

物理层是最底下的,也是我折腾得最多的。它负责把数据比特从A点传到B点,同时完成链路训练和电气适配。物理层又分两个子层:逻辑子层和电气子层。

逻辑子层的工作:

  • 加扰/解扰(Scrambling)——减少EMI干扰
  • 符号编码——比如Gen3是128b/130b编码
  • 链路训练状态机(LTSSM)——这是物理层里最重要的东西之一

电气子层的工作:

  • 差分信号的发送与接收
  • 去加重(De-emphasis)与预加重(Pre-shoot)
  • 接收均衡(CTLE、DFE)

我记得第一次调试PCIe Gen3信号完整性时,看到眼图半开不开的。当时还以为是板厂没做好,后来仔细查,发现是物理层的去加重设置不对。换了一组系数,眼图一下就张开了。所以做硬件的人,一定要把物理层的电气参数跟SI(信号完整性)联合起来看。

物理层的关键概念一览:

概念说明重要性
LTSSM链路训练与状态管理⭐⭐⭐
加扰随机化数据,降低EMI⭐⭐
差分配对TX+/TX-互为反相⭐⭐⭐
CTLE/DFE连续时间线性均衡/判决反馈均衡⭐⭐⭐

2.4 三层协作流程

说了这么多,这三层到底怎么配合的呢?我画了个图,你一看就明白了。

PCIe三层架构数据流向 PCIe 三层架构数据流向 事务层(Transaction Layer) 生成TLP · 事务排序 · 流量控制 核心单元:事务层包(TLP) Memory / IO / Config / Message TLP 数据链路层(Data Link Layer) 序列号 · LCRC · ACK/NAK重传 核心单元:数据链路层包(DLLP) 流控信用 · 超时重传 · 去重 物理层(Physical Layer) 加扰/解扰 · 符号编码 · 链路训练(LTSSM) 核心单元:电气子层 + 逻辑子层 差分信号 · 去加重 · CTLE/DFE 关键流水 ① 事务层封装TLP ② 数据链路层加Seq + LCRC ③ 数据链路层等待ACK/NAK ④ 物理层加扰/编码后发送 ⑤ 接收端反向解包 ⑥ 数据链路层验证CRC ⑦ 事务层提取有效数据 整条链路不可跳过 任何一层都会出问题

你看上图,数据从上往下流动。一个读请求从事务层生成TLP,包装好内存地址、长度等信息。往下到数据链路层,加上序列号和CRC校验。再到物理层,完成编码、加扰,最终变成差分信号在线路上传出去。

接收端反向操作——物理层解扰解码,数据链路层校验CRC、去重,事务层再解析响应包。整个链条上,任何一层出问题都能让你的NVMe盘“掉线”。

核心提醒: 调试PCIe链路,要先定位是哪一层出了问题。

  • 如果链路训练过不去,多半是物理层问题
  • 如果链路训练OK但数据传错,先查数据链路层
  • 如果是设备枚举后数据搬运不正确,那是事务层的事