简短结论:Flit Mode 和 Non-Flit(传统 TLP)模式不是“同一份报文直接改个外壳”,而是通过 Switch/Root Complex 在边界做TLP header translation。
事务语义层(Memory/Config/Completion/Message/Atomic 等)通常可翻译;但链路层/成帧层对象、部分新字段、特定编码的 TLP、以及纯 Flit 控制结构不能一一互转。
1. 能“转换”的是什么
这里的“转换”准确说是:同一个事务(Transaction)在出口侧重新编码成目标模式允许的 TLP。
可以翻译的常见 TLP 语义:
- Memory Read / Write(32-bit / 64-bit address)
- Configuration Read / Write(Type 0 / Type 1)
- I/O Read / Write
- Completion / Completion with Data / Locked Completion
- Message(大多数传统 Message 类型)
- AtomicOp(FetchAdd / Swap / CAS 等)
- TLP Prefix → Flit 模式下的 OHC(Orthogonal Header Content)
- 14-bit Tag、Segment Number 等 Flit 新能力在支持时映射/丢弃/补全
PCI-SIG 官方也明确说:Flit Mode 和 Non-Flit Mode Links 可以互通,边界处会自动翻译。
2. 不能“直接互转”或会出问题的东西
(1)Flit / NOP Flit / Idle Flit 本身
Flit 是 256B 传输容器,不是 TLP:
- Payload Flit
- NOP Flit
- Idle Flit
- ACK / NAK / Replay Flit
- Flit Marker
这些没有对应的传统 TLP,不能翻译成 Non-Flit TLP。
它们承载的是:
- Flit 序列号
- Link-level retry
- 流控更新
- 电源/链路管理控制信息
其中一部分在 Non-Flit 模式里用DLLP 表达,但不是 1:1 映射。
(2)传统 DLLP 和 Flit DLP 不是同层对象
Non-Flit:
- DLLP:流控、ACK/NAK、PM、Vendor 等
- TLP:业务事务
Flit Mode:
- DLP(6B)放在 Flit 里
- 传统 DLLP 要么进 DLP 区域,要么用 Optimized Update FC / Flit Marker 等机制替代
所以:
DLLP ↔ DLP 是“功能近似”,不是报文格式互转。
例如:
PM_Enter_L1DLLP → Flit 里通过 DLP 字段表达InitFC/UpdateFC→ Flit 里用 Optimized Update FC- ACK/NAK → Flit 级 sequence + replay 机制
(3)Flit TLP Header 和传统 Fmt+Type TLP Header 编码不同
Non-Flit DW0:
Fmt[2:0] + Type[4:0] + TC + Attr + LengthFlit Mode DW0:
Type[7:0] + TC + OHC + TH + Attr + AT + Length同一个字节值含义不同,例如:
- Non-Flit
0x00= MRd 3DW no data - Flit Mode
0x00= NOP TLP
所以:
不能把 Flit TLP 的 raw DW0 直接当传统 TLP 解,也不能反向直接塞进去。
(4)OHC 不一定都能退回传统 Prefix
Flit 模式用:
- OHC-A:Byte Enable、ST(Stream ID)、Segment、Error/Report 等
- OHC-B:TPH 相关
- OHC-C:ID 相关
- OHC-E:IDE / 安全相关
回到 Non-Flit 时:
- 标准 Local/End-End Prefix 能映射的部分 → 转成 Prefix
- 传统模式没有对应 Prefix 的 OHC → 不能表达
- 如果出口链路不支持该能力 → 翻译失败 / blocked
典型例子:
- Flit 模式 Memory Request 使用非隐式 Byte Enable 且依赖 OHC-A1
→ Non-Flit 模式没有等价表达 →TLP Translation Egress Blocked
(5)Segment Number / 14-bit Tag 等“新能力”
- Flit Mode TLP 可带 Segment Number
- Non-Flit 老硬件根本不认识
翻译规则:
- 若对端层次/软件已配置支持 Flit Mode → 可以保留语义
- 若对端是纯 Non-Flit → RC 可能必须“take ownership”,不能把 segment 信息原样发出去
14-bit Tag 同理:
- Non-Flit 5.0 最多 10-bit Tag
- Flit 14-bit Tag 发到 Non-Flit 端口必须降级/阻塞
(6)IDE / 安全 Trailer / Flit CRC / FEC
- Flit CRC(8B)
- FEC(6B)
- IDE Trailer / PCRC
- Flit-level ECRC 替代机制
这些都不是 TLP 层对象,不能转成传统 TLP 的 LCRC/ECRC 报文。
(7)NOP TLP / Padding / Flit 内部填充
Flit TLP 区域里会有:
- NOP TLP
- Padding
- 跨 Flit 的 TLP 分片
传统模式没有“NOP TLP”这个概念(传统靠 STP/END 成帧,没业务就不发)。
所以:
- Flit 内 NOP TLP → Non-Flit 侧直接消失
- 跨 Flit TLP 分片 → 在 Non-Flit 侧重组为完整 TLP 再发
- 这不是“格式转换”,是“重新组装”
3. 一句话总结
对象 | Flit ↔ Non-Flit 能否转换 |
|---|---|
Memory / Config / IO / Completion / Message | ✅ 语义可翻译 |
AtomicOp | ✅ 基本可翻译 |
TLP Prefix ↔ OHC | ⚠️ 能映射的才可行 |
NOP / Idle / Payload / ACK / NAK Flit | ❌ 不是 TLP,不能转 TLP |
传统 DLLP ↔ Flit DLP | ⚠️ 功能等价,不是格式互转 |
Segment / 14-bit Tag / 非隐式 BE | ⚠️ 老模式不支持时阻塞 |
Flit CRC / FEC / IDE Trailer | ❌ 链路/安全层对象,无 TLP 对应物 |
核心原则:
TLP 的“事务语义”可以跨模式翻译;Flit/DLLP/OHC/Segment/14-bit Tag 这类“模式相关封装或新能力”不能无条件互转。