3. SerDes物理层(PHY)基础:PMA子层与PCS子层功能划分
做SerDes设计这么多年,我经常被问到的一个问题是:「PHY层到底管什么?」
其实说白了,SerDes的物理层(PHY)并不是一个黑盒子。它内部有明确的分工——PMA和PCS两个子层。这两个家伙各司其职,配合好了,你的高速链路才能跑得稳。
核心观点:PMA负责「硬活儿」,PCS负责「软活儿」。一个管模拟信号,一个管数字逻辑。
3.1 PCS子层——数字世界的「翻译官」
PCS,全称Physical Coding Sublayer。我习惯叫它「编码子层」。它的任务,就是把上层送来的数据,变成适合在高速链路上传输的格式。
你想想看,原始数据里如果有一长串连续的0或1,接收端的CDR(时钟数据恢复)会直接崩溃——因为它找不到跳变沿来恢复时钟。PCS就是来解决这个问题的。
3.1.1 8B/10B编码——经典但不过时
8B/10B编码,说白了就是把8位数据映射成10位码字。多出来的2位,用来保证DC平衡和足够的跳变密度。
我个人的经验:在PCIe Gen3之前的项目中,8B/10B几乎是标配。它的好处是简单、可靠,但代价是20%的开销。如果你做的是25Gbps以上的链路,就得考虑64B/66B或者128B/130B了。
关键点:8B/10B编码保证「游程长度」不超过5个连续的相同位,且「差异度」控制在合理范围内。
3.1.2 加扰与解扰
有些协议不用8B/10B,而是用加扰。比如PCIe Gen3及以上、SATA、USB 3.0等。
加扰的原理很简单:用一个伪随机序列(PRBS)跟数据做异或。接收端用同样的序列再异或一次,就还原了。
小技巧:我曾经在调试一个10Gbps链路时,发现误码率居高不下。查了半天,发现是加扰器的种子没同步。接收端和发送端的PRBS种子必须一致,否则解出来全是乱码。
3.1.3 对齐标记与弹性缓冲
在多通道SerDes中(比如x4、x8),每个通道的数据到达时间可能有微小差异。PCS会在数据流中插入对齐标记(Alignment Marker),接收端根据这些标记做通道对齐。
弹性缓冲呢?它用来处理两个时钟域之间的频率差异。发送端和接收端的参考时钟不可能完全一致,弹性缓冲通过插入或删除「空闲字符」来吸收这个差异。
注意:弹性缓冲的深度不能太大,否则会增加延迟;也不能太小,否则会溢出。我一般建议设置为4-8个字符深度,具体看协议要求。
3.2 PMA子层——模拟信号的「硬汉」
PMA,全称Physical Medium Attachment。如果说PCS是文官,那PMA就是武将。它直接跟物理介质打交道,处理的是模拟信号。
3.2.1 串行化与解串
这是PMA最核心的功能。PCS送来的并行数据(比如10位宽),在PMA里被串行化成高速比特流,送到线路上。接收端再把串行数据转回并行。
举个例子:10Gbps的SerDes,内部并行数据可能是10位@1GHz。PMA把它串行化成1位@10GHz。这个转换过程,对时钟抖动的要求极高。
3.2.2 时钟数据恢复(CDR)
CDR是PMA的「心脏」。它从接收到的数据流中提取时钟,并用这个时钟来采样数据。
我记得有一次:在实验室调试一个28Gbps的链路,眼图总是闭合的。后来发现是CDR的环路带宽设置不对。带宽太宽,噪声太多;带宽太窄,跟不上频率变化。调了三天才找到平衡点。
CDR的关键参数:
- 环路带宽:通常建议为数据速率的1/1000 ~ 1/500
- 抖动容限:决定了CDR能跟踪多大的输入抖动
- 锁定时间:从失锁到重新锁定需要多少比特
3.2.3 发送驱动与接收均衡
发送驱动(TX Driver)负责把数字信号变成模拟信号,驱动到传输线上。它需要提供足够的摆幅和合适的预加重(Pre-emphasis)或去加重(De-emphasis)。
接收均衡(RX EQ)则负责补偿信道损耗。高频信号在传输线上衰减更大,均衡器就是把这个衰减补回来。
常见的均衡技术包括:
- CTLE(连续时间线性均衡):模拟电路,放大高频分量
- DFE(判决反馈均衡):数字电路,消除码间干扰
- FFE(前馈均衡):发送端预补偿
避坑指南:我曾经在一个项目中,接收端的CTLE增益调得太大,结果把噪声也放大了。眼图看起来张开了,但误码率反而更高。均衡不是越强越好,要跟信道特性匹配。
3.3 PMA与PCS的接口
PMA和PCS之间怎么通信?通常通过一个并行接口,比如PMA服务接口(PMI)。
这个接口上传递的数据包括:
- 并行数据(发送/接收)
- 控制信号(比如信号检测状态)
- 时钟信号
| 接口信号 | 方向 | 说明 |
|---|---|---|
| tx_data[9:0] | PCS → PMA | 发送并行数据(10位) |
| rx_data[9:0] | PMA → PCS | 接收并行数据(10位) |
| signal_detect | PMA → PCS | 信号检测指示 |
| rx_clk | PMA → PCS | 恢复时钟 |
3.4 实际项目中的分工经验
在实际芯片设计中,PCS和PMA通常由不同的团队负责。PCS团队做数字逻辑,用Verilog/VHDL;PMA团队做模拟电路,用Cadence/Spectre。
我个人的建议:接口定义一定要在项目早期就定死。PMA给PCS的时钟频率、数据对齐方式、握手协议,这些一旦定下来就不要轻易改。否则两边联调的时候,你会发现「数字说模拟给的数据不对,模拟说数字采的时机不对」——这种扯皮我见得太多了。
总结一下:
- PCS负责编码、加扰、对齐、缓冲——数字逻辑
- PMA负责串化、CDR、驱动、均衡——模拟混合信号
- 两者通过并行接口交换数据,配合时钟和状态信号
嗯,PMA和PCS的分工,说白了就是「数字管逻辑,模拟管信号」。理解了这个,你再看任何SerDes的datasheet,都会觉得清晰很多。