【PCIe有点闲】电气闲,逻辑闲,到底谁更闲?

简介: 【PCIe有点闲】电气闲,逻辑闲,到底谁更闲?

前言


b92f89f14dc24c9f83b23a97111bb8ee.jpg



  • 把PCIe链路比作出租车,电气闲相当于出租车停车熄火,逻辑闲相当于出租车挂空挡。


  • 长时间接不到单,为了省油我要熄火,上客后要重新启动热车;


  • 临时等客我就挂空挡,上客后挂挡随时走。





1. 电气闲


1.1 电气闲定义


PCIe电气闲是PCIe链路的一种低功耗状态,处于电气闲状态的PCIe链路其差分信号线之间理论上没有电势差(<20mV),链路驱动器处于高阻态。




1.2 有序集


1.2.1 电气闲有序集、序列


 电气闲有序集(EIOS)用于通知链路进入低功耗模式。Gen1/Gen2中,EIOS由1COM + 3IDL共4个符号组成;Gen3~5中,EIOS由16个66h符号组成。


 电气闲有序集序列(EIOSQ)是由一个或多个EIOS组成的序列。发送速率为5.0GT/s (Gen2)时,EIOSQ由两个连续的EIOS组成,其他速率下(Gen1/3/4/5)EIOSQ由一个EIOS组成。(想想为什么5GT/s时要发送两遍EIOS?是怕接收端接收出错吗?解答见评论区。)


 发送器在进入电气闲低功耗模式之前必须给接收器发送电气闲有序集序列,发送器发出有序集后无需等待响应即可进入电气闲,接收器接收到有序集序列后进入电气闲。



➢ EIOS有序集的接收与截断


 Gen1/2速率下,EIOS由1个COM和3个IDL组成,接收端在收到1个COM和2个IDL后即可判定为接收到了EIOS。(思考:为什么要提前做出判断?)


 Gen3/4/5速率下,EIOS由16个66h组成。若连续发送多个EIOS,除最后一笔EIOS外,之前任何EIOS都必须完整发送16个66h符号。考虑到128b/130b编码时,存在内部时钟边界跟符号边界未对齐的情况,发送器最后一笔EIOS的16个符号未发送完毕便停止发送进入EI状态,称之为EIOS有序集的截断。接收端在收到4个66h符号后即可断定收到了EIOS,EIOS截断并不会导致接收端接收EIOS异常。




1.2.2 电气闲退出有序集


 电气闲退出有序集(EIEOS),顾名思义,用于发送器通知接收器退出电气闲。


 Gen1(2.5GT/s)没有低功耗状态,即只有发送速率在5GT/s及以上时才会用到EIEOS。


 Gen2(5GT/s)速率时,EIEOS由1COM + 14EIE + 1D10.2组成。⚠️EIEOS最后一个符号D10.2虽然是D字符,但是是不做scramble的。Spec之前的版本对这一点解释比较模糊,导致有些设备在实现的时候做了scramble,因此建议在具体实现的时候通融一点,加不加扰都支持。


 Gen3/4/5速率是,EIEOS由16个全0或全1的符号组成。


 Gen3(8GT/s)速率时,从symbol0开始,1个symbol为1组,相邻组相间发送符号全零00h或全一ffh。即偶数symbol(0/2/4/6/8/10/12/14)上发送00h、奇数symbol(1/3/5/7/9/11/13/15)上发送ffh来表示EIEOS,这样一来能够获得8个0b和8个1b交替的低频pattern。


 Gen4(16GT/s)速率时,从symbol0开始,每2个symbol为1组,相邻组相间发送符号全零00h或全一ffh。即symbol0/1/4/5/8/9/12/13上发送00h、symbol2/3/6/7/10/11/14/15上发送ffh来表示EIEOS,这样一来能够获得16个0b和16个1b交替的低频pattern。


 Gen5(32GT/s)速率时,从symbol0开始,每4个symbol为1组,相邻组相间发送符号全零00h或全一ffh。即symbol0/1/2/3/8/9/10/11上发送00h、symbol4/5/6/7/12/13/14/15上发送ffh来表示EIEOS,这样一来能够获得32个0b和32个1b交替的低频pattern。


0bb89f0338754f1c82c1168f79afa83c.png



图1 EIEOS有序集




 电气闲退出有序集序列(EIEOSQ)是由一个或多个EIEOS组成的序列。目前只有32GT/s速率时EIEOSQ由两个背靠背的EIEOS组成,其他速率由1个EIEOS组成。





1.3 电气闲进入与退出


1.3.1 进入电气闲


 发送器发送电气闲有序集告知接收器该链路要进入电气闲状态。发送器在发出电气闲有序集后20UI内应进入电气闲状态,且进入电气闲后至少应持续50UI时间。接收器在收到电气闲有序集中的2个IDLE符号即可进入电气闲状态。处于电气闲状态的链路,由于传输线上没有任何信息传输,接收器PLL无法恢复出时钟信号。


