本文意在督促自己持续学习 PCIe。日更长文做不到,但三言两语总该能写出来。一天至少更新一个 PCIe 相关知识点,聚沙成塔、集腋成裘,相信几年下来总能覆盖绝大部分的 PCIe 知识面。本文注定越往后越难更,看我能坚持多久吧。
PCIe 物理层包(Physical Layer Package, PLP)又称有序集(Ordered-Set),长度为4B整倍数,用于链路训练、时钟偏差补偿、使链路进入电气闲或退出电气闲。PCIe 有序集有以下几种:
RCRB全称根复合体寄存器块(Root Complex Register Block),在常规配置空间之外额外指定4KB存储空间给RC用,该4KB空间所在的地址空间不能与常规配置空间或内存空间出现重叠。RCRB使用方式与常规配置空间类似,可用作PCIe的扩展能力寄存器或其他指定寄存器。
PCIe Requester发出的所有PCIe Rd、NPWR、Atomic请求及PCIE 6.0的DWMR请求均需要Completer返回CPL/CPLD,CPL/CPLD中含有Cpl.Status字段,指示完成情况。那么CPL状态有哪几种呢?如下:
PCIe设备发出的请求中有些请求需要Completer反馈Completion,此时Requester会等待Completion再进行下一步操作。在某些异常情况下,比如配置不当、系统故障等,Requeser无法收到Completion。为了不影响进一步使用,需要一种超时退出机制让Requester从这种等待状态恢复过来,这就是超时退出机制。
几点注意事项:
BAR,Base Address Register,是PCIe配置空间中从地址0x10开始的6个基地址寄存器,用以存储PCIe设备在PCIe地址空间中的基地址。该基地址非CPU内存的映射地址,两者间存在映射关系。通过配置PCIe设备BAR可以实现PCIe地址空间的动态分配。
转发事务,请求者发送TLP到完成者,无需完成者进行反馈。转发事务有MWr,Message。
非转发事务,请求者发送TLP到完成者,按照分割事务进行处理,需要完成者进行反馈。非转发事务有MRd,DMWr,IORd,IOWr,CfgRd,CfgWr。
由于转发事务无需反馈,其比非转发事务性能更高。非转发事务出错时,可以得到硬件通知;转发事务出错时,只能通过完成者记录错误并上报RC,由软件进行处理。
参考:non-posted事务和posted事务
参考:PCIe 6.0,到底 6 在哪?
PCIe 有3种时钟架构,分别为:
友情链接:
为了解决不同处理器间的互联问题, PCIe 提供一种 Crosslink 的链接方式。两个同方向的 Port 相接称为 PCIe Crosslink,比如 Downstream Port 接 Downstream Port 或 Upstream Port 接 Upstream Port PCIe。
Cosslink 是一种可选的能力。支持 Crosslink 的两个 PCIe 设备在 Link Training 的时候沟通谁是 DSP 谁是 USP(具体可搜索 Crosslink random time)。
友链:PCIe中的Crosslink与Multi-Root/Multi-Processor系统
PCIe有四种复位方式:冷复位(Cold Reset)、暖复位(Warm Reset)、热复位(Hot Reset)及功能层复位(Function Level Reset)。简介如下:
冷复位和暖复位基于边带信号由系统生成,称为基本复位,由硬件触发;热复位由上游设备生成,以包(TS有序集)的形式传达到下游,由软件触发。
PCIe设备复位释放后,重新进行链路训练及初始化,需等待至少100ms才能向其发出访问请求。若初始化之前便收到了配置请求,需返回RRS CPL要求重传。
友情链接:
对于不同的 Completer 或 VC,可以根据 CPLD TLP Header 中的 TC 和 Completer ID 来判断该笔 CPLD 归属于哪一笔 MRd。
对于同一 Completer 同一 VC,问题所言的情况(多笔 MRd,MRd/CPL 失序)不会发生。MRd 是非转发请求,Requester 在发出 MRd 请求后,在收完 CPL/CPLD 或 CPL Timeout 之前不会发下一笔 MRd。即便能够连续发出多笔 MRd,也不涉及 MRd/CPLD 失序的情况。Flow Control机制对于不同 VC 不保序,但是对同一VC是保序的,MRd 在Flow Control NPR Buffer中按照先入先出的顺序发出。
不一样。
Logic Idle Symbol ,逻辑闲符号数据是 0x00,与 EIOS 没啥特定关系,当链路上临时没有数据包要发送时候(链路逻辑闲),发送器继续发送逻辑闲符号。
Idle Symbol (IDL) ,数据是 0x7c,是 EIOS @Gen1/Gen2 中的一个符号。Gen1/Gen2时,一个 EIOS 由 1 COM + 3 IDL 组成,Gen3 及以上时 EIOS 由 16 个 0x66组成。
Tx Logic Idle 时,所有 lane 上都发 Logic Idle Symbol。
更多请看本人博文:【PCIe有点闲】电气闲,逻辑闲,到底谁更闲?
SDS,全称 Start of Data Stream Ordered Set,在发送Data Block 第 1 DW 前发送。与之对应的是EDS,发送Data Block 最后 1 DW 后发送 EDS,标志数据块的结束,下一笔就是 OS 有序集了。
发送 SDS 对链路状态有所要求,在 LTSSM 跳转到 L0 状态前的最后一个子状态发送 ,包括 Cfg.Idle、Rcvr.Idle、Tx_L0s.FTS,且只能在这些状态时发送。
SDS/EDS 仅适用于Gen3 及以上速率,不适用于 Gen1/Gen2 是因为 Gen1/Gen2 时还没出现 SDS/EDS,协议要兼容老版本。Gen1/Gen2 时,LTSSM 跳到 L0 前不发 SDS 发啥?在所有lane上同时发 Logic Idle Symbol,就是0x00。
Loopback 时,OS<->DataBlock切换时 Tx 无需发送 SDS 或 EDS,Rx 也 无需检查 SDS 或 EDS。
非 PCIe 协议运行在 PCIe PHY 上或发送 TS Message 时,在 LTSSM 部分子状态采用 Modified TS1/TS2。
允许发送 Modified TS1/TS2 的 LTSSM 子状态有 Cfg.Lanenum.Wait、Cfg.Lanenum.Accept、Cfg.Complete。在此之前的,必须在 Polling.Active、Polling.Cfg、Cfg.Linkwidth.Start、Cfg.Linkwidth.Accept 状态将 Standard TS1/TS2 Symbol 5 的 bit[7:6] 置为 2’b11,以此在收发端协商是否支持 Modified TS。只有在收发端均支持 Modefied TS 时,才能发送 Modified TS,否则仍然发送 Standard TS。
跟 Standard TS1 / TS2 比,Modified TS 更改了 Symbol 6~15,这些 Symbol 主要是均衡相关字段,采用 Modified TS 是为了在协商完毕链路宽度后,同时协商Lane number及alternate protocolol,并bypass EQ。
PCIe 路由一般指 TLP 路由,DLLP 只在相邻设备 DL 间传递,不携带路由信息也无需路由。PCIe TLP 路由方式有 基于地址、ID 的路由及隐式路由 3 种,各组件根据 TLP Header 中的相关字段决定以何种方式路由该 TLP。
参考:
TLP Header 中的 Requester ID, Completer ID 用以在 PCIe Hierarchy 中唯一标识生成、完成该 TLP 的 PCIe Function,两者均由 Bus Number、Device Number 及 Function Number 组成的 (ARI 没有Device Number)。Requester 的 BDF 称为 Requester ID,Completer 的 BDF 称为 Completer ID。
对于 MWr 等基于地址路由的转发事务而言,Requster ID 可有可无;对于 MRd 等基于地址路由的非转发事务而言,要求有 Reqesuter ID,其 Completion 中携带有 Completion ID 及 Requester ID。
乱序应该放在编码之前。
发送序列中存在连续重复序列时,发送能量会集中在特定频点附近较窄的范围,产生较大的电磁辐射。scramble 乱序,是为了消除连续出现的重复序列,把能量集中的离散能量谱打散成白噪声,从而大大减小 EMI。
8b/10b,128b/130b,1b/1b 等编码,在串行数据流中加入时钟信息,使得接收端 PLL 能够从数据流中恢复出时钟。编码有以下益处:① 减少时钟布线的问题;② 减小时钟线引入的电磁干扰;③实现直流平衡;④增强误码检测性能。
若先编码再乱序,数据流中的时钟信息会被破坏,直流均衡也难以保证。
Polling.Compliance 是 LTSSM Polling 子状态之一,用于 PCIe 链路的合规性测试,与 PCIe 测试设备配合使用。Polling.Compliance 期间,收发端 PCIe 设备发送 Compliance Pattern,在相邻通路间产生最坏的干扰及 EMI,测试设备来评估待测 PCIe 链路上的电压、时序是否符合规范,并测试 EMI、BER 及串扰程度。Loopback 模式下,32 GT/s 及以上速率时,Loopback Master 发送 Modified Compliance Pattern。TS 或 Link Control Register 2 也可以特别要求发送 Modified Compliance Pattern。
正常操作中一般不会进 Polling.Compliance 状态,但是所有的 PCIe 设备 必须 实现该功能,这是其 DFT 不可或缺的一环。
Polling.Active 状态进入 Polling.Compliance 的 3 个条件(满足其一即可):
所有 Lane 退出电气闲 且发送完 1024 个 TS1 后,Polling.Compliance 退回到 Polling.Active。
位锁定、符号锁定、Block 对齐、链路宽度、链路速率、极性、链路反排、Lane 间消抖
M-PCIe 是面向移动设备等功耗敏感型设备 PCIe 协议,即 Mobile-PCIe。
M-PCIe 与标准 PCIe 的 TL、DL 层相同。相比于标准 PCIe,M-PCIe 引入了 MIPI M-PHY。M-PHY 能够进行快速的电源状态切换,从而降低功耗。M-PHY 仅在实际传输时处于最大功耗状态,Burst 传输完毕进入低功耗状态“STALL”,紧接着退至最低功耗“HIBERN8”状态。此外,M-PHY 支持非对称链路,允许链路上存在不同数量的收发器。
M-PCIe 功耗更低,但其支持的速率不如标准 PCIe 高。M-PCIe 支持 Gear1~3 三种速率,为 1.25 GT/s, 2.5 GT/s 及 5.0 GT/s,Gear2/3 分别对应 PCIe Gen1/2 速率。
需要。不能。
无论收发端支持的最高速率是多少,第一次 Traning 必须进 Gen1 L0,这是协议要求的。
即使是 Gen2 速率,第一次也要按照 Gen1 进行 Traning。到达 Gen1 L0后,由于还未达到最高速率,LTSSM 进入 Recovery, 状态跳转如下:
L0 (Gen1)
-> Recovery.RcvrLock
-> Recovery.RcvrCfg
-> Recovery.Speed
-> Recovery.RcvrLock
-> Recovery.RcvrCfg
-> Recovery.Idle
-> L0 (Gen2)
。
随着 PCIe 的迭代,传输速率越来越高,高速信号传输中的信号衰减问题越来越大。目前解决信号衰减的三大方案:① 高速 PCB 板材;② Retimer;③ Redriver。Retimer 是三者中性价比最高的一种方案,也更为主流。2021年是 Retimer 发展元年。
Retimer 通过 其 Rx 端 CTLE/DFE (连续时间线性均衡/判断反馈均衡) 、CDR (时钟数据恢复) 及 Tx 端 EQ (均衡),来够补偿信道损耗,消除信号抖动,提升信号完整性,从而增加传输距离。
Redriver 是放大信号,Retimer 是重新生成信号。Retimer 比 Redriver 性能更高,但时延也更大。
友情链接:
同一 Link 多条 Lane 之间难免存在 Skew,即便 Tx 端采用同一 Clock 同时发送,不同 Lane 上到达 Rx 时间也难以相同。PCIe Lane-Lane Skew 一般源于以下几点:
Gen1/Gen2 时常用检测 OS 序列中的 COM 符号来实现多 Lane 的 De-skew;Gen3及以上常采用检测 SDSOS、EIEOS、SKP等方式来实现 De-skew,具体情况需具体分析。
Link Error,链路错误,是指连接两个 PCIe 设备的物理链路出现错误,通常在物理层检测出并传达到数据链路层。Link Error 包括以下几种:8b/10b 解码错误、framing 出错、符号/Block 锁定后失锁、弹性缓存上下溢出及 Lane 间消抖失败。
如果是在链路 Training 期间发生链路错误(非 Detect、Disable状态),无需特殊操作,LTSSM 正常运转,各个状态的 Timeout 机制保证 LTSSM 回转到 Detect 状态进行 Retraining。
如果是在 L0 状态发生链路错误(frame error等),可以由软件控制 LTSSM 由 L0 -> Recovery 进行链路恢复,或者重新训练。需要注意的是,出现链路错误后,下游设备是无法通过错误链路告知上游设备的,需要由错误链路上游的交换开关 USP 或 RC 上报错误,开启 Retraining。软件通过查验相关寄存器确认是否训练成功。
为了扩展 PCIe 设备的适用范围,PCIe 5.0 开始支持 Alternate Protocol。Alternate Protocol 是指运行在 PCIe PHY 上的非标准 PCIe 协议,目前有 CXL 协议。
CXL 运行在 PCIe 5.0 PHY 上,支持 CXL 协议的设备也支持 PCIe 协议。那么到底采用 CXL 还是 PCIe 协议,收发端在进行链路训练的时候可以进行协商,即 Alternate Protocol Negotiation。Alternate Protocol Negotiation 采用 Modified TS1/2,跟 Cfg.Lanenum.Wait、Cfg.Lanenum.Accept、Cfg.Comple 并行,bypass EQ。可参考 2022.02.21 Modified TS 相关介绍。
勘误:
2022.02.21 ,alternate protocol 协商与 lane number 协商并行。
2022.02.15,添加参考文献
PCIe Switch 传输 TLP 有两种模式:① Store & Forward;② Cut-through。
参考: