3、物理层基础:物理层子层划分、差分信号对、通道与链路的概念

好,咱们正式开始聊物理层。很多同学学PCIe,一上来就被各种分层模型搞晕了。我个人习惯是,先别管事务层、数据链路层那些花里胡哨的,先把物理层吃透。为什么?因为物理层是PCIe通信的“地基”,地基不稳,上层再牛也白搭。

今天这一讲,咱们就掰开揉碎了,把物理层的几个核心概念讲清楚:物理层内部怎么划分的?差分信号对是啥?通道(Lane)和链路(Link)到底有什么区别?

3.1 物理层子层划分:逻辑子层与电气子层

PCIe的物理层,其实不是铁板一块。它内部又分成了两个子层:逻辑子层电气子层。你想想看,一个信号从发送端到接收端,既要处理“0和1”这些数字逻辑,又要处理电压、电流这些模拟特性。这两件事性质完全不同,所以分开处理更合理。

3.1.1 逻辑子层(Logical Sub-block)

逻辑子层,说白了就是负责“数字部分”的活儿。它主要干这几件事:

  • 编码与解码:比如8b/10b编码(Gen1/Gen2)或者128b/130b编码(Gen3及以上)。把数据流变成适合在高速链路上传输的格式。
  • 加扰与解扰:为了防止数据中出现连续的“0”或“1”,导致时钟恢复困难,逻辑子层会对数据进行加扰。
  • 链路训练状态机(LTSSM):这是物理层的“大脑”,负责管理链路的初始化、训练、电源状态切换等。这部分后面我们会专门用一节课来讲。
  • Ordered Set的生成与解析:比如TS1、TS2这些训练序列,都是逻辑子层负责的。

嗯,这里要注意:逻辑子层虽然叫“逻辑”,但它并不完全独立于硬件。它通常是用数字逻辑电路(比如Verilog代码)实现的,但它的行为完全由协议定义。

我的经验: 我在调试一个Gen3的链路训练问题时,发现链路老是训练失败。查了半天,最后发现是逻辑子层里的加扰模块有个时序违例,导致TS1序列被错误地加扰了。所以,逻辑子层的验证,一定要覆盖各种边界情况,尤其是加扰/解扰的同步问题。

3.1.2 电气子层(Electrical Sub-block)

电气子层,就是处理“模拟部分”的。它直接和物理介质(比如PCB走线、连接器)打交道。主要职责包括:

  • 发送器(Tx):把数字信号转换成差分电压信号,驱动到链路上。
  • 接收器(Rx):从链路上接收微弱的差分信号,放大、均衡,再转换成数字信号。
  • 时钟恢复(CDR):从接收到的数据流中提取出时钟信号。
  • 阻抗匹配与去加重:保证信号完整性,减少反射和损耗。

电气子层是芯片里最“硬核”的部分,通常由模拟电路工程师设计。我们做验证的,虽然不用去设计晶体管级别的电路,但必须理解它的行为特性,比如信号眼图、抖动、电压摆幅这些参数。

避坑指南: 我曾经遇到过一个案例,芯片在实验室里跑得好好的,一上量产板就频繁掉链。最后定位到是电气子层的接收器均衡参数没配置好,导致对不同的PCB走线长度适应性很差。所以,电气子层的验证,一定要配合真实的PCB信道模型来做仿真,不能只看理想情况。

3.2 差分信号对(Tx/Rx)

PCIe用的是差分信号传输,而不是传统的单端信号。为什么?因为差分信号抗干扰能力强,而且能提供更高的数据传输速率。

一个差分信号对,由两根线组成:一根叫P(Positive),一根叫N(Negative)。发送端在P和N上分别发送幅度相等、极性相反的信号。接收端通过比较P和N的电压差来判断是“1”还是“0”。

举个例子:假设发送端要发一个“1”,它会在P线上输出+500mV,在N线上输出-500mV。那么接收端看到的差分电压就是(+500mV) - (-500mV) = 1000mV。如果要发“0”,则反过来,P线输出-500mV,N线输出+500mV,差分电压就是-1000mV。

你想想看,如果外界有共模噪声(比如电源噪声),它会同时耦合到P和N两根线上。假设噪声是+100mV,那么P线变成+600mV,N线变成-400mV,差分电压仍然是(+600mV) - (-400mV) = 1000mV。噪声被抵消了!这就是差分信号抗干扰的秘诀。

关键点: 每个PCIe设备,都有独立的发送差分对(Tx+ / Tx-)和接收差分对(Rx+ / Rx-)。发送和接收是分开的,所以PCIe天然支持全双工通信。

3.3 通道(Lane)与链路(Link)的概念

这两个概念,很多初学者容易搞混。我刚开始学的时候也迷糊过。咱们用一个比喻来理解:

  • 通道(Lane):就像一条“单车道”。它由一组发送差分对和一组接收差分对组成。一个Lane可以同时发送和接收数据。
  • 链路(Link):就像一条“高速公路”。它由多个Lane(车道)并在一起组成。比如x1链路就是一条单车道,x4链路就是四条车道并排跑。

更准确地说:

概念 组成 带宽 举例
Lane(通道) 1组Tx差分对 + 1组Rx差分对 每个方向一个通道的速率(如Gen3 x1为8 GT/s) 一个Lane就像一根水管
Link(链路) 多个Lane的集合(x1, x2, x4, x8, x16) 所有Lane的带宽之和 一个Link就像多根水管并在一起

举个例子:一个PCIe Gen3 x4的链路,意味着它有4个Lane。每个Lane的速率是8 GT/s(Giga Transfers per second,每秒十亿次传输)。那么整个链路的单向带宽就是 4 × 8 = 32 GT/s。注意,这里说的是“传输速率”,不是“数据速率”,因为还有编码开销(128b/130b编码,效率约98.5%)。

我的习惯: 在写验证环境时,我通常会把Lane和Link抽象成两个不同的类。Lane类负责处理单个通道的物理层行为(比如训练序列、加扰、去加重),Link类负责管理多个Lane的同步和聚合。这样代码结构清晰,也方便扩展。

3.4 小结

好了,这一讲的内容就这些。咱们总结一下:

  • 物理层分为逻辑子层(处理数字逻辑、编码、训练状态机)和电气子层(处理模拟信号、时钟恢复、均衡)。
  • PCIe使用差分信号对(Tx+/Tx- 和 Rx+/Rx-)来传输数据,抗干扰能力强,支持全双工。
  • Lane是基本的数据通道,由一对Tx和一对Rx组成。Link是多个Lane的集合,决定了总带宽。

下一讲,我们会深入链路训练状态机(LTSSM),看看PCIe设备从上电到稳定通信,到底经历了哪些状态。那才是真正烧脑的地方,做好准备!