【高清视频】Gen6 SSD真实抓包:0.5米Cable跑64GT/s,FLIT里面到底抓到了什么?
2026-08-27 15:34:38

前面我们已经搭过一次 Gen6 SSD 测试环境。没有看过的可以点击下面的链接:【高清演示】国内首次拿到Gen6 E1.S SSD演示SerialTek PCIe 6.0协议分析仪抓包

这次桌面上的东西看起来差不多,不过有两个变化值得单独拿出来说。

一个是 Switch 换成了现在这块 B0 版本的 PCIe Gen6 Switch

另一个是从 Switch 到 EDSFF 测试端,这次实际用的是一根 0.5 米 MCIO→EDSFF Gen6 Cable;上面的链接里面的视频使用0.3米Cable

然后还是老办法:

把 Gen6 SSD 接进去,把 Interposer 串在中间,再用 SerialTek PCIe Gen6 Analyzer 把整个上电、建链以及后面的 FLIT、TLP 和 NVMe Traffic 抓下来。

视频一共 13 分钟左右。

这次我们不准备把 Analyzer 软件从头讲一遍,主要就看两件事情:

这条 0.5 米的实际 Gen6 测试链路能不能起来;

以及:

PCIe 6.0 进入 FLIT Mode 以后,Analyzer 里面到底能看到什么。

为了方便工程师观看,我们针对本期视频并处理添加了中文字幕供大家参考。如果想看高清视频建议要在电脑上打开上面的视频链接进行观看!创作不易,欢迎分享到朋友圈或者与朋友讨论!如果想搬运我们的视频请告知我们。

下面的文字总结严格按照演示时间顺序,适合没有时间看高清视频的朋友快速阅读,内容和上述的视频演示一致。

00:00——先把这次桌上的环境重新过一遍

最左边还是被测 SSD。

视频里面这块盘是临时借用的一块某国际知名品牌 Gen6 SSD 样品,当时拿过来主要用于拍摄一些技术视频。

回到桌面。

SSD 这一边作为 EP,也就是 Endpoint。

Host 这一边则由两部分组成:

一台 Gen5 主板;

加上一块 Serial Cables 的 Gen6 B0 Switch Card。

这块 B0 版 Host Card 现在使用的是 Broadcom Atlas 3 Production B0 silicon,板上有 4 个 Gen6 x8 MCIO 接口以及一个 Gen6 x16 Straddle Mount 接口,下游一共可以提供 64 lanes 的 Gen6 连接能力。官方资料也直接给出了这种用法:用现有 Gen5 System,就可以在 Switch 下游开始 Gen6 Device 测试。

这正好就是我们桌面上现在干的事情。

00:53——这块 Gen6 SSD 其实有两种接法,这次选了 MCIO

从 Switch 往 SSD 走,至少有两种比较直接的办法。

一种:

从 MCIO 口出来,再转 EDSFF。

另外一种:

利用顶部 PCIe 插槽,再通过 AIC Adapter 转换成 EDSFF 环境。

这次没有走顶部插槽。

我们直接用了右侧 MCIO。

也就是:

Gen6 Switch MCIO→ 0.5m MCIO 转 EDSFF Cable→ EDSFF Interposer→ Gen6 SSD

视频里自己说到“EDSFF 延长线”以后马上又改口了,这个改口其实是对的。

准确说,它不是一根简单 EDSFF Extension Cable。

它两端的接口不同:

一端是 MCIO;

另外一端是 EDSFF。

所以它应该叫:

MCIO→EDSFF Cable Assembly。

01:08——0.3 米和 0.5 米版本,区别主要就是长度

镜头随后专门拿了一根 Cable 出来。

我们手里有 0.3 米,也有 0.5 米版本。

这次环境用的是 0.5 米。

从功能连接上看,两端接口形式相同,最直接的区别就是长度。

Serial Cables 现在也有正式的 500mm Gen6 MCIO x4→EDSFF Cable,产品定义就是用于 x4 Drive Testing,并且另外提供独立的 SI Report。