➢ 如何判断进入电气闲?


 接收端设备有两种方式来判断是否要进入电气闲:


   模拟电路直接检测法,直接根据PHY的模拟电路tx_ei,rx_ei信号直接判断是否进入电气闲状态。


   推断法。根据接收到的有序集进行推断,不同传输速率、LTSSM处于不同状体时的推断条件不同,具体如下表所示。


表1 电气闲推断条件  


c5a9fea284a04c5da2c7b6f65da6dd34.png



1.3.2 退出电气闲


 发送器发送EIEOS、FTS或TS1/TS2有序集以告知接收器该链路即将退出电气闲状态,发送器在发出EIEOS、FTS或TS1/TS2有序集后10UI时间内应进入L0。接收器检测到查分信号线上出现电势差(>60mV),此时接收器PLL能够恢复出时钟信号,并重新开始进行收发器间的位同步、符号同步。





2. 逻辑闲


2.1 逻辑闲定义


在长时间的工作过程中,PCIe链路上显然不会一直发送有效的数据。即便PCIe有能力这么干(一直传输有效数据),发送端主机也很难说一直有活儿给PCIe去干。考虑到收发端通过数据流进行PLL同步,当链路上临时没有数据包要发送时候(链路逻辑闲),发送器继续发送逻辑闲符号(00字符),从而实现维持位锁定和符号锁定的目的。





2.2 逻辑闲序列


   逻辑闲序列在所有通路上同时发送。


   逻辑闲序列为D类字符,需要经过加扰、编码才能发送。


   逻辑闲序列处于包的帧结构之外,即不在STP/EDB或STP/END控制符之间。


   发送逻辑闲期间,SKIP有序集也是在周期性发送的。(时钟偏差补偿不能落下啊)


   发送完逻辑闲之后,STP/SDP必须放置到symbol0发送,其他情况可以放在symbol0/4/8/12/16等能够被4整除的symbolN上。(想想为社么?提示:逻辑闲在包的帧结构之外)





3. 总结


 电气闲与逻辑闲的关系:没啥关系。


 电气闲是真的闲,链路上没有数据包在发送,PLL失锁。


 逻辑闲是暂时的闲,是在没有数据包要发送时发送的占位符号,目的是保持收发PLL同步。






参考


   PCI Express Base Specification Revision 5.0 Version 1.0 (22 May 2019)


   PCI Express Technology - Comprehensive Guide to Generation1.x, 2.x and 3.0. Mike Jacson, Ravi Budruk, MindShare, Inc.


   PCI、PCI-X和PCI Express的原理及体系结构,马锦明,朱剑冰 等著





目录
相关文章
|
存储 物联网 芯片
聊聊身边的嵌入式:点菜机用着好好的,突然挂了,这口锅应该甩给谁?
聊聊身边的嵌入式:点菜机用着好好的,突然挂了,这口锅应该甩给谁?
【期末不挂科-单片机考前速过系列P5】(第五章:11题速过中断系统和中断系统结构)经典例题盘点(带图解析)
【期末不挂科-单片机考前速过系列P5】(第五章:11题速过中断系统和中断系统结构)经典例题盘点(带图解析)
HMI-36-【节能模式】开搞
今天主要是准备工作,先把运动模式中的接口都搬运过来,这样在主仪表中都可以把节能模式都的调用都写进去了。
HMI-36-【节能模式】开搞
|
传感器 算法 前端开发
电赛信号类经验总结-从零基础到省一不是梦(超多电赛程序、电路资料分享)
电赛信号类经验总结-从零基础到省一不是梦(超多电赛程序、电路资料分享)
1733 1
电赛信号类经验总结-从零基础到省一不是梦(超多电赛程序、电路资料分享)
|
Java 关系型数据库 MySQL
【浅尝高并发编程】接私活差点翻车
作为一名本本分分的练习时长两年半的Java练习生,一直深耕在业务逻辑里,对并发编程的了解仅仅停留在八股文里。一次偶然的机会,接到一个私活,核心逻辑是写一个 定时访问api把数据持久化到数据库的小服务。
176 0
|
安全 网络协议 Linux
凉了,CPU 飙的老高了!
开启SELinux 杀掉挖矿进程 删除病毒程序(注意rm命令是否被替换) 删除病毒驱动程序(注意rm命令是否被替换) 删除病毒添加的登录凭据 防火墙封禁IP、端口
凉了,CPU 飙的老高了!
|
存储 移动开发 程序员
程序员心中的一道坎:主存的编址与计算和串并联系统!
很多小伙伴认为程序员就是写写代码,不需要了解计算机底层的知识和原理。其实,这种观点是错误的。如果你想突破程序员的职业发展瓶颈,计算机硬件、操作系统原理、编译原理等是一定要掌握的知识。而【冰河技术】微信公众号的【程序员进阶系列】专题就是要系统的向大家分享程序员进阶需要掌握的各项知识技能。今天,我们来聊聊一个让程序员很头疼的话题:计算机中的主存是如何进行编址和计算的?以及串并联系统的可靠度如何计算?
354 0
程序员心中的一道坎:主存的编址与计算和串并联系统!
CPU又烧了,说起来汝可能不信
CPU又烧了,说起来汝可能不信
139 0