1. PCIe 时钟偏差
1.1 PCIe 时钟偏差出现的原因
为了减少EMI电磁辐射,芯片厂家往往会对时钟进行扩频(Spread Spectrum Clocking,SSC)。即便不进行SSC,受限于PLL工艺,时钟频率也很难做到与期望频率完全一致。
这样一来,PCIe发送端与接收端存在时钟偏差,尤其是频率偏差。当收发端时钟存在偏差时,如果不对时钟偏差进行补偿,收发端比特速率不匹配势必会导致数据包接收出错。
1.2 PCIe 时钟偏差补偿
为了实现收发端间的有效数据包正确传输,PCIe采用插入SKIP有序集的方式来对时钟偏差进行补偿。发送端(Tx)周期性地在传输lane上发送SKIP有序集,接收端(Rx)接收SKIP有序集并存入其弹性缓存(elastic buffer)中。Rx通过这种删除/插入SKP的方式,来达到补偿时钟偏差的目的。
1.2.1 8b/10b
8b/10b编码时(Gen1/Gen2),Tx发送的SKIP有序集由4个符号组成,以COM符号开始,后面跟着3个SKP符号。若Tx速率快于Rx,Rx从SKIP有序集中删除一个SKP;若Tx速率慢于Rx,Rx从SKIP有序集中插入一个SKP。Rx接收的SKIP有序集为1*COM+(1~5)*SKP。Tx发送有序集的时间间隔为1180~1538符号。
1.2.2 128b/130b
128b/130编码时(Gen3/Gen4/Gen5),Tx发送的SKIP有序集由16个符号组成。Rx接收的SKIP有序集可以为8,12,16,20,24符号。Tx发送有序集的时间间隔为370~375符号。
跟8b/10b下的SKIP有序集相比,128b/130b时的有序集是16SKP+1SKP_END(or SKP_END_CTL) + 3*other symbol。SKP symbol值为0xaa@gen3, 0x99@gen4/gen5。
SKIP_END symbol值为0xe1,SKP_END_CTL值为0x78。
Tx端发送SKIP有序集的原则:
1. 最快1180/370个符号周期、最慢1538/375个符号周期需发送一次SKIP有序集;
2. 多条lane上的SKIP有序集需同时发送,必要时可用PAD字符填充;
3. 发送SKIP有序集不能打乱正常包的发送(即需在包的边界进行插入),发送长包时可在长包发送完城后可集中一次发送多个SKIP有序集;
4. 发送逻辑闲时仍需发送SKIP有序集;
5. Low Power状态时SKIP interval timer需复位。
仿真中遇到的问题
1. SNPS PCIe VIP 报错
遇到问题:
UVM_ERROR */pciesvc_phy.svp(14136) @ *ns: uvm_test_top.*.host_env.io[0].port0.pl0[register_fail:ACTIVE_PL:SKP_OS:phy_max_rx_skp_interval] ReceivePhy: Exceeded maximum interval of 1538 symbol times on lane 0 before receiving a skp ordered set
解决办法:
VIP config中加大skp interval