为什么到了 Gen6 我们会反复强调:

0.3 米;

0.5 米?

以前做低速接口,线长 20 厘米经常只是结构问题。

但是到了 PCIe 6.0:

Cable Length 本身就是 Signal Integrity 条件的一部分。

因为现在面对的是 64 GT/s PAM4。

Cable 变长以后,Insertion Loss 增加;

Connector、Via、转接也全部算进 Channel。

所以在 Gen6 测试报告里面,我觉得最好逐渐养成一个习惯:

不要只写:

“用 MCIO Cable 连接。”

最好把:

长度;

料号;

Adapter;

中间经过几个 Connector

都记录下来。

哪天 Link Margin 出了问题,这些信息都可能有用。

01:42——为什么 Cable 旁边还拖着一根电源线?

视频这里顺手提了一句:

MCIO 这边不能直接满足 SSD 的设备供电,所以 EDSFF 端还要单独把 Power 引进来。

这个设计在实验室里很常见。

你真正需要通过 MCIO 传过去的主要是 PCIe 高速链路以及相关 Sideband 连接,而 EDSFF SSD 本身的供电还要按照设备要求单独解决。

所以我们这根 Cable 在 EDSFF 端旁边还能看到单独的 Power Connector。

这件事看似是个小细节,但第一次自己搭 EDSFF 测试环境的人经常会碰到:

信号接对了,盘为什么根本不上电?

因为“PCIe 链路接通”和“DUT 供电解决”本来就是两个问题。

02:00——从 SSD 到 Host,把整条路径重新顺一遍

如果从左向右看,这一套环境就是:

Gen6 SSD

EDSFF Interposer

MCIO→EDSFF 0.5m Cable

Gen6 B0 Switch

Gen5 Host

这个顺序看明白以后,后面 Analyzer 为什么能抓到东西就比较容易理解了。

其中 Interposer 并不是另外一个 PCIe Endpoint。

它是串在原链路里面,让 Host/Switch 和 SSD 仍然正常通信,同时把需要分析的信号复制一份送给 Analyzer。

SerialTek 对 Gen6 SI-Fi Interposer 的官方描述也是这个思路:Interposer 位于 Host 与 Endpoint 之间,把高速信号和 Discrete/Sideband 信号实时复制给 Kodiak Analysis System,同时尽量保持原链路的 Signal Integrity。

02:40——Interposer 到底把哪些东西送给 Analyzer?

这里视频比上一版讲得更清楚。

主要是三路。

两路高速;

一路低速。

两根 QSFP-DD Cable 分别负责:

Upstream 高速 Traffic;

Downstream 高速 Traffic。

还有另外一根 MCIO Cable,用于把 Sideband 相关信号送回 Analyzer。

所以如果把 Interposer 想象成一个岔路口:

正常 PCIe 链路继续往 SSD 走;

另外复制出来的高速数据分成两个方向送给 Analyzer;

PERST#、Power 相关状态以及其他 Sideband 信息则通过另外一路进 Analyzer。

Analyzer 内部再由 FPGA、处理器以及大容量 Trace Storage 负责:

Capture;

保存;

解码;

分析。

这也解释了为什么 Protocol Analyzer 不是拿一根线插到 SSD 上就能工作。

真正困难的往往不是:

“软件会不会解 TLP”。

而是:

64 GT/s 的真实链路到底怎么可靠地 Tap 出来。

03:46——这里要纠正视频里的一个说法:Switch 不是把“Gen5 信号处理一下变成 Gen6”

视频里为了方便理解,说:

Gen5 Host 的信号进 Switch,Switch“处理转发以后把它变成 Gen6 再出来”。

工程师现场聊天这么讲很容易懂,但严格说不是这样。

PCIe Switch 的 Upstream Port 和 Downstream Port,本身是不同的 PCIe Link。

因此完全可以出现:

Host ↔ Switch Upstream:Gen5

而:

Switch Downstream ↔ SSD:Gen6

