tag 标签: pcie总线

相关博文
  • 热度 24
    2013-5-23 11:58
    6184 次阅读|
    0 个评论
    PCIe总线作为处理器系统的局部总线,其作用与PCI总线类似,主要目的是为了连接处理器系统中的外部设备,当然PCIe总线也可以连接其他处理器系统。在不同的处理器系统中,PCIe体系结构的实现方法略有不同。但是在大多数处理器系统中,都使用了RC、Switch和PCIe-to-PCI桥这些基本模块连接PCIe和PCI设备。在PCIe总线中,基于PCIe总线的设备,也被称为EP(Endpoint)。 4.2.1 基于PCIe架构的处理器系统 在不同的处理器系统中,PCIe体系结构的实现方式不尽相同。PCIe体系结构以Intel的x86处理器为蓝本实现,已被深深地烙下x86处理器的印记。在PCIe总线规范中,有许多内容是x86处理器独有的,也仅在x86处理器的Chipset中存在。在PCIe总线规范中,一些最新的功能也在Intel的Chipset中率先实现。本节将以一个虚拟的处理器系统A和PowerPC处理器为例简要介绍RC的实现,并简单归纳RC的通用实现机制。 1 处理器系统A 在有些处理器系统中,没有直接提供PCI总线,此时需要使用PCIe桥,将PCIe链路转换为PCI总线之后,才能连接PCI设备。在PCIe体系结构中,也存在PCI总线号的概念,其编号方式与PCI总线兼容。一个基于PCIe架构的处理器系统A如图4‑7所示。 在上图的结构中,处理器系统首先使用一个虚拟的PCI桥分离处理器系统的存储器域与PCI总线域。FSB总线下的所有外部设备都属于PCI总线域。与这个虚拟PCI桥直接相连的总线为PCI总线0。这种架构与Intel的x86处理器系统较为类似。 在这种结构中,RC由两个FSB-to-PCIe桥和存储器控制器组成。值得注意的是在图4‑7中,虚拟PCI桥的作用只是分离存储器域与PCI总线域,但是并不会改变信号的电气特性。RC与处理器通过FSB连接,而从电气特性上看,PCI总线0与FSB兼容,因此在PCI总线0上挂接的是FSB-to-PCIe桥,而不是PCI-to-PCIe桥。 在PCI总线0上有一个存储器控制器和两个FSB-to-PCIe桥。这两个FSB-to-PCIe桥分别推出一个×16和×8的PCIe链路,其中×16的PCIe链路连接显卡控制器(GFX),其编号为PCI总线1;×8的PCIe链路连接一个Switch进行PCIe链路扩展。而存储器控制器作为PCI总线0的一个Agent设备,连接DDR插槽或者颗粒。 此外在这个PCI总线上还可能连接了一些使用“PCI配置空间”管理的设备,这些设备的访问方法与PCI总线兼容,在x86处理器的Chipset中集成了一些内嵌的设备。这些内嵌的设备使用均使用“PCI配置空间”进行管理,包括存储器控制器。 PCIe总线使用端到端的连接方式,因此只有使用Switch才能对PCIe链路进行扩展,而每扩展一条PCIe链路将产生一个新的PCI总线号。如图4‑7所示,Switch可以将1个×8的PCIe端口扩展为4个×2的PCIe端口,其中每一个PCIe端口都可以挂接EP。除此之外PCIe总线还可以使用PCIe桥,将PCIe总线转换为PCI总线或者PCI-X总线,之后挂接PCI/PCI-X设备。多数x86处理器系统使用这种结构连接PCIe或者PCI设备。 在PCIe总线规范中并没有明确提及PCIe主桥,而使用RC概括除了处理器之外的所有与PCIe总线相关的内容。在PCIe体系结构中,RC是一个很模糊也很混乱的概念。Intel使用PCI总线的概念管理所有外部设备,包括与这些外部设备相关的寄存器,因此在RC中包含一些实际上与PCIe总线无关的寄存器。使用这种方式有利于系统软件使用相同的平台管理所有外部设备,也利于平台软件的一致性,但是仍有其不足之处。 2 PowerPC处理器 PowerPC处理器挂接外部设备使用的拓扑结构与x86处理器不同。在PowerPC处理器中,虽然也含有PCI/PCIe总线,但是仍然有许多外部设备并不是连接在PCI总线上的。在PowerPC处理器中,PCI/PCIe总线并没有在x86处理器中的地位。在PowerPC处理器中,还含有许多内部设备,如TSEC(Three Speed Ethenet Controller)和一些内部集成的快速设备,与SoC平台总线直接相连,而不与PCI/PCIe总线相连。在PowerPC处理器中,PCI/PCIe总线控制器连接在SoC平台总线的下方。 Freescale即将发布的P4080处理器,采用的互连结构与之前的PowerPC处理器有较大的不同。P4080处理器是Freescale第一颗基于E500 mc内核的处理器。E500 mc内核与之前的E500 V2和V1相比,从指令流水线结构、内存管理和中断处理上说并没有本质的不同。E500mc内核内置了一个128KB大小的L2 Cache,该Cache连接在BSB总线上;而E500 V1/V2内核中并不含有L2 Cache,而仅含有L1 Cache而且与FSB直接相连。在E500mc内核中,还引入了虚拟化的概念。在P4080处理器中,一些快速外部设备,如DDR控制器、以太网控制器和PCI/PCIe总线接口控制器也是直接或者间接地连接到CoreNet中,在P4080处理器,L3 Cache也是连接到CoreNet中。P4080处理器的拓扑结构如图4‑8所示。 目前Freescale并没有公开P4080处理器的L1、L2和L3 Cache如何进行Cache共享一致性。多数采用CoreNet架构互连的处理器系统使用目录表法进行Cache共享一致性,如Intel的Nehelem EX处理器。P4080处理器并不是一个追求峰值运算的SMP处理器系统,而针对Data Plane的应用,因此P4080处理器可能并没有使用基于目录表的Cache一致性协议。在基于全互连网络的处理器系统中如果使用“类总线监听法”进行Cache共享一致性,将不利于多个CPU共享同一个存储器系统,在Cache一致性的处理过程中容易形成瓶颈。 如图4‑8所示,P4080处理器的设计重点并不是E500mc内核,而是CoreNet。CoreNet内部由全互连网络组成,其中任意两个端口间的通信并不会影响其他端口间的通信。与MPC8548处理器相同,P4080处理器也使用OceaN 结构连接PCIe与RapidIO接口。 在P4080处理器中不存在RC的概念,而仅存在PCIe总线控制器,当然也可以认为在P4080处理器中,PCIe总线控制器即为RC。P4080处理器内部含有3个PCIe总线控制器,如果该处理器需要连接更多的PCIe设备时,需要使用Switch扩展PCIe链路。 在P4080处理器中,所有外部设备与处理器内核都连接在CoreNet中,而不使用传统的SoC平台总线 进行连接,从而在有效提高了处理器与外部设备间通信带宽的同时,极大降低了访问延时。此外P4080处理器系统使用PAMU(Peripheral Access Management Unit)分隔外设地址空间与CoreNet地址空间。在这种结构下,10GE/1GE接口使用的地址空间与PCI总线空间独立。 P4080处理器使用的PAMU是对MPC8548处理器ATMU的进一步升级。使用这种结构时,外部设备使用的地址空间、PCI总线域地址空间和存储器域地址空间的划分更加明晰。在P4080处理器中,存储器控制器和存储器都属于一个地址空间,即存储器域地址空间。此外这种结构还使用OCeaN连接SRIO 和PCIe总线控制器,使得在OCeaN中的PCIe端口之间 可以直接通信,而不需要通过CoreNet,从而减轻了CoreNet的负载。 从内核互连和外部设备互连的结构上看,这种结构具有较大的优势。但是采用这种结构需要使用占用芯片更多的资源,CoreNet的设计也十分复杂。而最具挑战的问题是,在这种结构之下,Cache共享一致性模型的设计与实现。在Boxboro EX处理器系统中,可以使用QPI将多个处理器系统进行点到点连接,也可以组成一个全互连的处理器系统。这种结构与P4080处理器使用的结构类似,但是Boxboro EX处理器系统包含的CPU更多。 3 基于PCIe总线的通用处理器结构 在不同的处理器系统中,RC的实现有较大差异。PCIe总线规范并没有规定RC的实现细则。在有些处理器系统中,RC相当于PCIe主桥,也有的处理器系统也将PCIe主桥称为PCIe总线控制器。而在x86处理器系统中,RC除了包含PCIe总线控制器之外,还包含一些其他组成部件,因此RC并不等同于PCIe总线控制器。 如果一个RC中可以提供多个PCIe端口,这种RC也被称为多端口RC。如MPC8572处理器的RC可以直接提供3条PCIe链路,因此可以直接连接3个EP。如果MPC8572处理器需要连接更多EP时,需要使用Switch进行链路扩展。 而在x86处理器系统中,RC并不是存在于一个芯片中,如在Montevina平台中,RC由MCH和ICH两个芯片组成。本节并不对x86和PowerPC处理器使用的PCIe总线结构做进一步讨论,而只介绍这两种结构的相同之处。一个通用的,基于PCIe总线的处理器系统如图4‑9所示。 上图所示的结构将PCIe总线端口、存储器控制器等一系列与外部设备有关的接口都集成在一起,并统称为RC。RC具有一个或者多个PCIe端口,可以连接各类PCIe设备。PCIe设备包括EP(如网卡、显卡等设备)、Switch和PCIe桥。PCIe总线采用端到端的连接方式,每一个PCIe端口只能连接一个EP,当然PCIe端口也可以连接Switch进行链路扩展。通过Switch扩展出的PCIe链路可以继续挂接EP或者其他Switch。 4.2.2 RC的组成结构 RC是PCIe体系结构的一个重要组成部件,也是一个较为混乱的概念。RC的提出与x86处理器系统密切相关。事实上,只有x86处理器才存在PCIe总线规范定义的“标准RC”,而在多数处理器系统,并不含有在PCIe总线规范中涉及的,与RC相关的全部概念。 不同处理器系统的RC设计并不相同,在图4‑7中的处理器系统中,RC包括存储器控制器、两个FSB-to-PCIe桥。而在图4‑8中的PowerPC处理器系统中,RC的概念并不明晰。在 PowerPC处理器中并不存在真正意义上的RC,而仅包含PCIe总线控制器。 在x86处理器系统中,RC内部集成了一些PCI设备、RCRB(RC Register Block)和Event Collector等组成部件。其中RCRB由一系列“管理存储器系统”的寄存器组成,而仅存在于x86处理器中;而Event Collector用来处理来自PCIe设备的错误消息报文和PME消息报文。RCRB寄存器组属于PCI总线域地址空间,x86处理器访问RCRB的方法与访问PCI设备的配置寄存器相同。在有些x86处理器系统中,RCRB在PCI总线0的设备0中。 RCRB是x86处理器所独有的,PowerPC处理器也含有一组“管理存储器系统”的寄存器,这组寄存器与RCRB所实现的功能类似。但是在PowerPC处理器中,该组寄存器以CCSRBAR寄存器为基地址,处理器采用存储器映像方式访问这组寄存器。 如果将RC中的RCRB、内置的PCI设备和Event Collector去除,该RC的主要功能与PCI总线中的HOST主桥类似,其主要作用是完成存储器域到PCI总线域的地址转换。但是随着虚拟化技术的引入,尤其是引入MR-IOV技术之后,RC的实现变得异常复杂。 但是RC与HOST主桥并不相同,RC除了完成地址空间的转换之外,还需要完成物理信号的转换。在PowerPC处理器的RC中,来自OCeaN或者FSB的信号协议与PCIe总线信号使用的电气特性并不兼容,使用的总线事务也并不相同,因此必须进行信号协议和总线事务的转换。 在P4080处理器中,RC的下游端口可以挂接Switch扩展更多的PCIe端口,也可以只挂接一个EP。在P4080处理器的RC中,设置了一组Inbound和Outbound寄存器组,用于存储器域与PCI总线域之间地址空间的转换;而P4080处理器的RC还可以使用Outbound寄存器组将PCI设备的配置空间直接映射到存储器域中。PowerPC处理器在处理PCI/PCIe接口时,都使用这组Inbound和Outbound寄存器组。 在P4080处理器中,RC可以使用PEX_CONFIG_ADDR与PEX_CONFIG_DATA寄存器对 EP进行配置读写,这两个寄存器与MPC8548处理器HOST主桥的PCI_CONFIG_ADDR和PCI_CONFIG_DATA寄存器类似,本章不再详细介绍这组寄存器。 而x86处理器的RC设计与PowerPC处理器有较大的不同,实际上和大多数处理器系统都不相同。x86处理器赋予了RC新的含义,PCIe总线规范中涉及的RC也以x86处理器为例进行说明,而且一些在PCIe总线规范中出现的最新功能也在Intel的x86处理器系统中率先实现。在x86处理器系统中的RC实现也比其他处理器系统复杂得多。深入理解x86处理器系统的RC对于理解PCIe体系结构非常重要。 4.2.3 Switch 本篇在第4.1.4节,简单介绍了在PCIe总线中,如何使用Switch进行链路扩展,本节主要介绍Switch 的内部结构。从系统软件的角度上看,每一个PCIe链路都占用一个PCI总线号,但是一条PCIe链路只能连接一个PCI设备,Switch、EP或者PCIe桥片。PCIe总线使用端到端的连接方式,一条PCIe链路只能连接一个设备。 一个PCIe链路需要挂接多个EP时,需要使用Switch进行链路扩展。一个标准Switch具有一个上游端口和多个下游端口。上游端口与RC或者其他Switch的下游端口相连,而下游端口可以与EP、PCIe-to-PCI-X/PCI桥或者下游Switch的上游端口相连。 PCIe总线规范还支持一种特殊的连接方式,即Crosslink连接方式。使用这种方式时,Switch的下游端口可以与其他Switch的下游端口直接连接,上游端口也可以其他Switch的上游端口直接连接。在PCIe总线规范中,Crosslink连接方式是可选的,并不要求PCIe设备一定支持这种连接方式。 在PCIe体系结构中,Switch的设计难度仅次于RC,Switch也是PCIe体系结构的核心所在。而从系统软件的角度上看,Switch内部由多个PCI-to-PCI桥组成,其中每一个上游和下游端口都对应一个虚拟PCI桥。在一个Switch中有多个端口,在其内部就有多少个虚拟PCI桥,就有多少个PCI桥配置空间。值得注意的是,在Switch内部还具有一条虚拟的PCI总线,用于连接各个虚拟PCI桥,系统软件在初始化Switch时,需要为这条虚拟PCI总线编号。Switch的组成结构如图4‑10所示。 Switch 需要处理PCIe总线传输过程中的QoS问题。PCIe总线的QoS要求PCIe总线区别对待优先权不同的数据报文,而且无论PCIe总线的某一个链路多么拥塞,优先级高的报文,如等时报文(Isochronous Packet)都可以获得额定的数据带宽。而且PCIe总线需要保证优先级较高的报文优先到达。PCIe总线采用虚拟多通路VC技术 ,并在这些数据报文设定一个TC(Traffic Class)标签,该标签由3位组成,将数据报文根据优先权分为8类,这8类数据报文可以根据需要选择不同的VC进行传递。 在PCIe总线中,每一条数据链路上最多可以支持8个独立的VC。每个VC可以设置独立的缓冲,用来接收和发送数据报文。在PCIe体系结构中,TC和VC紧密相连,TC与VC之间的关系是“多对一”。 TC可以由软件设置,系统软件可以选择某类TC由哪个VC进行传递。其中一个VC可以传递TC不相同的数据报文,而TC相同的数据报文在指定一个VC传递之后,不能再使用其他VC。在许多处理器系统中,Switch和RC仅支持一个VC,而x86处理器系统和PLX的Switch中可以支持两个VC。 下文将以一个简单的例子说明如何使用TC标签和多个VC,以保证数据传送的服务质量。我们将PCIe总线的端到端数据传递过程模拟为使用汽车将一批货物从A点运送到B点。如果我们不考虑服务质量,可以采用一辆汽车运送所有这些货物,经过多次往返就可以将所有货物从A点运到B点。但是这样做会耽误一些需要在指定时间内到达B点的货物。有些货物,如一些急救物资、EMS等其他优先级别较高的货物,必须要及时地从A点运送到B点。这些急救物资的运送应该有别于其他普通物资的运送。 为此我们首先将不同种类的货物进行分类,将急救物资定义为TC3类货物,EMS定义为TC2类货物,平信定义为TC1类货物,一般包裹定义为TC0类货物,我们最多可以提供8种TC类标签进行货物分类。 之后我们使用8辆汽车,分别是VC0~7运送这些货物,其中VC7的速度最快,而VC0的速度最慢。当发生堵车事件时,VC7优先行驶,VC0最后行驶。然后我们使用VC3运送急救物资,VC2运送EMS,VC1运送平信,VC0运送包裹,当然使用VC0同时运送平信和包裹也是可以的,但是平信或者包裹不能使用一种以上的汽车运送,如平信如果使用了VC1运输,就不能使用VC0。因为TC与VC的对应关系是“多对一”的关系。 采用这种分类运输的方法,我们可以做到在A点到B点带宽有限的情况下,仍然可以保证急救物资和EMS可以及时到达B点,从而提高了服务质量。 PCIe总线除了解决数据传送的QoS问题之外,还进一步考虑如何在链路传递过程中,使用流量控制机制防止拥塞。 在PCIe体系结构中,Switch处于核心地位。PCIe总线使用Switch进行链路扩展,在Switch中,每一个端口对应一个虚拟PCI桥。深入理解PCI桥是理解Switch软件组成结构的基础。目前PCIe总线提出了MRA-Switch的概念,这种Switch与传统Switch有较大的区别。 4.2.4 VC和端口仲裁 在Switch中存在多个端口,其中来自不同Ingress端口的报文可以发向同一个Egress端口,因此Switch必须要解决端口仲裁和路由选径的问题。所谓端口仲裁指来自不同Ingress端口的报文到达同一个Egress端口的报文通过顺序,端口仲裁机制如图4‑11所示。 在一个Switch中设有仲裁器,该仲裁器规定了数据报文通过Switch的规则。在PCIe总线中存在两种仲裁机制,分别是基于VC和基于端口的仲裁机制。端口仲裁机制主要针对RC和Switch,当多个Ingress端口需要向同一个Egress端口发送数据报文时需要进行端口仲裁。具体地讲,在PCIe体系结构中有三个端口,需要进行端口仲裁。 Switch的Egress端口。当EP A和EP B同时访问EP C,D或者DDR-SDRAM时,需要通过Switch的Egress端口C。此时Switch需要进行端口仲裁确定是EP A的数据报文还是EP B的数据报文优先通过Egress端口C。 多端口RC的Egress端口。当RC的端口1和端口3同时访问Endpoint C时,RC的端口2需要进行端口仲裁,决定来自RC哪个端口的数据可以率先通过。 RC通往主存储器的端口。当RC的端口1、端口2和端口3同时访问DDR控制器时,这些数据报文将通过RC的Egress端口4,此时需要进行端口仲裁。 在PCIe体系结构中,链路的端口仲裁需要根据每一个VC独立设置,而且可以使用不同的算法进行端口仲裁。 下文以图4‑11中,Switch的两个Ingress端口A和B向Egress端口C发送数据报文为例,简要说明端口仲裁和VC仲裁的使用方法,其过程如图4‑12所示。 基于VC的仲裁是指发向同一个端口的数据报文,根据使用的VC而进行仲裁的方式。如上图所示,当来自端口B和端口A数据报文(分别使用VC0和VC1通路)在到达端口C之前,需要首先进行端口仲裁后,才能进行VC仲裁。PCIe总线规定了3种VC仲裁方式, 分别为Strict Priority,RR(Round Robin)和WRR(Weighted Round Robin)算法。 当使用Strict Priority仲裁方式时,发向VC7的数据报文具有最高的优先级,而发向VC0的数据报文优先级最低。PCIe总线允许对Switch或者RC的部分VC采用Strict Priority方式进行仲裁,而对其他VC采用RR和WRR算法,如VC7~4采用Strict Priority方式,而采用其他方式处理VC3~0。 使用RR方式时,所有VC具有相同的优先级,所有VC轮流使用PCIe链路。WRR方式与RR算法类似,但是可以对每一个VC进行加权处理,采用这种方式可以适当提高VC7的优先权,而将VC0的优先权适当降低。 我们假定Ingress端口A和Ingress B向Egress端口C进行数据传递时,使用两个VC通路,分别是VC0和VC1。其中标签为TC0~3的数据报文使用VC0传送,而标签为TC4~7数据报文使用VC1传送。 而数据报文在离开Egress端口C时,需要首先进行端口仲裁,之后再通过VC仲裁,决定哪个报文优先传送。数据报文从Ingress A/B端口发送到Egress C端口时,将按照以下步骤进行处理。 (1) 首先到达Ingress A/B端口的数据报文,将根据该端口的TC/VC映射表 决定使用该端口的哪个VC通道。如图4‑12所示,假设发向端口A的数据报文使用TC0~TC3,而发向端口B的数据报文使用TC0~TC7,这些数据报文在端口A中仅使用了VC0通道,而在端口B中使用了VC0和VC1两个通道。 (2) 数据报文在端口中传递时,将通过路由部件(Routing Logic),将报文发送到合适的端口。如图4‑12所示,端口C可以接收来自端口A或者B的数据报文。 (3) 当数据报文到达端口C时,首先需要经过TC/VC映射表,确定在端口C中使用哪个VC通路接收不同类型的数据报文。 (4) 对于端口C,其VC0通道可能会被来自端口A的数据报文使用,也可能会被来自端口B的数据报文使用。因此在PCIe的Switch中必须设置一个端口仲裁器,决定来自不同数据端口的数据报文如何使用VC通路。 (5) 数据报文通过端口仲裁后,获得VC通路的使用权之后,还需要经过Switch中的VC仲裁器,将数据报文发送到实际的物理链路中。 PCIe总线规定,系统设计者可以使用以下三种方式进行端口仲裁。 (1) Hardware-fixed仲裁策略。如在系统设计时,采用固化的RR仲裁方法。这种方法的硬件实现原理较为简单,此时系统软件不能对端口仲裁器进行配置。 (2) WRR仲裁策略,即加权的RR仲裁策略。 (3) Time-Based WRR仲裁策略,基于时间片的WRR仲裁策略,PCIe总线可以将一个时间段分为若干个时间片(Phase),每个端口占用其中的一个时间片,并根据端口使用这些时间片的多少对端口进行加权的一种方法。使用WRR和Time-Based WRR仲裁策略,可以在某种程度上提高PCIe总线的QoS。 PCIe设备的Capability寄存器规定了端口仲裁使用的算法。有些PCIe设备并没有提供多种端口仲裁算法,可能也并不含有Capability寄存器。此时该PCIe设备使用Hardware-fixed仲裁策略。 4.2.5 PCIe-to-PCI/PCI-X桥片 本篇将PCIe-to-PCI/PCI-X桥片简称为PCIe桥片。该桥片有两个作用。 将PCIe总线转换为PCI总线,以连接PCI设备。在一个没有提供PCI总线接口的处理器中,需要使用这类桥片连接PCI总线的外设。许多PowerPC处理器在提供PCIe总线的同时,也提供了PCI总线,因此PCIe-to-PCI桥片对基于PowerPC处理器系统并不是必须的。 将PCI总线转换为PCIe总线(这也被称为Reverse Bridge),连接PCIe设备。一些低端的处理器并没有提供PCIe总线,此时需要使用PCIe桥将PCI总线转换为PCIe总线,才能与其他PCIe设备互连。这种用法初看比较奇怪,但是在实际应用中,确实有使用这一功能的可能。本节主要讲解PCIe桥的第一个作用。 PCIe桥的一端与PCIe总线相连,而另一端可以与一条或者多条PCI总线连接。其中可以连接多个PCI总线的PCIe桥也被称为多端口PCIe桥。 PCIe总线规范提供了两种多端口PCIe桥片的扩展方法。多端口PCIe桥片指具有一个上游端口和多个下游端口的桥片。其中上游端口连接PCIe链路,而下游端口推出PCI总线,连接PCI设备。 目前虽然PCIe总线非常普及,但是仍然有许多基于PCI总线的设计,这些基于PCI总线的设计可以通过PCIe桥,方便地接入到PCIe体系结构中。目前有多家半导体厂商可以提供PCIe桥片,如PLX、NXP、Tundra和Intel。就功能的完善和性能而言,Intel的PCIe桥无疑是最佳选择,而PLX和Tundra的PCIe桥在嵌入式系统中得到了广泛的应用。 OCeaN是一个基于交叉矩阵的总线结构,连接在OCeaN中的外部设备可以直接通信,而不相互干扰。 这种方式也可以被认为是SoC平台总线从共享总线结构升级到Switch结构。 SRIO为串型RapidIO。 PCIe端口之间的直接通信过程也被称为Peer-to-Peer传送方式。 PCIe总线中的Switch与网络应用的Switch的功能并不相同,而与网络应用中的Route功能接近。 在PCIe体系结构中,RC和EP也需要处理QoS。 有关多通路VC的详细说明见第9章。 该表存在于PCI Express. Extended Capabilities结构中。
  • 热度 18
    2013-5-23 11:33
    3483 次阅读|
    0 个评论
    与PCI总线不同,PCIe总线使用端到端的连接方式,在一条PCIe链路的两端只能各连接一个设备,这两个设备互为是数据发送端和数据接收端。PCIe总线除了总线链路外,还具有多个层次,发送端发送数据时将通过这些层次,而接收端接收数据时也使用这些层次。PCIe总线使用的层次结构与网络协议栈较为类似。 4.1.1 端到端的数据传递 PCIe链路使用“端到端的数据传送方式”,发送端和接收端中都含有TX(发送逻辑)和RX(接收逻辑),其结构如图4‑1所示。 由上图所示,在PCIe总线的物理链路的一个数据通路(Lane)中,由两组差分信号,共4根信号线组成。其中发送端的TX部件与接收端的RX部件使用一组差分信号连接,该链路也被称为发送端的发送链路,也是接收端的接收链路;而发送端的RX部件与接收端的TX部件使用另一组差分信号连接,该链路也被称为发送端的接收链路,也是接收端的发送链路。一个PCIe链路可以由多个Lane组成。 高速差分信号电气规范要求其发送端串接一个电容,以进行AC耦合。该电容也被称为AC耦合电容。PCIe链路使用差分信号进行数据传送,一个差分信号由D+和D-两根信号组成,信号接收端通过比较这两个信号的差值,判断发送端发送的是逻辑“1”还是逻辑“0”。 与单端信号相比,差分信号抗干扰的能力更强,因为差分信号在布线时要求“等长”、“等宽”、“贴近”,而且在同层。因此外部干扰噪声将被“同值”而且“同时”加载到D+和D-两根信号上,其差值在理想情况下为0,对信号的逻辑值产生的影响较小。因此差分信号可以使用更高的总线频率。 此外使用差分信号能有效抑制电磁干扰EMI(Electro Magnetic Interference)。由于差分信号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总线规范所定义的总线频率和链路编码方式并不相同,如表4‑1所示。 表4‑1 PCIe总线规范与总线频率和编码的关系 PCIe总线规范 总线频率 单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链路上的10 bit中含有8 bit的有效数据;而V3.0规范使用128/130b编码方式,即在PCIe链路上的130 bit中含有128 bit的有效数据。 由上表所示,V3.0规范使用的总线频率虽然只有4GHz,但是其有效带宽是V2.x的两倍。下文将以V2.x规范为例,说明不同宽度PCIe链路所能提供的峰值带宽,如表4‑2所示。 表4‑2 PCIe总线的峰值带宽 PCIe总线的数据位宽 ×1 ×2 ×4 ×8 ×12 ×16 ×32 峰值带宽(GT/s) 5 10 20 40 60 80 160 由上表所示,×32的PCIe链路可以提供160GT/s的链路带宽,远高于PCI/PCI-X总线所能提供的峰值带宽。而即将推出的PCIe V3.0规范使用4GHz的总线频率,将进一步提高PCIe链路的峰值带宽。 在PCIe总线中,使用GT(Gigatransfer)计算PCIe链路的峰值带宽。GT是在PCIe链路上传递的峰值带宽,其计算公式为总线频率×数据位宽×2。 在PCIe总线中,影响有效带宽的因素有很多,因而其有效带宽较难计算,这部分内容详见第8.4.1节。尽管如此,PCIe总线提供的有效带宽还是远高于PCI总线。PCIe总线也有其弱点,其中最突出的问题是传送延时。 PCIe链路使用串行方式进行数据传送,然而在芯片内部,数据总线仍然是并行的,因此PCIe链路接口需要进行串并转换,这种串并转换将产生较大的延时。除此之外PCIe总线的数据报文需要经过事务层、数据链路层和物理层,这些数据报文在穿越这些层次时,也将带来延时。本书将在第8.4节详细讨论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(Clock Data Recovery),CDR将从接收报文中提取接收时钟,从而进行同步数据传递。 值得注意的是,在一个PCIe设备中除了需要从报文中提取时钟外,还使用了REFCLK+和REFCLK-信号对作为本地参考时钟,这个信号对的描述见下文。 4.1.2 PCIe总线使用的信号 PCIe设备使用两种电源信号供电,分别是Vcc与Vaux,其额定电压为3.3V。其中Vcc为主电源,PCIe设备使用的主要逻辑模块均使用Vcc供电,而一些与电源管理相关的逻辑使用Vaux供电。在PCIe设备中,一些特殊的寄存器通常使用Vaux供电,如Sticky Register,此时即使PCIe设备的Vcc被移除,这些与电源管理相关的逻辑状态和这些特殊寄存器的内容也不会发生改变。 在PCIe总线中,使用Vaux的主要原因是为了降低功耗和缩短系统恢复时间。因为Vaux在多数情况下并不会被移除,因此当PCIe设备的Vcc恢复后,该设备不用重新恢复使用Vaux供电的逻辑,从而设备可以很快地恢复到正常工作状状态。 PCIe链路的最大宽度为×32,但是在实际应用中,×32的链路宽度极少使用。在一个处理器系统中,一般提供×16的PCIe插槽,并使用PETp0~15、PETn0~15和PERp0~15、PERn0~15共64根信号线组成32对差分信号,其中16对PETxx信号用于发送链路,另外16对PERxx信号用于接收链路。除此之外PCIe总线还使用了下列辅助信号。 1 PERST#信号 该信号为全局复位信号,由处理器系统提供,处理器系统需要为PCIe插槽和PCIe设备提供该复位信号。PCIe设备使用该信号复位内部逻辑。当该信号有效时,PCIe设备将进行复位操作。PCIe总线定义了多种复位方式,其中Cold Reset和Warm Reset这两种复位方式的实现与该信号有关,详见第4.1.5节。 2 REFCLK+和REFCLK-信号 在一个处理器系统中,可能含有许多PCIe设备,这些设备可以作为Add-In卡与PCIe插槽连接,也可以作为内置模块,与处理器系统提供的PCIe链路直接相连,而不需要经过PCIe插槽。PCIe设备与PCIe插槽都具有REFCLK+和REFCLK-信号,其中PCIe插槽使用这组信号与处理器系统同步。 在一个处理器系统中,通常采用专用逻辑向PCIe插槽提供REFCLK+和REFCLK-信号,如图4‑2所示。其中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设备配置空间的Link Control Register中,含有一个“Common Clock Configuration”位。当该位为1时,表示该设备与PCIe链路的对端设备使用“同相位”的参考时钟;如果为0,表示该设备与PCIe链路的对端设备使用的参考时钟是异步的。 在PCIe设备中,“Common Clock Configuration”位的缺省值为0,此时PCIe设备使用的参考时钟与对端设备没有任何联系,PCIe链路两端设备使用的参考时钟可以异步设置。这个异步时钟设置方法对于使用PCIe链路进行远程连接时尤为重要。 在一个处理器系统中,如果使用PCIe链路进行机箱到机箱间的互连,因为参考时钟可以异步设置,机箱到机箱之间进行数据传送时仅需要差分信号线即可,而不需要参考时钟,从而极大降低了连接难度。 3 WAKE#信号 当PCIe设备进入休眠状态,主电源已经停止供电时,PCIe设备使用该信号向处理器系统提交唤醒请求,使处理器系统重新为该PCIe设备提供主电源Vcc。在PCIe总线中,WAKE#信号是可选的,因此使用WAKE#信号唤醒PCIe设备的机制也是可选的。值得注意的是产生该信号的硬件逻辑必须使用辅助电源Vaux供电。 WAKE#是一个Open Drain信号,一个处理器的所有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信号,提交唤醒请求。 4 SMCLK和SMDAT信号 SMCLK和SMDAT信号与x86处理器的SMBus(System Mangement Bus)相关。SMBus于1995年由Intel提出,SMBus由SMCLK和SMDAT信号组成。SMBus源于I2C总线,但是与I2C总线存在一些差异。 SMBus的最高总线频率为100KHz,而I2C总线可以支持400KHz和2MHz的总线频率。此外SMBus上的从设备具有超时功能,当从设备发现主设备发出的时钟信号保持低电平超过35ms时,将引发从设备的超时复位。在正常情况下,SMBus的主设备使用的总线频率最低为10KHz,以避免从设备在正常使用过程中出现超时。 在SMbus中,如果主设备需要复位从设备时,可以使用这种超时机制。而I2C总线只能使用硬件信号才能实现这种复位操作,在I2C总线中,如果从设备出现错误时,单纯通过主设备是无法复位从设备的。 SMBus还支持Alert Response机制。当从设备产生一个中断时,并不会立即清除该中断,直到主设备向0b0001100地址发出命令。 上文所述的SMBus和I2C总线的区别还是局限于物理层和链路层上,实际上SMBus还含有网络层。SMBus还在网络层上定义了11种总线协议,用来实现报文传递。 SMBus在x86处理器系统中得到了大规模普及,其主要作用是管理处理器系统的外部设备,并收集外设的运行信息,特别是一些与智能电源管理相关的信息。PCI和PCIe插槽也为SMBus预留了接口,以便于PCI/PCIe设备与处理器系统进行交互。 在Linux系统中,SMBus得到了广泛的应用,ACPI也为SMBus定义了一系列命令,用于智能电池、电池充电器与处理器系统之间的通信。在Windows操作系统中,有关外部设备的描述信息,也是通过SMBus获得的。 5 JTAG信号 JTAG(Joint Test Action Group)是一种国际标准测试协议,与IEEE 1149.1兼容,主要用于芯片内部测试。目前绝大多数器件都支持JTAG测试标准。JTAG信号由TRST#、TCK、TDI、TDO和TMS信号组成。其中TRST#为复位信号;TCK为时钟信号;TDI和TDO分别与数据输入和数据输出对应;而TMS信号为模式选择。 JTAG允许多个器件通过JTAG接口串联在一起,并形成一个JTAG链。目前FPGA和EPLD可以借用JTAG接口实现在线编程ISP(In-System Programming)功能。处理器也可以使用JTAG接口进行系统级调试工作,如设置断点、读取内部寄存器和存储器等一系列操作。除此之外JTAG接口也可用作“逆向工程”,分析一个产品的实现细节,因此在正式产品中,一般不保留JTAG接口。 6 PRSNT1#和PRSNT2#信号 PRSNT1#和PRSNT2#信号与PCIe设备的热插拔相关。在基于PCIe总线的Add-in卡中,PRSNT1#和PRSNT2#信号直接相连,而在处理器主板中,PRSNT1#信号接地,而PRSNT2#信号通过上拉电阻接为高。PCIe设备的热插拔结构如图4‑3所示。   如上图所示,当Add-In卡没有插入时,处理器主板的PRSNT2#信号由上拉电阻接为高,而当Add-In卡插入时主板的PRSNT2#信号将与PRSNT1#信号通过Add-In卡连通,此时PRSNT2#信号为低。处理器主板的热插拔控制逻辑将捕获这个“低电平”,得知Add-In卡已经插入,从而触发系统软件进行相应地处理。 Add-In卡拔出的工作机制与插入类似。当Add-in卡连接在处理器主板时,处理器主板的PRSNT2#信号为低,当Add-In卡拔出后,处理器主板的PRSNT2#信号为高。处理器主板的热插拔控制逻辑将捕获这个“高电平”,得知Add-In卡已经被拔出,从而触发系统软件进行相应地处理。 不同的处理器系统处理PCIe设备热拔插的过程并不相同,在一个实际的处理器系统中,热拔插设备的实现也远比图4‑3中的示例复杂得多。值得注意的是,在实现热拔插功能时,Add-in Card需要使用“长短针”结构。 如图4‑3所示,PRSNT1#和PRSNT2#信号使用的金手指长度是其他信号的一半。因此当PCIe设备插入插槽时,PRSNT1#和PRSNT2#信号在其他金手指与PCIe插槽完全接触,并经过一段延时后,才能与插槽完全接触;当PCIe设备从PCIe插槽中拔出时,这两个信号首先与PCIe插槽断连,再经过一段延时后,其他信号才能与插槽断连。系统软件可以使用这段延时,进行一些热拔插处理。 4.1.3 PCIe总线的层次结构 PCIe总线采用了串行连接方式,并使用数据包(Packet)进行数据传输,采用这种结构有效去除了在PCI总线中存在的一些边带信号,如INTx和PME#等信号。在PCIe总线中,数据报文在接收和发送过程中,需要通过多个层次,包括事务层、数据链路层和物理层。PCIe总线的层次结构如图4‑4所示。   PCIe总线的层次组成结构与网络中的层次结构有类似之处,但是PCIe总线的各个层次都是使用硬件逻辑实现的。在PCIe体系结构中,数据报文首先在设备的核心层(Device Core)中产生,然后再经过该设备的事务层(Transaction Layer)、数据链路层(Data Link Layer)和物理层(Physical Layer),最终发送出去。而接收端的数据也需要通过物理层、数据链路和事务层,并最终到达Device Core。 1 事务层 事务层定义了PCIe总线使用总线事务,其中多数总线事务与PCI总线兼容。这些总线事务可以通过Switch等设备传送到其他PCIe设备或者RC。RC也可以使用这些总线事务访问PCIe设备。 事务层接收来自PCIe设备核心层的数据,并将其封装为TLP(Transaction Layer Packet)后,发向数据链路层。此外事务层还可以从数据链路层中接收数据报文,然后转发至PCIe设备的核心层。 事务层的一个重要工作是处理PCIe总线的“序”。在PCIe总线中,“序”的概念非常重要,也较难理解。在PCIe总线中,事务层传递报文时可以乱序,这为PCIe设备的设计制造了不小的麻烦。事务层还使用流量控制机制保证PCIe链路的使用效率。有关事务层的详细说明见第6章。 2 数据链路层 数据链路层保证来自发送端事务层的报文可以可靠、完整地发送到接收端的数据链路层。来自事务层的报文在通过数据链路层时,将被添加Sequence Number前缀和CRC后缀。数据链路层使用ACK/NAK协议保证报文的可靠传递。 PCIe总线的数据链路层还定义了多种DLLP(Data Link Layer Packet),DLLP产生于数据链路层,终止于数据链路层。值得注意的是,TLP与DLLP并不相同,DLLP并不是由TLP加上Sequence Number前缀和CRC后缀组成的。 3 物理层 物理层是PCIe总线的最底层,将PCIe设备连接在一起。PCIe总线的物理电气特性决定了PCIe链路只能使用端到端的连接方式。PCIe总线的物理层为PCIe设备间的数据通信提供传送介质,为数据传送提供可靠的物理环境。 物理层是PCIe体系结构最重要,也是最难以实现的组成部分。PCIe总线的物理层定义了LTSSM(Link Training and Status State Machine)状态机,PCIe链路使用该状态机管理链路状态,并进行链路训练、链路恢复和电源管理。 PCIe总线的物理层还定义了一些专门的“序列”,有的书籍将物理层这些“序列”称为PLP(Phsical Layer Packer),这些序列用于同步PCIe链路,并进行链路管理。值得注意的是PCIe设备发送PLP与发送TLP的过程有所不同。对于系统软件而言,物理层几乎不可见,但是系统程序员仍有必要较为深入地理解物理层的工作原理。 4.1.4 PCIe链路的扩展 PCIe链路使用端到端的数据传送方式。在一条PCIe链路中,这两个端口是完全对等的,分别连接发送与接收设备,而且一个PCIe链路的一端只能连接一个发送设备或者接收设备。因此PCIe链路必须使用Switch扩展PCIe链路后,才能连接多个设备。使用Switch进行链路扩展的实例如图4‑5所示。   在PCIe总线中,Switch 是一个特殊的设备,该设备由1个上游端口和2~n个下游端口组成。PCIe总线规定,在一个Switch中可以与RC直接或者间接相连 的端口为上游端口,在PCIe总线中,RC的位置一般在上方,这也是上游端口这个称呼的由来。在Switch中除了上游端口外,其他所有端口都被称为下游端口。下游端口一般与EP相连,或者连接下一级Switch继续扩展PCIe链路。其中与上游端口相连的PCIe链路被称为上游链路,与下游端口相连的PCIe链路被称为下游链路。 上游链路和下游链路是一个相对的概念。如上图所示,Switch与EP2连接的PCIe链路,对于EP2而言是上游链路,而对Switch而言是下游链路。 在上图所示的Switch中含有3个端口,其中一个是上游端口(Upstream Port),而其他两个为下游端口(Downstream Port)。其中上游端口与RC或者其他Switch的下游端口相连,而下游端口与EP或者其他Switch的上游端口相连。 在Switch中,还有两个与端口相关的概念,分别是Egress端口和Ingress端口。这两个端口与通过Switch的数据流向有关。其中Egress端口指发送端口,即数据离开Switch使用的端口;Ingress端口指接收端口即数据进入Switch使用的端口。 Egress端口和Ingress端口与上下游端口没有对应关系。在Switch中,上下游端口可以作为Egress端口,也可以作为Ingress端口。如图4‑5所示,RC对EP3的内部寄存器进行写操作时,Switch的上游端口为Ingress端口,而下游端口为Egress端口;当EP3对主存储器进行DMA写操作时,该Switch的上游端口为Egress端口,而下游端口为Ingress端口。 PCIe总线还规定了一种特殊的Switch连接方式,即Crosslink连接模式。支持这种模式的Switch,其上游端口可以与其他Switch的上游端口连接,其下游端口可以与其他Switch的下游端口连接。 PCIe总线提供CrossLink连接模式的主要目的是为了解决不同处理器系统之间的互连,如图4‑6所示。使用CrossLink连接模式时,虽然从物理结构上看,一个Switch的上/下游端口与另一个Switch的上/下游端口直接相连,但是这个PCIe链路经过训练后,仍然是一个端口作为上游端口,而另一个作为下游端口。   处理器系统1与处理器系统2间的数据交换可以通过Crosslink进行。当处理器系统1(2)访问的PCI总线域的地址空间或者Requester ID不在处理器系统1(2)内时,这些数据将被Crosslink端口接收,并传递到对端处理器系统中。Crosslink对端接口的P2P桥将接收来自另一个处理器域的数据请求,并将其转换为本处理器域的数据请求。 使用Crosslink方式连接两个拓扑结构完全相同的处理器系统时,仍然有不足之处。假设图4‑6中的处理器系统1和2的RC使用的ID号都为0,而主存储器都是从0x0000-0000开始编址时。当处理器1读取EP2的某段PCI总线空间时,EP2将使用ID路由方式,将完成报文传送给ID号为0的PCI设备,此时是处理器2的RC而不是处理器1的RC收到EP2的数据。因为处理器1和2的RC使用的ID号都为0,EP2不能区分这两个RC。 由上所述,使用Crosslink方式并不能完全解决两个处理器系统的互连问题,因此在有些Switch中支持非透明桥结构。这种结构与PCI总线非透明桥的实现机制类似,本章对此不做进一步说明。 使用非透明桥仅解决了两个处理器间数据通路问题,但是不便于NUMA结构对外部设备的统一管理。PCIe总线对此问题的最终解决方法是使用MR-IOV技术,该技术要求Switch具有多个上游端口分别与不同的RC互连。目前PLX公司已经可以提供具有多个上游端口的Switch,但是尚未实现MR-IOV技术涉及的一些与虚拟化相关的技术。 即便MR-IOV技术可以合理解决多个处理器间的数据访问和对PCIe设备的配置管理,使用PCIe总线进行两个或者多个处理器系统间的数据传递仍然是一个不小问题。因为PCIe总线的传送延时仍然是制约其在大规模处理器系统互连中应用的重要因素。
  • 热度 23
    2013-5-13 12:16
    1218 次阅读|
    0 个评论
    随着现代处理器技术的发展,在互连领域中,使用高速差分总线替代并行总线是大势所趋。与单端并行信号相比,高速差分信号可以使用更高的时钟频率,从而使用更少的信号线,完成之前需要许多单端并行数据信号才能达到的总线带宽。 PCI 总线使用并行总线结构,在同一条总线上的所有外部设备共享总线带宽,而 PCIe 总线使用了高速差分总线,并采用端到端的连接方式,因此在每一条 PCIe 链路中只能连接两个设备。这使得 PCIe 与 PCI 总线采用的拓扑结构有所不同。 PCIe 总线除了在连接方式上与 PCI 总线不同之外,还使用了一些在网络通信中使用的技术,如支持多种数据路由方式,基于多通路的数据传递方式,和基于报文的数据传送方式,并充分考虑了在数据传送中出现服务质量 QoS (Quality of Service) 问题。