PCIe体系结构层次:物理层、数据链路层、事务层

做PCIe测试这么多年,我见过不少工程师一上来就盯着眼图、抖动这些物理层指标猛测,结果链路死活不通,最后才发现是上层协议握手出了问题。所以,我想先带你把这套层次结构彻底弄清楚。说白了,PCIe就像一栋三层小楼——事务层、数据链路层、物理层,每层各司其职,上下沟通密不可分。

第一层:事务层——负责“谈生意”

事务层(Transaction Layer)处于最顶层,主管CPU与设备之间的“商业谈判”。所有的读写请求、完成应答、消息传递,都由这一层打包成事务层包(TLP,Transaction Layer Packet),然后往下递交。

核心职责:

  • 把来自软件或上层驱动的请求,转换成符合PCIe规范的TLP。
  • 管理Non-Posted/Posted请求、Completion及Message。
  • 处理地址路由、ID路由、隐式路由。
  • 保证TLP的格式、序列号、TAG等字段正确。
实战建议: 在采购FPGA或交换机IP时,一定问清楚对方的事务层是否支持Completion with Data。我见过一个合作伙伴的IP核,Completion机制没开全,导致长时间pending timeout,整个系统卡死。这玩意儿,签合同前就得测明白。

另外,这里有个绕不过去的坑:一致性模型。PCIe规范定义了Strongly Ordered、Relaxed Ordering、ID-Based Ordering三种模型。很多人调了一周发现读写乱序,其实根源是RC端和EP端的Ordering配置不匹配。

事务层元素 主要作用 常见问题
TLP Header 标识类型、长度、地址 长度字段算错,CRC通不过
Data Payload 携带实际读写数据 边界对齐违反Max Payload Size
ECRC 端到端数据完整性校验 IP核不支持时容易忽略
Sequence Number 由数据链路层维护,但事务层参与管理 重传时序列号异常导致死等

第二层:数据链路层——负责“运输担保”

数据链路层(Data Link Layer)夹在中间,说白了就是个“快递”。它接收事务层下来的TLP,加上序列号(Sequence Number)和链路层CRC(LCRC),再封装成数据链路层包(DLLP),递交给物理层。同时,它还处理接收端的ACK/NAK重传机制。

为什么这层重要? 因为物理层传输是有丢包和误码概率的。数据链路层的重传协议保证了每个TLP一定能正确到达对端。如果这个层的状态机出问题,整个链路就会无限重传,造成带宽直接归零。

关键指标: Replay Buffer深度、ACKD序列号更新频率。我建议在做压力测试时,重点观察DLLP状态机的REPLAY_NUM_ROLLOVER次数。一旦发现频繁滚回,就说明链路质量差或者Replay Buffer太小。

不过,这里常常被忽视的是数据链路层初始化过程。链路从复位到正常工作,数据链路层需要经历DL_Inactive→DL_Init→DL_Active三个状态。我在一个Gen3项目上遇到过链路层卡在DL_Init,问题竟是对方发送的DLLP中的ACK序列号与我方的期望不一致。你说这种硬啃PCIe Base Spec的苦头值不值得吃?

第三层:物理层——负责“真实搬运”

物理层(Physical Layer)分为两个子块:逻辑子块和电气子块。逻辑子块负责加扰(Scrambling)、8b/10b或128b/130b编码、符号对齐等;电气子块负责差分信号驱动、接收均衡、眼图调整、Rx Detect等。

嗯,这个地方经常有人搞混。LTSSM(链路训练和状态机)在物理层里,但它却能动用数据链路层的资源。所以,当你看到链路在Recovery或Configuration状态徘徊时,不要只盯着电气参数看,也可能数据链路层的TLP路由根本没就绪。

真实教训: 我曾经遇到一个案子,板子跑Gen2一切正常,升级到Gen3链路就是不稳定。用了协议分析仪一抓,发现物理层逻辑子块的加扰种子与对端不一致。后来查出来是FPGA的PCS/PMA核配置中Tx Lane-to-Lane Deskew参数漏了。所以你调物理层时,一定把逻辑子块和电气子块的寄存器顺序读一遍。

三层如何协同?一张图讲明白

下面这张图,我把三层之间的数据流动、协议包类型以及核心交互画出来了。可以看到TLP从事务层产生,到数据链路层加序列号与LCRC,再到物理层加Start/Stop Frame和加扰,最后驱动到差分线上。接收端则逆向还原。这就是PCIe一致性的基本信息流。

PCIe 三层体系结构及数据流 事务层 (Transaction Layer) 生成TLP (读/写/Completion/Message) 地址路由 | ID路由 | 隐式路由 | 事务排序 管理Non-Posted/Posted/Completion/Message四种事务 数据链路层 (Data Link Layer) 接收TLP → 添加Sequence Number → 添加LCRC 封装为DLLP (ACK/NAK 重传机制) 管理Replay Buffer,维护ACK序列号 物理层 (Physical Layer) 逻辑子块:加扰/解扰, 8b10b或128b130b编码, 符号对齐 电气子块:差分驱动, 接收均衡, 眼图调整, Rx Detect LTSSM状态机: Detect → Polling → Configuration → L0 Start/Stop Frame | 弹性缓冲 | 去偏移 (Deskew) TLP: 事务层包 由事务层生成 DLLP: 数据链路层包 含序列号+LCRC PLP: 物理层包 加Start/Stop及加扰

不同层的一致性测试重点

搞清楚结构,再做测试就有方向了。每一层有不同的测试标准和方法,我列一个速查表给你:

测试层级 主要测试项 典型工具 常见失败原因
事务层 TLP格式、地址映射、Completion超时、Ordering模型 PCIe分析仪、LTSSM状态跟踪 Header字段错误、Tag管理混乱、Completion不匹配
数据链路层 ACK/NAK协议、重传次数、Replay Buffer溢出 逻辑分析仪、链路抓包 序列号不同步、LCRC校验失败、状态机卡在DL_Init
物理层 眼图、抖动、Rx灵敏度、LTSSM状态跳转、de-emphasis 示波器、BERT、VNA 信号完整性不足、加扰偏移不对、同步头丢失

你想想看,如果事务层的TLP格式都不对,再怎么调物理层的均衡器也白搭。所以,我的习惯是:先拿协议分析仪在事务层把命令握手跑通,再到数据链路层验证重传机制,最后才去动物理层的眼图模板。这个顺序,能让你的调试效率翻倍。

一句话总结: 物理层决定能不能通,数据链路层决定通得稳不稳,事务层决定通得对不对。三层一致性测试合起来,才是完整的PCIe合规验证。