每一条 Link 分别完成自己的 Link Training 和 Speed Negotiation。

所以不是把一串已经存在的 Gen5 电信号“加工成 Gen6 信号”。

而是:

Switch 终结上游 PCIe Link,再通过自己的下游 Port 与 Endpoint 重新建立另一条 PCIe Link。

Serial Cables 对这块 B0 板卡的官方描述也非常直接:可以利用现有 Gen5 System,在 Switch Downstream 取得完整 Gen6 Connectivity。

这个区别在做 Debug 时非常重要。

因为出了问题以后,你必须先问:

问题在:

Host ↔ Switch?

还是:

Switch ↔ SSD?

不能把整条拓扑看成一根连续的 SerDes 链路。

04:20——环境搭好以后,先不急着看 Trace,先配 Sideband

进入 Analyzer 界面以后,视频没有马上上电。

而是先看 Capture 窗口。

Upstream、Downstream 已经在。

Sideband 窗口开始时却基本是空的。

正常情况下大家经常会关注:

PERST#;

CLKREQ#;

Power Rail;

以及其他与当前 Form Factor 相关的信号。

但这次环境里 Sideband Pin Definition 和前面某些测试环境并不完全一样,所以现场没有死磕“为什么 CLKREQ#没出来”

而是直接把当前有意义的 PERST#、3.3V 等信号加进来。

我觉得这段现场操作挺真实。

实际搭实验环境就是这样。

不是每一套 Interposer 插进去,所有信号名字自动 100% 排得整整齐齐。

有时候要先确认:

当前 Adapter 到底把哪个 Sideband 映射到了哪里;

这个设备有没有用这个 Pin;

这个 Config 下是否有效。

所以这里不建议为了文章好看,硬写成:

“系统自动识别出所有 Sideband。”

视频本身并没有做到这一点。

06:40 左右——Quarch PAM 也在同一个界面里

下面还能看到一个:

QPAM。

也就是 Quarch Power Analysis Module 相关界面。

视频里说得比较随意:

中文翻译成“电源量测模块”听起来有点别扭。

实际上直接叫:

Power Analysis Module,PAM

反而大家更容易懂。

它的作用是把 DUT 的 Voltage、Current、Power 等数据一起采下来。

SerialTek 当前 Kodiak Gen6 资料里也明确列出了 Quarch PAM Integration。

这个组合我一直觉得很适合 SSD。

因为有些掉盘问题,单纯看 PCIe 会觉得莫名其妙。

你看到:

Recovery;

Link Down;

Reset。

但如果把同一个时刻的 Power 一起摆出来,可能马上发现:

就在前几十微秒或者几毫秒,Power Rail 已经发生异常。

这种时候,协议 Trace 和 Power Trace 放在一起比单独看任何一个都更有价值。

07:00 以后——真正开始抓:先点 Capture,再上电

Sideband 配置大致完成后,现场点击开始 Capture。

然后才给系统上电。

这一步和前一个视频一样,我还是建议大家记住:

如果要分析 Boot 和 Link Training:

一定尽量先开 Analyzer,再给 DUT 上电。

否则等操作系统都认到 NVMe 盘了,再去点 Capture:

Detect;

Polling;

Configuration;

第一次 Speed Change

早就结束了。

这次一上电,可以看到 Sideband 马上发生变化。

随后 Upstream 和 Downstream 都开始出现 Traffic。

右侧 Link Buffer 也开始不断被填进去。

这就说明 Analyzer 已经真正进入工作状态。

08 分钟左右——这一次界面里多了一个特别值得聊的东西:Correctable FLIT

视频开始看右侧实时统计。

除了:

DLLP;

Error;

Payload FLIT;

TLP;

Training

之外,这次特别指了一下:

Correctable FLIT

和:

Uncorrectable FLIT。

这里要稍微把 PCIe 6.0 背后的逻辑说准确一点。

PCIe 6.0 从 32 GT/s 提高到 64 GT/s,同时从 NRZ 改成 PAM4 以后,物理链路原始错误率环境和以前不同。

