2022.04.01 - PCIe 伪端口(Pseudo-port)是什么?
PCIe 伪端口,故名思义,假的端口。伪端口仅具有 PCIe 端口的部分属性。比如 Retimer 的 Port 就是伪端口。Retimer 的 Tx 和 Rx 只有物理层部分,没有也不需要数据链路层、传输层。
2022.04.02 - 如何判断 PCIe 系统是否要用 Retimer?
有两种常用的方法来判断 PCIe 系统是否需要 Retimer:
根据信道衰减:检测端到端的 PCIe 信道插入衰减,若信号衰减大于 PCIe 信道预算,则需要采用 Retimer。信道插入衰减包括 RC 和 EP 的封装损耗。
根据眼图:根据均衡后的信号眼图及误码率来判断是否要用 Retimer。若眼高 EH<15mV,眼宽 EW<0.3UI,或者误码率 BER>10-12,则建议采用 Retimer。此方法考虑了信号反射及码间干扰,比采用信道衰减的判别法更为准确。
▼ 表1 PCIe 系统各部分的信号衰减预算
Root package | Non-root package | CEM connector | Add-in Card(AIC) | System Budget | Total channel budget |
9.0 dB | 4.0 dB | 1.5 dB | 9.5 dB | 17.5 dB | 36 dB |
表注:System budget 包括基板、转接卡、基板-转接卡, PCIe CEM 连接器。
参考:
Seamless Transition to PCIe® 5.0 Technology in System Implementations
2022.04.03 - PCIe 预编码(Precoding)是干啥的?
PCIe 接收端采用 DFE (决策反馈均衡器) 进行判决,在 32 GT/s 速率下比 16 GT/s 更容易发生 Burst Error (连续突发错误)。为了减少 Burst Error 的发生,Gen5 速率下可以选配 Precoding。Precoding 仅适用于 32 GT/s 及以上速率,其他速率时不开启。PCIe Rx 通过 EQ TS2 请求 Tx 开启 Precoding。
Precoding 可以把连续多bit的 Burst Error 拆分为 2 bit 的 Entry Error 及 Exit Error,从而达到消除 Burst Error 的目的。对于单 bit 的突然错误,开启 Precoding 后会变成 2 bit 错误,从而使系统误码率 BER 会提升为之前的两倍。
Precoding 发生于 Tx Scramble 之后、Rx De-scramble 之前。开启 Precoding 不会影响信号质量及完整性。PCIe Precoding 示意图如下:
▲图 1: Precoding working the scrambler / de-scrambler
友情链接:
Seamless Transition to PCIe® 5.0 Technology in System Implementations
[FPGA 实现及PCIe IP 核知识点] PCIe 为什么要增加 Precoding?
2022.04.04 - PCIe Equalization 有哪几种模式?
PCIe Equalization 有 3 中模式:
Full EQ Mode:全均衡模式。采用该模式时,PCIe 链路会对 8 GT/s 及以上每一档速率都要进行一次均衡。对于 32 GT/s,要在 8 GT/s、16 GT/s 及 32 GT/s 时都进行一次 EQ,耗时较久。
EQ Bypass to highest rate:只在最高速率进行一次 EQ。该模式仅适用于 32 GT/s 及以上速率,当 8 GT/s、16 GT/s 开启该模式时, 8 GT/s、16 GT/s 仍然不做 EQ。
No EQ needed:采用该模式时,PCIe 链路不做 EQ。采用该模式能够大大节省 EQ 的时间,以最快速度建立连接。
2022.04.05 - PCIe Full-Equalization 是啥?
Full EQ Mode,全均衡模式, 是最传统的 PCIe 均衡模式。采用该模式时,链路训练到达 2.5 GT/s L0 后,返回 Recovery 继续针对 8 GT/s、16 GT/s 及 32 GT/s 等速率从低到高依次进行 EQ,直到完成最高速率 EQ。随着传输速率的提高,需要 EQ 的此时越来越多(单次约100 ms),EQ 耗时越来较久。
2022.04.06 - PCIe Bypass-Equalization-to-Highest-Rate 机制是啥?
如前文(2022.04.05)所述,采用 PCIe Full-EQ 模式链路训练耗时很久,EQ-to-Highest-Rate 模式是缩减 EQ 时间的方式之一。对于支持 32 GT/s 及以上速率的设备,其可能根本无需工作在 8 GT/s 或 16 GT/s 速率,这时再针对 8 GT/s 或 16 GT/s 速率进行 EQ,多少有点浪费。
只有链路两端设备均支持 Bypass-Equalization-to-Highest-Rate 时才能采用该模式时,否则还是会按照 Full-EQ 模式进行链路训练及均衡。链路双方在 8b/10b 编码期间通过 TS 进行协商,决定是否要采用 Bypass-Equalization-to-Highest-Rate 模式进行均衡。如果协商后决定采用 Bypass-Equalization-to-Highest-Rate 模式进行链路训练,链路到达 2.5 GT/s L0 后,返回 Recovery 直接切速到最高速率并针对最高速率(32 GT/s 或以上)进行 1 次 EQ。对于两端有能力最高支持 32 GT/s 及以上速率的设备,如果把目标速度设置为 8 GT/s 或 16 GT/s 速率,是不建议采用 Bypass-Equalization-to-Highest-Rate 模式的,即便采用了,也不会针对 8 GT/s 或 16 GT/s 的目标速率进行 EQ。
2022.04.07 - PCIe No-Equalization-Needed 机制是啥?
如前文(2022.04.05)所述,采用 PCIe Full-EQ 模式链路训练耗时很久,No-Equalization-Needed 模式是除 Bypass-Equalization-to-Highest-Rate 模式外的另一种缩减 EQ 时间的方式。
从名字也看得出来,No-Equalization-Needed 模式比 Bypass-Equalization-to-Highest-Rate 模式更狠,采用 No-Equalization-Needed 模式时一次均衡都不做,能够大大节省 EQ 的时间,以最快速度建立连接。如果本地存有之前均衡预设好的值,或者对链路质量足够有信心觉得不用 EQ,可以选用此模式不做 EQ。
只有链路两端设备均支持 No-Equalization-Needed 时才能采用该模式时,链路双方在 8b/10b 编码期间通过 TS 进行协商,决定是否要采用 No-Equalization-Needed 模式进行链路训练。如果协商后决定采用 No-Equalization-Needed 模式进行链路训练,链路到达 2.5 GT/s L0 后,返回 Recovery 直接切速到最高速率且不做 EQ。对于两端有能力最高支持 32 GT/s 及以上速率的设备,如果把目标速度设置为 8 GT/s 或 16 GT/s 速率,是不建议采用 No-Equalization-Needed 模式的。非要采用的话,也行,同样不会针对 8 GT/s 或 16 GT/s 等任何速率进行 EQ,但是链路信号质量得不到保证。
2022.04.08 - PCIe Quiesce Guarantee 是什么?
Quiesce Guarantee,静默保证,是 TS 中的一个字段(Symbol6 bit6),常用于 DL_Active之后重新进行 EQ 的情况。Quiesce Guarantee 是一种可选的手段,跟 TS 中的 Request Equalization、Equalization Request Data Rate 字段配合使用。
链路工作在 8 GT/s 或以上速率时,如果 DSP 检测到 EQ 问题或者 USP 想要重新 EQ,则需要重新进行 EQ。此时 DL 层可能正在进行数据传输,如果贸然启动 EQ,有可能会在 Port、Device、System 层面引发错误。比如,DSP 发起了一笔 MRd,在 收到 CplD 之前进入 EQ,鉴于 EQ 耗时较久,会导致 Completion Timeout。Quiesce Guarantee 正是这样一种机制,告知对端我已准备好,你随时可以发起 EQ。
2022.04.09 - PCIe 是如何重新发起 EQ 的?
当 USP 请求重新 EQ 时,USP 进 Recovery 状态,在 Recovery.RcvrCfg 状态时给 DSP 发送 TS2, Request Equalization 位置一,Equalization Request Data Rate 置为需要 EQ 的速率,Quiesce Guarantee 位可以(非必须)置一,通知 DSP 其在 1 ms 内将启动 EQ,以确保不会对 DSP 其他操作产生影响。
DSP 收到 USP 的 EQ 请求后(处于 Recovery.RcvrCfg 且连续收到 8 个 Request Equalization 位置一的 TS2),可以(非必须)依照 USP 发来 TS2 中的 Quiesce Guarantee 位来判断是否会对 USP 产生影响。只有在确保 DSP 启动 EQ 不会对 DSP 和 USP 的其他操作产生影响的前提下,DSP 才能启动 EQ 进程。如果 DSP 确定 EQ 不会对 DSP 和 USP 的其他操作产生影响,其需要在 1ms 内按照 USP 请求的 EQ 速率发起 EQ 进程。否则,DSP 链路状态寄存器中相应速率的 Link Equanlization Requset 位置一,由 DSP 作为 EQ 请求方,查询 USP 状态(Quiesce Guarantee 位置一)。
USP 收到 DSP 的 EQ 请求后,可以(非必须)暂停其正在执行的操作,并按照收到 DSP 的 EQ 请求,再次向 DSP 发起 EQ 请求(TS2 的 Quiesce Guarantee 位必须置一)。USP 响应 DSP EQ 请求的时间没有限制,但应尽快执行。DSP 收到 USP 响应后,在保证 EQ 对自身操作没有影响的前提下,需要在 1ms 内发起 EQ,否则把相应速率的 Link Equanlization Requset 位置一稍后再来一次。
DSP 主动发起 EQ 请求也含在了以上介绍中。
2022.04.10 - PCIe Equalization 中提到的 Full Swing、Reduce Swing 是什么意思?
PCIe EQ 中的 Swing 是指 Tx 的输出电压摆幅,分两种模式:
Full Swing:全摆幅模式,超高速 Tx 的必选模式,能够在较低的电压范围内保持较高的噪声容限。
Reduced Swing:降低摆幅模式,是一种可选的低功耗摆幅模式,多用于对电源和噪声干扰比较敏感的系统。
两种模式的典型电路如图 2 所示。
▲图 2: Transmitter with full-swing and reduced-swing drivers.
2022.04.11 - 我在 pipe 口上看到了 TS1/TS2,为什么 PCIe Controller 没作统计?
不一定有 TS1、TS2 就要统计。对于 8 GT/s 及以上速率,LTSSM 只对 Block Aligned 块对齐之后收到的 TS 进行统计。块对齐的一大标志是 Rx 收到了 EIEOS。
对于 Recovery.RcvrLock 状态而言,若其上一状态为 L0s、L1 或 Recovery.Speed,检测到 EIEOS 后视为块对齐。若其上一状态为 L0,收到 EDS 后视为块对齐。以上说的是初次在某速率下(8GT/s 及以上)进入其 Recovery.RcvrLock 状态的情况。
若上一状态为 Recovery.EQ、Recovery.Idle,块对齐的依据是什么?还需要重新检测到 EIEOS 后再计数 TS 吗?Spec 中未明确说明。依据个人经验,无论 Recovery.EQ -> Recovery.RcvrLock 还是 Recovery.Idle -> Recovery.RcvrLock,此前 LTSSM 已经在该速率下进入过 Recovery.RcvrLock,块对齐已经完成,此时收到 TS 可以直接计数,无需等待 EIEOS。
2022.04.12 - Block Alignment 块对齐是什么?
Block 是 Gen3 及以上速率的概念。Gen3 及以上速率时,在完成 Bit Lock 后进行 Block Alignment Lock。Block Alignment 块对齐是在 Recovery 状态进行的。Tx 通过发送 EIEOS 来分隔 Block,Rx 依据收到的 EIEOS 界定 Block 边界。若 Rx 收到了 EIEOS 且接下来 130 bit 正确收到了有序集,则 Block 边界查找成功。否则继续检测 EIEOS。
Block Alignment 有 3 个 Phase:
Unaligned Phase,未对齐阶段。Rx 收到 EIOS 后进入 Unaligned Phase。在此阶段 Rx 依据 SKPOS 调整 Block Alignment,Rx 收到 EIEOS 后进入 Aligned Phase。
Aligned Phase,对齐阶段。在此阶段 Rx 依据 SKPOS 调整 Block Alignment。若 Rx 收到 EIEOS 则对 Block Alignment 进行调整。若收到 SDS,进入 Locked Phase。若 Rx 收到未定义的同步头,退至 Unaligned Phase。
Locked Phase,锁定阶段。为防止数据丢失,Rx 进入此阶段后不再调整其 Block Alignment。若 Rx 收到未定义的同步头,退至 Unaligned Phase 或 Aligned Phase。
2022.04.13 - 为什么 EIOSQ 在 2.5 GT/s, 8 GT/s, 16 GT/s, 32 GT/s 时 由 1 个 EIOS 组成,而 5 GT/s 时却需要 2 个 EIOS ?
这个 Spec 上没讲明,我也没有找到明确的解答。以下是个人猜测的原因:
2.5 GT/s 时,速率相对较低,信号质量好,EIOSQ 由 1 个 EIOS 组成。速率从 2.5 GT/s 上升为 5 GT/s 后,并没有经过 EQ,信号质量不如 2.5 GT/s 时好。为了确保 Rx 能够正确进入电气闲,EIOSQ 由 2 个 EIOS 组成,Rx 只需接收到 1 笔 EIOS 即可进入电气闲。
8 GT/s,16 GT/s,32 GT/s 时,EIOSQ 仍然只需 1 个 EIOS,是因为进入这些速率是经过了 EQ 的,信号质量有保证。
2022.04.14 - 128b/130b 编码时,PCIe 终止数据流传输的 EDS 为 Framing Token,为啥启动数据流传输的 SDS 却要是有序集的形式?
128b/130b 编码时,PCIe 的 Block 分为 OS (Ordered Set,有序集) Block 及 Data Block,OS Block 期间传输 OS,Data Block 期间传输 Data Stream。
链路通过发送 SDS 从 OS 传输切到 Data Stream。发送 SDS 的时候,链路仍处于 OS Block 传输,按道理也应该发送有序集,所以 SDS 为有序集的形式。
链路通过发送 EDS 从 Data Stream 传输切到 OS 传输,此时链路处于 Data Block 传输时段,EDS 不应为有序集的形式,又不便采用 TLP、DLLP,采用 Framing Token 是最佳选择。
2022.04.15 - 8b/10b 发送 TLP 时,有 STP 及 END来标志 TLP 的开始结束,128b/130b 时只有 STP 没有 END,如何知道 TLP 结束?
8b/10b 编码时,STP (K27.7) 及 END (K29.7) 均为 8b/10b 的控制字,两者均不携带 TLP 相关信息,有必要采用 STP 及 END 来标志 TLP 的开始和结束。其帧格式如下图 3 所示。
▲图 3: 8b/10b 编码时的 TLP 帧
128b/130b 编码时,STP 为 Framing Token(图 4),其中包含了数据链路层提供的该 TLP 的 Length、FCRC、Sequence Number 等信息。Rx 可以依据 STP Token 中的 TLP Length 来获取 TLP 的长度,无需专门的 END。其帧格式如图 5 所示。
▲图 4: STP Framing Token 格式
▲图 5: 128b/130b 编码时的 TLP 帧
2022.04.16 - 符号锁定我理解,位锁定是啥? 位有啥好锁定的?
PCIe 的位锁定是指 Rx PLL 锁定在了与 Tx 相同的频率上,不是说锁定了某个 Bit。Rx PLL 依据接收数据流的 Bit 跳变,使得 Rx 还原时钟频率同步于 Tx 时钟。如果没有位锁定,PCIe Rx 无法正确重建 Rx 时钟,也无法正确解析数据。
2022.04.17 - PCIe Ordered Set 和 Framing Token 有何区别?
有序集用于链路训练、时钟偏差补偿、进出电气闲等。有序集长度为 4B 整倍数,一般 16 Symbol(SKPOS/EIOS 4 symbol @Gen1/2)。Gen3+ 时,有序集的同步头为 01b,在 Orderer Sets Block 中发送,有序集的 Symbol 0 来指示当前有序集的类型。
Framing Token 是帧令牌,标记帧的类型、起始、长度、状态、结束等等。Framing Token 长度较短,为 1, 2, 4 Symbol。Framing Token 是 PCIe Gen3 出现的概念,Framing Token 中的 STP、SDP、EDB、IDL 在 Gen1/2 时候以特殊符号(K Code)的形式存在。Gen3+ 时,Framing Token 的同步头为 10b,在 Data Block 中发送。
2022.04.18 - Multiplexer 和 de-multiplexer 有何作用?
Multiplexer 多路复用器位于 Tx 端,负责按需选通要发送的数据,包括 DL 层下来的 Data、K 控制字、Framing Token、有序集及逻辑闲等,如图 6 所示。在链路训练阶段,选通 K/D 通道,发送 TS1/TS2/SKIP/EIOS 等有序集进行链路训练;链路训练完毕后,若 DL 层有数据下来,则有序选通 D 通道及 K 通道,在 TLP/DLLP 头尾插入 STP/SDP/END/EDB,插入 SKPOS 等;没有数据下来时,选通逻辑闲 D 通道,发送逻辑闲。
De-multiplexer 是 Multiplexer 的逆过程,位于 Rx 端,对组装好的数据进行解析及拆分。
▲图 6: Tx Multiplexer 示意图
2022.04.19 - PCIe 是如何实现 Block Type 检测的?
Block Type 检测是检测当前数据流为 Ordered Set Block 还是 Data block,是 PCIe Gen3 及以上的概念,因为 Gen3 时才出现 Ordered Set Block 与 Data Block 之分。
Block Type 检测原理很简单,就是根据同步头中的两个 bit 进行判断,但在判断之前,必须先完成 Block Alignment。如果检测到 Block 为 Ordered Set Block,则当前 Block 为 PL 层自用,不会上传到 DL 层;如果检测到 Data Block,则会上传至 DL 层。
考虑到链路中所有 Lane 上都携带有相同的 Block 信息,可以只在 1 条 Lane 上检测 Block Type。
2022.04.20 - PCIe elastic buffer 弹性缓存是做什么的?
Elastic buffter 是 Rx 端的一种异步 FIFO,通过在 Elastic Buffer 中插入或删除 SKP,来解决 PCIe 接收数据 Tx/Rx 跨时钟域问题。
Elastic Buffer 输入时钟为 Recovered Clock,输出时钟为 Rx Local Clock。当 Rx Local Clock 比 Recovered Clock 快时,Elastic Buffer 会出现 Underflow,在 Empty 之前往 Elastic Buffer 中插入 SKP;当 Rx Local Clock 比 Recovered Clock 慢时,Elastic Buffer 会出现 Overflow,在 Full 之前从 Elastic Buffer 中删除 SKP。
2022.04.21 - Byte striping/un-striping 是做什么的?
Byte Striping 位于 Tx 端,是对于有多条 Lane 的 Link 而言的。Byte Striping 内,Tx 把 Multiplexer 出来的待发送的串行 Byte 数据按照 Byte 依次分配到该 Link 多条 Lane 上并行发送出去。图 7 是 x8 link Byte Striping@8b/10b 的一个例子。128b/130b 时,各条 Lane 先发送 Sync Header 再发送 Block Symbol。
Byte Un-striping 是 Byte Striping 的逆过程,位于 Rx 端,对各条 Lane 上的数据进行解析重组为串行 Byte,送给 De-multiplexer。
▲图 7: x8 Byte Striping@8b/10b 示意图
2022.04.22 - Packet filtering 是做什么的?
Rx 收到的数据中,有 OS、TLP、DLLP、IDL 及控制字/Framing Token 等。这些数据中,OS、IDL 等是 PL 层自用的,TLP、DLLP 需要上传到 DL 层。Packet Filtering 就是干这个的,来过滤 Packet,决定是否将 Packet 送给 DL。
2022.04.23 - 为什么 8 GT/s 及以上速率时需要均衡?
LTSSM 中的 Recovery.Equalization 的确是到 Gen3 (8 GT/s) 时才有的,但均衡不是到 Gen3 才有的。2.5 GT/s 及 5 GT/s 时,信号速率相对较低,在 Tx 端采用信号去加重即可实现较好质量的信号传输,这里的信号去加重即是均衡技术的一种。由于信号去加重时参数固定,收发端无需协商,不需要 Recovery.Equaliation 这一过程进行协商。
数据速率上升到 8 GT/s 及以上后,信号传输面临的信号完整性问题更加突出,仅采用传统的去加重无法满足高质量的信号传输,需要收发端动态协商 Tx/Rx 参数来优化信号质量。
2022.04.24 - PCIe 训练完毕后,如何重新进行链路训练?
只需要将 Link Control Register 的 Retrain Link 置一就好了。如果需要在重新训练时改变链路宽度、链路目标速度,需要在将 Link Control Register 的 Retrain Link 置一前完成相关参数的修改。
2022.04.25 - DSP Equalization 没有 Phase0,那 DSP 是怎么给 USP 发送 preset 的?
DSP 在切速前的 Recovery.RcvrCfg 状态给 USP 发送 Preset。至于为什么要放在这个状态,spec 中未明确说明。从 Equalization 前后状态来看(Recovery.RcvrLock -> Recovery.RcvrCfg -> Recovery.Speed -> Recovery.Equalization -> Recovery.RcvrLock),肯定是要放在 Equalization 之前的,放在之后没有意义。
Equalization 前只有 RcvrLock、RcvrCfg、RcvrSpeed 三个状态,其中 RcvrLock 要做位锁定符号锁定,RcvrSpeed 要切速,只有个 RcvrCfg 还比较闲。如果 DSP 也来一个 Phase0,由于在 phase0 时速度已经切完了,此时链路质量很差的话,USP 就解析不出 DSP 发给他的 preset 了。
注意:如果 USP 当前已经为 128b/130b 编码切要切到更高一档的速度,USP 也是要在 Recovery.RcvrCfg 状态给 DSP 发送 preset 的。
2022.04.26 - FIR 均衡器有哪几种输出电平?
采用三抽头 FIR 均衡器时,对于某比特信号而言,其前后两比特有 4 种不同的组合形式,这也意味着该比特输出电平有 4 种可能。如图 8 所示。电平幅值取决于三个抽头系数 C+1、C0 及 C-1。
▲ 图 8: 三抽头均衡器的四种输出电平
举个例子:当前比特为 1 ,C+1=-0.2,C0=0.7,C-1=-0.1,
连续 3 比特为 011,输出电压为 -C+1+C0+C-1=0.8,对应图中 Va,称为 Normal 电平 。
连续 3 比特为 111,输出电压为 C+1+C0+C-1=0.4,对应图中 Vb,称为 De-emphasized 电平 。
连续 3 比特为 110,输出电压为 C+1+C0-C-1=0.6,对应图中 Vc,称为 Pre-shoot 电平 。
连续 3 比特为 010,输出电压为 -C+1+C0-C-1=1.0,对应图中 Vd,称为 Maximum-height 电平 。
根据以上四种电平,可计算出去加重、Pre-shoot及 Boost 幅度,表示为:
De−emphasis=20log10Vb/Va
Preshoot=20log10Vc/Vb
Boost=20log10Vd/Vb
2022.04.27 - PCIe DLLP Blocking 是什么?
对于采用自动均衡机制的 PCIe 设备,USP 在收到 DSP 发来的 DLLP 之前不能发送任何 DLLP,DSP 在 EQ 完成之前也不能发送任何 DLLP,称为 DLLP Blocking。链路训练进入 L0 状态后,如果 PCIe 设备知道 EQ 未完成、其接下来要进行 EQ,无论当前速率是多少(即便已经达到目标速率),双方都不能发送任何 DLLP。
若由于 DLLP Blocking 导致设备从 L0 延迟进入 Recovery,USP 或 DSP 端有可能会发生推测电气闲超时或 DLLP 超时,这两种超时均是不可报告的错误。当发生上述两种超时时,链路会进入 Recovery 重新对链路进行训练,不会影响正确的链接操作。
2022.04.28 - PCIe Zero Write、Zero Read 是什么?
Zero write 和 zero read 是指 PCIe 发送的数据载荷长度为 0 的内存读写请求,常用于 Flush 操作,以确保早前 Posted 发送的数据传输完成。
Zero write、read 请求 TLP 中,length 设置为 1(不是 0,0 表示 1024 DW),但 byte enble 均设置为 0。Zero write TLP 中不携带数据载荷,Zero read 的 CplD 携带有 1 DW 数据载荷(协议未指定,可为任意值)。
2022.04.29 - PCIe Phantom Function 是什么?
Phantom Function,“幻影” Function,看似存在实则不存在的 Function,用于增加单 Function 设备暂存的 NP 事务数量,从而增大 Outstanding 能力。
一般情况下,PCIe 设备中每个 Function 都有一块空间暂存该 Function 发出去的 NP 请求,共 8 块,每块暂存的 NP 请求数量上限取决于 Tag 字段宽度(8-bit TAG -> 256)。若设备只有一个 Function,那多多少少有点浪费。Phantom Function 正是看中了这一点,当设备只有一个 Function 且支持 Phantom Function 时,通过使能设备控制寄存器中 Phantom Function Enable 位,将 BDF 中的 Function Number 字段当 Tag 用,这样每一个 Function 的 NP 暂存空间都能被利用到,从而将设备的 Outstanding 能力变为之前的 8 倍。
注意:Phantom Function 不是 Virtual Function,两者不是一个概念。
2022.04.30 - PCIe Phantom Function 有何局限?
由于开启了 Phantom Function 的 PCIe 设备其 Function Number 被挪作他用,开启了 Phantom Function 的设备有以下局限:
不支持 ARI(Alternative Routing-ID );
不支持多 VF;
开启 VF 后不支持 PF;
不支持 ATS(Address Translation Service);
不支持 IDO(ID-Based Ordering)。
由于 Phantom Function 有以上诸多局限,非必要时一般不采用 Phantom Function。PCIe 4.0 引入了 10-bit Tag 能力,Outstanding 数目变为了 1024,绝大部分情况够用了。