PRBS生成多项式:常用多项式与选择依据
说起PRBS测试,很多人第一反应就是找个信号源怼上去。但实际干活的时候你会发现,选哪个多项式,直接决定了你能测出什么问题、测不出什么问题。
我刚开始做高速串行链路测试那会儿,就吃过这个亏。随便抓了个PRBS7就开始跑,结果眼图看着挺漂亮,一到系统联调就翻车。后来才明白——多项式选错了,等于白测。
PRBS是怎么“生”出来的?
说白了,PRBS不是随机数,而是靠一个线性反馈移位寄存器(LFSR)按照特定多项式算出来的伪随机序列。你给它一个种子(Seed),它就能无限循环地输出一串看起来随机的比特。
这个多项式决定了反馈的抽头位置。比如 PRBS7 = x⁷ + x⁶ + 1,意思就是用第7位和第6位做异或,反馈回去。你想想看,不同的抽头组合,出来的序列特性完全不一样。
实际快速生成技巧: 我习惯用Python写个LFSR模拟器,先短跑几个周期验证多项式配置是否正确。别直接上仪器,万一抽头焊错了,排查起来很麻烦。
# 简易LFSR伪代码示意
def lfsr(seed, taps, length):
state = seed
for i in range(length):
bit = 0
for t in taps:
bit ^= (state >> t) & 1
output = state & 1
state = (state >> 1) | (bit << (max(taps)))
yield output
常用多项式一览
业界最常用的就那么几个,我把它们列在下面这张表里。你可以把它当成快速选型菜单。
| 名称 | 多项式 | 序列长度(比特) | 典型应用场景 |
|---|---|---|---|
| PRBS7 | x⁷ + x⁶ + 1 | 127 | 短距离、低速链路(如I²C、SPI) |
| PRBS15 | x¹⁵ + x¹⁴ + 1 | 32,767 | SATA、USB 2.0、一般背板 |
| PRBS23 | x²³ + x¹⁸ + 1 | 8,388,607 | PCIe Gen3、10G光模块 |
| PRBS31 | x³¹ + x²⁸ + 1 | 2,147,483,647 | 长距离、高速串行(如100G以太网、SerDes) |
曾经踩过的坑: 有次我帮客户调试一款25G光模块,对方坚持用PRBS7做误码测试。结果误码率一直压不下去。我换了个PRBS31上去,情况立马变了——才发现是CDR锁相环的带宽适配问题。低阶序列连PLL的慢漂移都刺激不到,白忙活了两天。
选择依据:到底该用哪一个?
你可能会问:“这么多多项式,我该用哪个?”
我个人习惯按下面这几条来选,不容易翻车。
1. 看链路速率和距离
- 低速、短距(<1Gbps、板内走线):PRBS7 就够了。它序列短,跑得快,测个眼图开合度绰绰有余。
- 中速、中等距离(1~10Gbps、背板或3米线缆):上 PRBS15 或 PRBS23。我一般先用PRBS23,因为它能覆盖更多码间干扰场景。
- 高速、长距(>10Gbps、光纤或多米长链路):必须上 PRBS31。长序列才能充分激励均衡器和CDR,不然时序余量测出来虚高。
2. 看被测件的均衡能力
很多芯片内部有CTLE或DFE。你用PRBS7这种短序列测,均衡器很快就能收敛。但系统实际跑的流量是长序列,均衡器根本跟不上。
嗯,这里要注意:如果你想知道均衡器的真实表现,至少要用PRBS23或更长的序列。
3. 看测试时间能否接受
PRBS31虽然好,但序列长度超过21亿比特。在10Gbps速率下,扫完一个完整周期需要200多毫秒。要是测误码率到1e-12,你得算算要跑多少比特。我遇到过有人用PRBS31测1e-15,结果跑了一整天。
- 快速验证眼图: PRBS7 足够,几毫秒出结果
- 标准合规测试: 按协议走,比如PCIe Gen4强制用PRBS31
- 深度压力测试: PRBS31 + 长时间捕获
4. 看协议规范要求
这个最简单:协议让你用什么,你就用什么。别自作聪明换多项式,认证测试时会被打回来。
- USB 3.0/3.1:PRBS15
- PCIe Gen3/Gen4:PRBS23 / PRBS31
- 100G以太网:PRBS31
我的个人经验: 如果你不确定选什么,就按最坏情况来。在项目早期用PRBS31测一遍,虽然慢,但能暴露所有问题。后期回归测试再用短序列提速。这个策略帮我至少省了两轮改板。
知识体系速览
下面这张图帮你把本章的核心逻辑串起来。从多项式定义到选型决策,一条线走到底。