所以 PCIe 6.0 引入了:

Lightweight FEC + Strong CRC + Link Level Replay。

一整个 PCIe 6.0 FLIT 固定为:

256 Bytes。

不是视频口述中后面提到的“256 bit”。

这一点一定要纠正。

PCI-SIG 给出的标准 FLIT 结构为:

236 Bytes 用于 TLP;

6 Bytes 用于 Data Link Layer Payload;

8 Bytes CRC;

6 Bytes FEC。

总计:

256 Bytes。

接收端首先通过 FEC 尝试修正错误,然后再由 CRC 检查修正后的 FLIT。

如果 CRC 仍然 Fail,就需要进入 Link Layer Retry/Replay 机制。

所以这里更准确的理解不是:

“绿色的就是好包,紫色就是彻底坏掉的包。”

而应该理解成:

Analyzer 正在帮助工程师看到链路里发生过的 FEC Correction 以及无法仅通过该次 FEC 修正、需要进一步错误处理/重传关注的情况。

对于 Gen6 SI Debug 来说,这类信息很有价值。

因为过去一条链路:

能跑;

没掉盘,

工程师可能就觉得没问题。

到了 Gen6:

它虽然能跑,但 FEC 到底在多努力地救这条链路?

这本身就值得看。

08:50——这次抓的是完整上电过程,Trace 总体比较干净

抓了一段以后停止 Capture。

现场第一感觉是:

这条 Link 还不错。

没有看到大量异常 FLIT 或者一堆 Error 把窗口铺满。

随后切换到录屏画面,开始真正看刚才这段 Trace。

最前面自然是 Sideband 变化。

然后是 PCIe 训练阶段:

TS1;

TS2;

Ordered Set。

再往后才开始出现大量 FLIT Traffic。

这基本符合一个正常上电、训练、进入正常 Traffic 的过程。

09:40 以后——这里又有一句值得修正:“Gen6 一开始就拿 FLIT 沟通”

视频里看到 FLIT 以后,现场说:

因为这是 Gen6 Switch 和 Gen6 SSD,所以它们“一开始就会尝试用 Gen6 FLIT 模式沟通”。

这个意思大体能理解,但如果严格写文章,我会换一个说法。

PCIe 6.0 规定:

64 GT/s PAM4 必须使用 FLIT Mode。

同时 FLIT Mode 也支持在较低 Link Speed 使用;一旦 Link 已经训练进入 FLIT Mode,只要 Link 保持 LinkUp,就继续保持 FLIT Mode。

但 Link Training 本身仍然会看到:

TS1;

TS2;

Electrical Idle 相关训练过程。

所以不能简单理解成:

“机器刚加电第一包就是 256B FLIT”。

更准确地说:

这条支持 PCIe 6.0 的链路在完成相应能力协商并进入 FLIT Mode 之后,后续 Data Link/Transaction Traffic 按照 FLIT 机制传输;当链路运行到 64 GT/s 时,FLIT Mode 是必须的。

这样就比较严谨了。

10 分钟左右——为什么明明是 Gen6 FLIT Mode,Transaction 窗口里还是能看到熟悉的 TLP?

这一段我认为是整个视频最值得写进文章的地方。

因为第一次看 PCIe 6.0 Analyzer 的人真的很容易产生这个疑问:

不是说 Gen6 改成 FLIT 了吗?

为什么 Transaction 窗口里面还是:

Configuration Read;

Memory Read;

Memory Write;

Completion……

看起来和 Gen4/Gen5 Analyzer 很像?

难道抓错了?

其实不是。

PCIe 6.0 真正在线上传输的是固定长度 FLIT。

但:

FLIT 里面仍然承载 TLP。

而且一个 FLIT 里可以有多个 TLP;

反过来,一个较大的 TLP 也可以跨越多个 FLIT。

PCI-SIG 官方对此写得非常明确。

所以 Analyzer 完全可以提供两种视图。

一种:

