PCIE基础知识.docx
《PCIE基础知识.docx》由会员分享,可在线阅读,更多相关《PCIE基础知识.docx(14页珍藏版)》请在冰豆网上搜索。
PCIE基础知识
PCIe总线概述
随着现代处理器技术得发展,在互连领域中,使用高速差分总线替代并行总线就是大势所趋。
与单端并行信号相比,高速差分信号可以使用更高得时钟频率,从而使用更少得信号线,完成之前需要许多单端并行数据信号才能达到得总线带宽。
PCI总线使用并行总线结构,在同一条总线上得所有外部设备共享总线带宽,而PCIe总线使用了高速差分总线,并采用端到端得连接方式,因此在每一条PCIe链路中只能连接两个设备。
这使得PCIe与PCI总线采用得拓扑结构有所不同。
PCIe总线除了在连接方式上与PCI总线不同之外,还使用了一些在网络通信中使用得技术,如支持多种数据路由方式,基于多通路得数据传递方式,与基于报文得数据传送方式,并充分考虑了在数据传送中出现服务质量QoS(QualityofService)问题。
PCIe总线得基础知识
与PCI总线不同,PCIe总线使用端到端得连接方式,在一条PCIe链路得两端只能各连接一个设备,这两个设备互为就是数据发送端与数据接收端。
PCIe总线除了总线链路外,还具有多个层次,发送端发送数据时将通过这些层次,而接收端接收数据时也使用这些层次。
PCIe总线使用得层次结构与网络协议栈较为类似。
1、1端到端得数据传递
PCIe链路使用“端到端得数据传送方式”,发送端与接收端中都含有TX(发送逻辑)与RX(接收逻辑),其结构如图41所示。
由上图所示,在PCIe总线得物理链路得一个数据通路(Lane)中,由两组差分信号,共4根信号线组成。
其中发送端得TX部件与接收端得RX部件使用一组差分信号连接,该链路也被称为发送端得发送链路,也就是接收端得接收链路;而发送端得RX部件与接收端得TX部件使用另一组差分信号连接,该链路也被称为发送端得接收链路,也就是接收端得发送链路。
一个PCIe链路可以由多个Lane组成。
高速差分信号电气规范要求其发送端串接一个电容,以进行AC耦合。
该电容也被称为AC耦合电容。
PCIe链路使用差分信号进行数据传送,一个差分信号由D+与D-两根信号组成,信号接收端通过比较这两个信号得差值,判断发送端发送得就是逻辑“1”还就是逻辑“0”。
与单端信号相比,差分信号抗干扰得能力更强,因为差分信号在布线时要求“等长”、“等宽”、“贴近”,而且在同层。
因此外部干扰噪声将被“同值”而且“同时”加载到D+与D-两根信号上,其差值在理想情况下为0,对信号得逻辑值产生得影响较小。
因此差分信号可以使用更高得总线频率。
此外使用差分信号能有效抑制电磁干扰EMI(ElectroMagneticInterference)。
由于差分信号D+与D-距离很近而且信号幅值相等、极性相反。
这两根线与地线间耦合电磁场得幅值相等,将相互抵消,因此差分信号对外界得电磁干扰较小。
当然差分信号得缺点也就是显而易见得,一就是差分信号使用两根信号传送一位数据;二就是差分信号得布线相对严格一些。
PCIe链路可以由多条Lane组成,目前PCIe链路可以支持1、2、4、8、12、16与32个Lane,即×1、×2、×4、×8、×12、×16与×32宽度得PCIe链路。
每一个Lane上使用得总线频率与PCIe总线使用得版本相关。
第1个PCIe总线规范为V1、0,之后依次为V1、0a,V1、1,V2、0与V2、1。
目前PCIe总线得最新规范为V2、1,而V3、0正在开发过程中,预计在2010年发布。
不同得PCIe总线规范所定义得总线频率与链路编码方式并不相同,如表41所示。
表41PCIe总线规范与总线频率与编码得关系
PCIe总线规范
总线频率[1]
单Lane得峰值带宽
编码方式
1、x
1、25GHz
2、5GT/s
8/10b编码
2、x
2、5GHz
5GT/s
8/10b编码
3、0
4GHz
8GT/s
128/130b编码
如上表所示,不同得PCIe总线规范使用得总线频率并不相同,其使用得数据编码方式也不相同。
PCIe总线V1、x与V2、0规范在物理层中使用8/10b编码,即在PCIe链路上得10bit中含有8bit得有效数据;而V3、0规范使用128/130b编码方式,即在PCIe链路上得130bit中含有128bit得有效数据。
由上表所示,V3、0规范使用得总线频率虽然只有4GHz,但就是其有效带宽就是V2、x得两倍。
下文将以V2、x规范为例,说明不同宽度PCIe链路所能提供得峰值带宽,如表42所示。
表42PCIe总线得峰值带宽
PCIe总线得数据位宽
×1
×2
×4
×8
×12
×16
×32
峰值带宽(GT/s)
5
10
20
40
60
80
160
由上表所示,×32得PCIe链路可以提供160GT/s得链路带宽,远高于PCI/PCI-X总线所能提供得峰值带宽。
而即将推出得PCIeV3、0规范使用4GHz得总线频率,将进一步提高PCIe链路得峰值带宽。
在PCIe总线中,使用GT(Gigatransfer)计算PCIe链路得峰值带宽。
GT就是在PCIe链路上传递得峰值带宽,其计算公式为总线频率×数据位宽×2。
在PCIe总线中,影响有效带宽得因素有很多,因而其有效带宽较难计算。
尽管如此,PCIe总线提供得有效带宽还就是远高于PCI总线。
PCIe总线也有其弱点,其中最突出得问题就是传送延时。
PCIe链路使用串行方式进行数据传送,然而在芯片内部,数据总线仍然就是并行得,因此PCIe链路接口需要进行串并转换,这种串并转换将产生较大得延时。
除此之外PCIe总线得数据报文需要经过事务层、数据链路层与物理层,这些数据报文在穿越这些层次时,也将带来延时。
在基于PCIe总线得设备中,×1得PCIe链路最为常见,而×12得PCIe链路极少出现,×4与×8得PCIe设备也不多见。
Intel通常在ICH中集成了多个×1得PCIe链路用来连接低速外设,而在MCH中集成了一个×16得PCIe链路用于连接显卡控制器。
而PowerPC处理器通常能够支持×8、×4、×2与×1得PCIe链路。
PCIe总线物理链路间得数据传送使用基于时钟得同步传送机制,但就是在物理链路上并没有时钟线,PCIe总线得接收端含有时钟恢复模块CDR(ClockDataRecovery),CDR将从接收报文中提取接收时钟,从而进行同步数据传递。
值得注意得就是,在一个PCIe设备中除了需要从报文中提取时钟外,还使用了REFCLK+与REFCLK-信号对作为本地参考时钟,这个信号对得描述见下文。
1、2PCIe总线使用得信号
PCIe设备使用两种电源信号供电,分别就是Vcc与Vaux,其额定电压为3、3V。
其中Vcc为主电源,PCIe设备使用得主要逻辑模块均使用Vcc供电,而一些与电源管理相关得逻辑使用Vaux供电。
在PCIe设备中,一些特殊得寄存器通常使用Vaux供电,如StickyRegister,此时即使PCIe设备得Vcc被移除,这些与电源管理相关得逻辑状态与这些特殊寄存器得内容也不会发生改变。
在PCIe总线中,使用Vaux得主要原因就是为了降低功耗与缩短系统恢复时间。
因为Vaux在多数情况下并不会被移除,因此当PCIe设备得Vcc恢复后,该设备不用重新恢复使用Vaux供电得逻辑,从而设备可以很快地恢复到正常工作状状态。
PCIe链路得最大宽度为×32,但就是在实际应用中,×32得链路宽度极少使用。
在一个处理器系统中,一般提供×16得PCIe插槽,并使用PETp0~15、PETn0~15与PERp0~15、PER--]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]n0~15共64根信号线组成32对差分信号,其中16对PETxx信号用于发送链路,另外16对PERxx信号用于接收链路。
除此之外PCIe总线还使用了下列辅助信号。
1PERST#信号
该信号为全局复位信号,由处理器系统提供,处理器系统需要为PCIe插槽与PCIe设备提供该复位信号。
PCIe设备使用该信号复位内部逻辑。
当该信号有效时,PCIe设备将进行复位操作。
PCIe总线定义了多种复位方式,其中ColdReset与WarmReset这两种复位方式得实现与该信号有关,详见第1、5节。
2REFCLK+与REFCLK-信号
在一个处理器系统中,可能含有许多PCIe设备,这些设备可以作为Add-In卡与PCIe插槽连接,也可以作为内置模块,与处理器系统提供得PCIe链路直接相连,而不需要经过PCIe插槽。
PCIe设备与PCIe插槽都具有REFCLK+与REFCLK-信号,其中PCIe插槽使用这组信号与处理器系统同步。
在一个处理器系统中,通常采用专用逻辑向PCIe插槽提供REFCLK+与REFCLK-信号,如图42所示。
其中100Mhz得时钟源由晶振提供,并经过一个“一推多”得差分时钟驱动器生成多个同相位得时钟源,与PCIe插槽一一对应连接。
PCIe插槽需要使用参考时钟,其频率范围为100MHz±300ppm。
处理器系统需要为每一个PCIe插槽、MCH、ICH与Switch提供参考时钟。
而且要求在一个处理器系统中,时钟驱动器产生得参考时钟信号到每一个PCIe插槽(MCH、ICH与Swith)得距离差在15英寸之内。
通常信号得传播速度接近光速,约为6英寸/ns,由此可见,不同PCIe插槽间REFCLK+与REFCLK-信号得传送延时差约为2、5ns。
当PCIe设备作为Add-In卡连接在PCIe插槽时,可以直接使用PCIe插槽提供得REFCLK+与REFCLK-信号,也可以使用独立得参考时钟,只要这个参考时钟在100MHz±300ppm范围内即可。
内置得PCIe设备与Add-In卡在处理REFCLK+与REFCLK-信号时使用得方法类似,但就是PCIe设备可以使用独立得参考时钟,而不使用REFCLK+与REFCLK-信号。
在PCIe设备配置空间得LinkControlRegister中,含有一个“monClockConfiguration”位。
当该位为1时,表示该设备与PCIe链路得对端设备使用“同相位”得参考时钟;如果为0,表示该设备与PCIe链路得对端设备使用得参考时钟就是异步得。
在PCIe设备中,“monClockConfiguration”位得缺省值为0,此时PCIe设备使用得参考时钟与对端设备没有任何联系,PCIe链路两端设备使用得参考时钟可以异步设置。
这个异步时钟设置方法对于使用PCIe链路进行远程连接时尤为重要。
在一个处理器系统中,如果使用PCIe链路进行机箱到机箱间得互连,因为参考时钟可以异步设置,机箱到机箱之间进行数据传送时仅需要差分信号线即可,而不需要参考时钟,从而极大降低了连接难度。
3WAKE#信号
当PCIe设备进入休眠状态,主电源已经停止供电时,PCIe设备使用该信号向处理器系统提交唤醒请求,使处理器系统重新为该PCIe设备提供主电源Vcc。
在PCIe总线中,WAKE#信号就是可选得,因此使用WAKE#信号唤醒PCIe设备得机制也就是可选得。
值得注意得就是产生该信号得硬件逻辑必须使用辅助电源Vaux供电。
WAKE#就是一个OpenDrain信号,一个处理器得所有PCIe设备可以将WAKE#信号进行线与后,统一发送给处理器系统得电源控制器。
当某个PCIe设备需要被唤醒时,该设备首先置WAKE#信号有效,然后在经过一段延时之后,处理器系统开始为该设备提供主电源Vcc,并使用PERST#信号对该设备进行复位操作。
此时WAKE#信号需要始终保持为低,当主电源Vcc上电完成之后,PERST#信号也将置为无效并结束复位,WAKE#信号也将随之置为无效,结束整个唤醒过程。
PCIe设备除了可以使用WAKE#信号实现唤醒功能外,还可以使用Beacon信号实现唤醒功能。
与WAKE#信号实现唤醒功能不同,Beacon使用In-band信号,即差分信号D+与D-实现唤醒功能。
Beacon信号DC平衡,由一组通过D+与D-信号生成得脉冲信号组成。
这些脉冲信号宽度得最小值为2ns,最大值为16us。
当PCIe设备准备退出L2状态(该状态为PCIe设备使用得一种低功耗状态)时,可以使用Beacon信号,提交唤醒请求。
4SMCLK与SMDAT信号
SMCLK与SMDAT信号与x86处理器得SMBus(SystemMangementBus)相关。
SMBus于1995年由Intel提出,SMBus由SMCLK与SMDAT信号组成。
SMBus源于I2C总线,但就是与I2C总线存在一些差异。
SMBus得最高总线频率为100KHz,而I2C总线可以支持400KHz与2MHz得总线频率。
此外SMBus上得从设备具有超时功能,当从设备发现主设备发出得时钟信号保持低电平超过35ms时,将引发从设备得超时复位。
在正常情况下,SMBus得主设备使用得总线频率最低为10KHz,以避免从设备在正常使用过程中出现超时。
在SMbus中,如果主设备需要复位从设备时,可以使用这种超时机制。
而I2C总线只能使用硬件信号才能实现这种复位操作,在I2C总线中,如果从设备出现错误时,单纯通过主设备就是无法复位从设备得。
SMBus还支持AlertResponse机制。
当从设备产生一个中断时,并不会立即清除该中断,直到主设备向0b0001100地址发出命令。
上文所述得SMBus与I2C总线得区别还就是局限于物理层与链路层上,实际上SMBus还含有网络层。
SMBus还在网络层上定义了11种总线协议,用来实现报文传递。
SMBus在x86处理器系统中得到了大规模普及,其主要作用就是管理处理器系统得外部设备,并收集外设得运行信息,特别就是一些与智能电源管理相关得信息。
PCI与PCIe插槽也为SMBus预留了接口,以便于PCI/PCIe设备与处理器系统进行交互。
在Linux系统中,SMBus得到了广泛得应用,ACPI也为SMBus定义了一系列命令,用于智能电池、电池充电器与处理器系统之间得通信。
在Windows操作系统中,有关外部设备得描述信息,也就是通过SMBus获得得。
5JTAG信号
JTAG(JointTestActionGroup)就是一种国际标准测试协议,与IEEE1149、1兼容,主要用于芯片内部测试。
目前绝大多数器件都支持JTAG测试标准。
JTAG信号由TRST#、TCK、TDI、TDO与TMS信号组成。
其中TRST#为复位信号;TCK为时钟信号;TDI与TDO分别与数据输入与数据输出对应;而TMS信号为模式选择。
JTAG允许多个器件通过JTAG接口串联在一起,并形成一个JTAG链。
目前FPGA与EPLD可以借用JTAG接口实现在线编程ISP(In-SystemProgramming)功能。
处理器也可以使用JTAG接口进行系统级调试工作,如设置断点、读取内部寄存器与存储器等一系列操作。
除此之外JTAG接口也可用作“逆向工程”,分析一个产品得实现细节,因此在正式产品中,一般不保留JTAG接口。
6PRSNT1#与PRSNT2#信号
PRSNT1#与PRSNT2#信号与PCIe设备得热插拔相关。
在基于PCIe总线得Add-in卡中,PRSNT1#与PRSNT2#信号直接相连,而在处理器主板中,PRSNT1#信号接地,而PRSNT2#信号通过上拉电阻接为高。
PCIe设备得热插拔结构如图43所示。
如上图所示,当Add-In卡没有插入时,处理器主板得PRSNT2#信号由上拉电阻接为高,而当Add-In卡插入时主板得PRSNT2#信号将与PRSNT1#信号通过Add-In卡连通,此时PRSNT2#信号为低。
处理器主板得热插拔控制逻辑将捕获这个“低电平”,得知Add-In卡已经插入,从而触发系统软件进行相应地处理。
Add-In卡拔出得工作机制与插入类似。
当Add-in卡连接在处理器主板时,处理器主板得PRSNT2#信号为低,当Add-In卡拔出后,处理器主板得PRSNT2#信号为高。
处理器主板得热插拔控制逻辑将捕获这个“高电平”,得知Add-In卡已经被拔出,从而触发系统软件进行相应地处理。
不同得处理器系统处理PCIe设备热拔插得过程并不相同,在一个实际得处理器系统中,热拔插设备得实现也远比图43中得示例复杂得多。
值得注意得就是,在实现热拔插功能时,Add-inCard需要使用“长短针”结构。
如图43所示,PRSNT1#与PRSNT2#信号使用得金手指长度就是其她信号得一半。
因此当PCIe设备插入插槽时,PRSNT1#与PRSNT2#信号在其她金手指与PCIe插槽完全接触,并经过一段延时后,才能与插槽完全接触;当PCIe设备从PCIe插槽中拔出时,这两个信号首先与PCIe插槽断连,再经过一段延时后,其她信号才能与插槽断连。
系统软件可以使用这段延时,进行一些热拔插处理。
1、3PCIe总线得层次结构
PCIe总线采用了串行连接方式,并使用数据包(Packet)进行数据传输,采用这种结构有效去除了在PCI总线中存在得一些边带信号,如INTx与PME#等信号。
在PCIe总线中,数据报文在接收与发送过程中,需要通过多个层次,包括事务层、数据链路层与物理层。
PCIe总线得层次结构如图44所示。
PCIe总线得层次组成结构与网络中得层次结构有类似之处,但就是PCIe总线得各个层次都就是使用硬件逻辑实现得。
在PCIe体系结构中,数据报文首先在设备得核心层(DeviceCore)中产生,然后再经过该设备得事务层(TransactionLayer)、数据链路层(DataLinkLayer)与物理层(PhysicalLayer),最终发送出去。
而接收端得数据也需要通过物理层、数据链路与事务层,并最终到达DeviceCore。
1事务层
事务层定义了PCIe总线使用总线事务,其中多数总线事务与PCI总线兼容。
这些总线事务可以通过Switch等设备传送到其她PCIe设备或者RC。
RC也可以使用这些总线事务访问PCIe设备。
事务层接收来自PCIe设备核心层得数据,并将其封装为TLP(TransactionLayerPacket)后,发向数据链路层。
此外事务层还可以从数据链路层中接收数据报文,然后转发至PCIe设备得核心层。
事务层得一个重要工作就是处理PCIe总线得“序”。
在PCIe总线中,“序”得概念非常重要,也较难理解。
在PCIe总线中,事务层传递报文时可以乱序,这为PCIe设备得设计制造了不小得麻烦。
事务层还使用流量控制机制保证PCIe链路得使用效率。
有关事务层得详细说明见第6章。
2数据链路层
数据链路层保证来自发送端事务层得报文可以可靠、完整地发送到接收端得数据链路层。
来自事务层得报文在通过数据链路层时,将被添加SequenceNumber前缀与CRC后缀。
数据链路层使用ACK/NAK协议保证报文得可靠传递。
PCIe总线得数据链路层还定义了多种DLLP(DataLinkLayerPacket),DLLP产生于数据链路层,终止于数据链路层。
值得注意得就是,TLP与DLLP并不相同,DLLP并不就是由TLP加上SequenceNumber前缀与CRC后缀组成得。
3物理层
物理层就是PCIe总线得最底层,将PCIe设备连接在一起。
PCIe总线得物理电气特性决定了PCIe链路只能使用端到端得连接方式。
PCIe总线得物理层为PCIe设备间得数据通信提供传送介质,为数据传送提供可靠得物理环境。
物理层就是PCIe体系结构最重要,也就是最难以实现得组成部分。
PCIe总线得物理层定义了LTSSM(LinkTrainingandStatusStateMachine)状态机,PCIe链路使用该状态机管理链路状态,并进行链路训练、链路恢复与电源管理。
PCIe总线得物理层还定义了一些专门得“序列”,有得书籍将物理层这些“序列”称为PLP(PhsicalLayerPacker),这些序列用于同步PCIe链路,并进行链路管理。
值得注意得就是PCIe设备发送PLP与发送TLP得过程有所不同。
对于系统软件而言,物理层几乎不可见,但就是系统程序员仍有必要较为深入地理解物理层得工作原理。
1、4PCIe链路得扩展
PCIe链路使用端到端得数据传送方式。
在一条PCIe链路中,这两个端口就是完全对等得,分别连接发送与接收设备,而且一个PCIe链路得一端只能连接一个发送设备或者接收设备。
因此PCIe链路必须使用Switch扩展PCIe链路后,才能连接多个设备。
使用Switch进行链路扩展得实例如图45所示。
在PCIe总线中,Switch[2]就是一个特殊得设备,该设备由1个上游端口与2~n个下游端口组成。
PCIe总线规定,在一个Switch中可以与RC直接或者间接相连[3]得端口为上游端口,在PCIe总线中,RC得位置一般在上方,这也就是上游端口这个称呼得由来。
在Switch中除了上游端口外,其她所有端口都被称为下游端口。
下游端口一般与EP相连,或者连接下一级Switch继续扩展PCIe链路。
其中与上游端口相连得PCIe链路被称为上游链路,与下游端口相连得PCIe链路被称为下游链路。
上游链路与下游链路就是一个相对得概念。
如上图所示,Switch与EP2连接得PCIe链路,对于EP2而言就是上游链路,而对Switch而言就是下游链路。
在上图所示得Switch中含有3个端口,其中一个就是上游端口(UpstreamPort),而其她两个为下游端口(DownstreamPort)。
其中上游端口与RC或者其她Switch得下游端口相连,而下游端口与EP或者其她Switch得上游端口相连。
在Switch中,还有两个与端口相关得概念,分别就是Egress端口与Ingress端口。
这两个端口与通过Switch得数据流向有关。
其中Egress端口指发送端口,即数据离开Switch使用得端口;Ingress端口指接收端口即数据进入Switch使用得端口。
Egress端口与Ingress端口与上下游端口没有对应关系。
在Switch中,上下游端口可以作为Egress端口,也可以作为Ingress端口。
如图45所示,RC对EP3得内部寄存器进行写操作时,Switch得上游端口为Ingress端口,而下游端口为Egress端口;当EP3对主存储器进行DMA写操作时,该Switch得上游端口为Egress端口,而下游端口为Ingress端口。
PCIe总线还规定了一种特殊得Switch连接方式,即Crosslink连接模式。
支持这种模式得Switch,其上游端口可以与其她Switch得上游端口连接,其下游端口可以与其她Switch得下游端口连接。
PCIe总线提供CrossLink连接模式得主要目得就是为了解决不同处理器系统之间得互连,如图46所示。
使用CrossLink连接模式时,虽然从物理结构上瞧,一个Switch得上/下游端口与另一个Switch得上/下游端口直接相连,但就是这个PCIe链路经过训练后,仍然就是一个端口作为上游端口,而另一个作为下游端口。
处理器系统1与处理器系统2间得数据交换可以通过Crosslink进行。
当处理器系统1
(2)访问得PCI总线域得地址空间或者RequesterID不在处理器系统1
(2)内时,这些数据将被Crosslink端口接收,并传递到对端处理器系统中。
Crosslink对端接口得P2P桥将接收来自另一个处理器域得数据请求,并将其转换为本处理器域得数据请求。
使用Crosslink方式连接两个拓扑结构完全相同得处理器系统时,仍然有不足之处。
假设图46中得处理器系统1与2得RC使用得ID号都为0,而主存储器都就是