按照 Wire 上真实 FLIT 结构显示。

让你研究:

FLIT;

FEC;

CRC;

DLP;

ACK/NAK;

Replay。

另一种:

把 FLIT 里面承载的 TLP 重新重组出来。

让工程师继续按照过去熟悉的:

Request;

Completion;

Configuration;

Memory Transaction

思路去 Debug。

这次软件显然两种都保留了。

我觉得这种处理方式其实很合理。

为什么不应该强迫所有工程师每天盯着 256-Byte FLIT 看?

假设软件只给你显示原始 FLIT。

协议上当然最“纯正”。

但是 Firmware 或者 NVMe 工程师真正想找的是:

这一个 Configuration Read 去哪了?

这个 Memory Write 什么时候完成?

某个 NVMe Command 对应哪些 Transaction?

如果 TLP 刚好跨了两个 FLIT,你还得自己盯着 FLIT 重新拼。

没有必要。

所以视频现场演示了一个同步查看方式。

点中 Transaction 里面的一个 TLP 以后,可以找到对应的 FLIT 位置;

两边时间戳能够对应起来。

也就是说:

FLIT View 是真正在链路上传输的结构;

TLP View 是 Analyzer 为了 Debug 重新还原出来的逻辑视图。

它们不是两套不同的数据。

而是:

同一份 Trace 的两个观察角度。

这个概念如果搞懂,第一次从 PCIe Gen5 Analyzer 切到 Gen6 Analyzer 时,就不会觉得那么陌生。

11 分钟以后——Event、Transaction、NVMe,实际 Debug 时就是一层一层往上看

后面操作没有再深入。

大致扫了一遍几个窗口。

Event

最底层、时间顺序最完整。

可以混在一起看到:

Sideband;

Training;

FLIT;

DLLP/DLP 相关事件;

TLP;

各种状态变化。

它适合回答:

某个时间点前后,整条链路到底发生过什么?

Transaction

这里重点把 TLP Transaction 重新整理出来。

当问题已经进入:

Configuration;

Memory Transaction;

Request/Completion

层面以后,这个窗口明显比盯着原始 FLIT 舒服。

NVMe Transaction

再往上一层。

从 PCIe Transaction 继续关联出 NVMe Command、Completion 以及相关的数据访问。

所以真正查 SSD 的时候经常是反过来的:

先在 NVMe 层看到:

某个 Command 没有正常结束;

然后往 Transaction 下面追;

如果还不够,再回到 Event 看:

前面是不是刚好发生了 Recovery、Reset 或者 Link 变化。

这几个窗口不是为了让软件看起来功能很多。

而是因为:

一个 SSD Bug 经常跨好几个 Protocol Layer。

12 分钟左右——Filter 看起来不起眼,但大 Trace 里面它基本是必需品

NVMe 窗口里面仍然可以把 TLP 一起显示。

如果觉得太多,就 Filter。

保留:

PCIe;

或者 NVMe;

或者只看指定 Packet Type。

现场这里没有继续展开。

实际上任何用过几十 GB Trace 的人都会知道:

没有 Filter 基本没法干活。

Gen6 的 Traffic 量更大。

真正遇到问题的时候,你通常不会从第 1 条 Packet 看到最后一条。

而是先把范围缩小:

只看某个方向;

某个 BDF;

某一种 TLP;

某种 Error;

某个 NVMe Command;

或者某一个时间窗口。

否则再快的 Analyzer,最后也变成人肉翻日志。

12:40——视频最后没有“总结升华”,就是确认这套环境能正常工作

最后软件扫了一眼 NVMe 信息和统计窗口。

没有再继续演示复杂 Trigger,也没有故意做 Error Injection。

然后视频结束。

其实我觉得这样刚好。

因为这次想验证的本来就不是:

“我们能不能把 PCIe 6.0 协议每一章讲完。”

而是:

0.5 米 MCIO→EDSFF Cable 接上以后,这条 Gen6 链路能不能起来;

B0 Gen6 Switch 下游能不能和 Gen6 SSD 正常工作;

Interposer 插进去以后,Analyzer 能不能把完整上电和 Link Training 留下来;

以及:

进入 PCIe 6.0 以后,FLIT、TLP 和 NVMe 三个层次能不能真正对应起来。

这一轮都看到了。

这就够了。

我觉得这次 Demo 里最值得留下来的,其实是三个小细节

第一个是:

0.5 米 Cable 不是“随便一根线”。

到了 64 GT/s,它本身已经属于测试条件。

以后不同 Cable Length、Adapter、Connector 导致 Link 表现不同,不应该觉得奇怪。

第二个是:

Gen5 Host + Gen6 Switch 并不等于 Host 变成了 Gen6。

真正发生的是 Switch 上游跑 Gen5,下游单独和 SSD 跑 Gen6。

这套环境适合提前做 Gen6 Endpoint 链路、协议和兼容性验证,但不要拿它冒充 Native Gen6 Host 做端到端极限性能结论。Serial Cables 自己对 B0 Host Card 的定位也正是利用现有 Gen5 系统取得 Gen6 Downstream Connectivity。

第三个可能也是最容易被第一次接触 PCIe 6.0 的人误解的:

FLIT 并没有把 TLP“消灭”。

PCIe 6.0 把链路传输组织成固定 256-Byte FLIT,是为了配合 PAM4 环境下的 FEC、CRC 和 Replay 机制;但真正的 Transaction 语义仍然要靠 TLP 承载。一个 FLIT 可以放多个 TLP,一个 TLP 也可以跨多个 FLIT。

所以 Analyzer 里:

左边给你看 FLIT;

右边又帮你重组成熟悉的 TLP;

再往上继续解成 NVMe,

完全不矛盾。

反而这才是工程师真正容易使用的方式。

写在最后

Gen6 真正开始进实验室以后,会发现测试思路和 Gen5 并没有彻底推倒重来。

我们还是在看:

Link Training;

LTSSM;

TLP;

NVMe;

PERST#;

Power。

但是 64 GT/s PAM4、FLIT、FEC 这些东西加进来以后,很多以前不那么敏感的问题开始被放大。

线长一点;

多一个 Connector;

换一张 Adapter;

插一个 Interposer;

都有可能改变链路 Margin。

而协议层又多了一层 FLIT。

所以 Gen6 Debug 以后很可能会越来越常见这样一种工作方式:

先看:

能不能 Link 到 Gen6。

再看:

Link 虽然起来了,FEC 是不是一直在帮你擦屁股。

然后再往上看:

TLP 有没有异常。

最后才到:

NVMe Command 到底出了什么问题。

这次 0.5 米 Cable 的演示还没有碰到真正难查的 Bug。

反而是一条比较干净的 Trace。

但我觉得先把这种正常 Trace 留一份下来很有价值。

以后真碰到:

0.3 米能跑,0.5 米不稳定;

冷启动 Gen6,热启动掉 Gen5;

换一块 SSD 就出现大量 Correctable FLIT;

某一次 Recovery 以后 NVMe 开始 Timeout……

那时候拿异常 Trace 和今天这条“正常基线”放在一起比较,很多东西会清楚得多。

先把正常链路看懂。

哪天它不正常了,

我们才知道究竟是从哪一步开始变的。

免费下载Saniffer公司白皮书

希望获得更多关于PCIe5.0&6.0, CXL, NVMe SSD, SAS/SATA, NVMe over Fabric (NVMoF), NAND,新型存储技术NVM(RRAM/ReRAM, FRAM/FeRAM, MRAM, PCM, 3D-NOR, SRAM/DRAM等) DDR5/LPDDR5以及UFS测试技术和产品,可以查看Saniffer公司2026.2.24最新更新的测试工具白皮书15.1版本,我们已经整理收录在Saniffer公众号的【白皮书】菜单中。

欢迎关注Saniffer公众号,点击底部菜单栏即可免费获取。如有任何技术问题,也可直接在公众号内留言交流。