棋子 · 3月4日

PCIe学习(五)

4 物理层逻辑子模块

4.1 介绍

物理层分为两部分,逻辑子块(Logical Sub-block)和电气子块(Electrical Sub-block)。

image.png

Image

逻辑子块负责与数据链路层连接,电气子块负责链路上的电气问题。与事务层和数据链路层一样,物理层在内部也分为发送和接收两个部分。

PCIe Gen 1的链路速率是2.5GT/s;Gen 2的链路速率是5.0GT/s;Gen 3的链路速率是8.0GT/s;从Gen 3往后,每一新版本的速率翻倍。

虽然在物理层上Gen 1/2和后面的版本差别较大。但是PCIe新版本需要向前兼容旧版本,而且PCIe的链路训练始终是从2.5GT/s开始,逐渐向上提高速率至链路两端支持的最高速率。比如,对于Gen 5,链路速率是从2.5GT/s -> 5GT/s -> 8GT/s -> 16GT/s -> 32GT/s。虽然在Gen 4开始支持旁路均衡(Bypass Equalization)功能,比如对与Gen 5允许链路训练2.5GT/s -> 5GT/s -> 32GT/s,但最初的速率依然是2.5GT/s。综上,物理层的学习有必要考虑Gen 1/2。

本章介绍逻辑子块,第八章介绍电气子块。

4.2 逻辑子块

逻辑子块有两个主要部分:发送部分,用于从数据链路层接收数据,以供电气子块传输;接收部分,用于在将接收信息传递到数据链路层。

当链路速率为2.5GT/s(Gen-1)或5.0GT/s(Gen-2)时,逻辑子块采用8b/10b编码;当链路速率为8GT/s(Gen-3)或者更高时,逻辑子块采用128b/130b编码。

在物理层逻辑子块的发送部分中,数据流向参考下图。流入的数据源有四个

  • TLP或DLLP
  • 控制字符,指示数据包的起始和结束标志
  • 逻辑空闲,当链路上没有数据传输,处于逻辑空闲状态时,为了防止链路接收端的PLL发生漂移,发送端需要在链路的所有Lane上持续发送逻辑空闲序列
  • 有续集,用于链路管理

Image

只有TLP和DLLP是从数据链路层传输过来的,需要保存在Tx Buffer中;其余三个源都是逻辑子块内部产生的。后面会介绍什么是控制字符,逻辑空闲,有续集。

接下来是字节条带化(Byte Stripping)。PCIe的一对收发链路称作一条Lane。虽然PCIe是串行总线,但协议允许链路上存在多Lane。比如x8表示该PCIe链路有8条Lane。对于多Lane的链路,逻辑子块会将TLP或者DLLP拆分成字节,然后按照顺序分配给每条Lane进行传输,这一拆分过程称作字节条带化。

Image

然后是数据加扰和编码过程。所谓加扰是将源数据流与一个随机序列异或后,再发送出去。此时被发出的数据流也基本是伪随机的,从而降低了发送数据时产生的EMI噪声。当链路速率为2.5GT/s(Gen-1)或8GT/s(Gen-2)时,逻辑子块采用8b/10b编码;当链路速率为8GT/s(Gen-3)或者更高时,逻辑子块采用128b/130b编码。实际上,128b/130b编码只是在原始的128-bit前面加上Sync Header,所以下图中Gen3 Scrambler后面没有画出编码模块。

这里需要注意,PCIe链路上不会传输时钟信号,链路的发送端将时钟信息隐藏在数据流中,而链路的接收端需要从数据流中提取出时钟信息,这一技术称为CDR(Clock Data Recovery)。原理其实不难理解,发送端的数据信号是随着时钟频率变化的,只要数据信号变化足够多(即连续1或者0的机率少且短),那么数据流是能够反应出时钟信息的。对于Gen1/2,逻辑子块的发送部分就是通过编码来完成数据流中加入时钟信息的,所以其数据流要先加扰再编码。反过来的话,编码过程的时钟信息就会被加扰过程破坏。但是对于Gen 3和后续版本,128b/130b并没有对数据进行编码,因此可能会存在连续0或者1的情况。为了解决这一问题,要通过加扰来完成。加扰的算法不展开了。对于多Lane情况,每条Lane可以用自己的加扰种子(Seed),以降低相邻Lane间的电气干扰。如果是x16或者x32,可以循环使用加扰种子,比如Lane 0/8/16用相同的种子,Lane 1/9/17用相同的种子,以此类推。对于有续集来说,PCIe协议规定了有续集的数据格式,已经考虑了消除连续0或1的情况。因此除了TS1和TS2,其它的有续集不用加扰。对于TS1和TS2,Symbol 0不会加扰,Symbol 1-13会加扰,Symbol 14-15是否加扰取决于扰码器逻辑。

最后,要对数据流做并串转换,将每条Lane对应并行的数据转换成串行数据发送出去。

逻辑子块的接收部分的数据流向刚好与发送部分反过来,先将接收到的串行数据流转成并行;然后做解码和解扰;再然后是字节反条带化,将所有Lane的字节数据组在一起,恢复出完整TLP和DLLP,保存在Rx Buffer中。

Image

4.2.1 编码(2.5 GT/s,5.0 GT/s)

4.2.1.1 字符编码(8b/10b)

在PCIe Gen-1/2中,采用8b/10b编码。在发送部分中,将从数据链路层传递过来的每8-bit编码成10-bit;相应的,接收部分需要将接收到的10-bit解码成8-bit。编码后的10-bit被称为一个字符(Symbol)。

Image

8b/10b编码是IBM公司发明的,其基本原理是将原始的8-bit拆分成3-bit和5-bit两部分,分别编码成4-bit和6-bit,即分别做3b/4b和5b/6b编码,最后合成10-bit。8b/10b编码的好处是:

  • 减少连续0或1的长度,有利于时钟恢复
  • 有利于直流均衡
  • 有利于错误检测

8b/10b编码具体原理略过。

在8b/10b编码中,有数字字符(Data Symbol)和控制字符(Control Symbol)之分,分别用D和K表示。所谓控制字符,是8b/10b编码方案提供的一些特殊字符,这些特殊字符用于后面会介绍的各种链路管理机制,也叫K字符。PCIe协议中使用的K字符如下表所示。

Image

8b/10b带来一个问题,就是链路利用效率不高,直接浪费了20%。

4.2.1.2 字符应用

字符有两种应用:一是构成有续集(Ordered Sets),二是构成TLP/DLLP。有续集和TLP/DLLP在multi-Lane链路上的发送规则不一样。

完整的有序集同时出现在multi-Lane链路的所有Lane上。

对于TLP和DLLP来说,会包含很多字符,形成一个字符流。某些K字符用于指示TLP或者DLLP的起始或停止边界,这些K字符也叫做“帧字符(Framing Symbol)”。SDP(K28.2)用于指示DLLP起始,STP(K27.7)用于指示TLP起始,END(K29.7)用于指示TLP或DLLP结束,EDB(K30.7)用于指示格式错误的TLP结束。

Image

对于multi-Lane链路来说,第一个字符放在Lane 0发送,第二个字符放在Lane 1发送,以此类推。

Image

4.2.1.3 数据加扰

在逻辑子块的发送部分中,要对数据进行加扰(scrambling),打乱原来的比特流;相应的在接收部分就要做解扰(de-scrambling)。

加扰的好处是降低EMI干扰。具体的加扰算法和规则就不介绍了。

4.2.2 编码(8.0 GT/s,及更高速率)

在PCIe Gen3和更高版本中,采用128b/130b编码。

4.2.2.1 Lane编码(128b/130b)

128b/130b编码的原理是在原始的每128-bit作为有效负载,前面加上2-bit的Sync Header。这个130b被称为一个“块(block)”。Sync Header为01b表示后面的128-bit是Ordered Sets;10b表示后面是数据(TLP,DLLP等);00b和11b是非法值。

Image

Image

所以在128b/130b编码中,一个字符是8-bit。

4.2.2.2 有续集块

有续集块是由Sync Header(01b)和有续集组成。有续集的第一个字符指明了该有续集的类型,随后的字符需要遵守该有续集类型的定义。关于有续集,会在后面详细说明。

Gen 3中的有续集包括:

  • SOS(Skip Ordered Set):
  • EIOS(Electrical Idle Ordered Set)
  • EIEOS(Electrical Idle Ordered Set)
  • TS1/TS2
  • FTS(Fast Training Sequence Ordered Sets)
  • SDS(Start of Data Stream Ordered Sets)

除了SOS外,其余有续集均为16-byte大小。下图左侧是FTS有续集的格式,右侧是有续集指示字符,也就是有续集中的第一个字符。

Image

与Gen 1/2中不同,Gen 3的发送端在发送数据流前,需要先发送SDS有续集,指示后面将开始发送数据流;在所有数据流发完后要有EDS令牌,表示数据发完了,随后发送的是EIOS或者EIEOS有续集。EDS令牌总是占据数据块的最后四个符号。例外情况是SOS(SKP),可以穿插在数据流中发送,用来做链路发送端与接收端的时钟偏差补偿。

4.2.2.3 数据块

数据块的有效负载是数据流,数据流包含帧令牌(Framing Tokens),TLP,DLLP。

Gen 3没有继续用8b/10b编码,因此也就没有控制字符。要是想在数据块中增加额外信息,就必然要定义一些特殊的数据结构,就是帧令牌,也可以简称令牌。在PCIe协议基础规范中,术语Framing Token和Token是一个意思。

帧令牌指定相关的字符数量,和下一个帧令牌的位置。帧令牌有以下五种:

Image

每种帧令牌的具体定义如下图。

Image

TLP或DLLP数据块的布局如下图所示。TLP数据块起始是4个字符的STP,然后是TLP,最后是4字符的LCRC。

Image

数据流的第一个帧令牌总是占用第一个数据块的Lane 0的Symbol 0中。下图是x8链路的示例,可以看到,STP占用Lane 0-3的Symbol 0。

Image

4.2.2.4 加扰

略过

4.2.2.5 预编码(Precoding)

接收端采用DFE(决策反馈均衡器)进行判决,在32 GT/s速率下比16 GT/s更容易发生连续突发错误(Burst Error)。为了减少Burst Error的发生,Gen 5速率下可以选配预编码(Precoding)。Precoding仅适用于32 GT/s及以上速率,其他速率时不开启。PCIe链路的Rx 通过EQ TS2请求Tx开启 Precoding。

Precoding可以把连续多比特的Burst Error拆分为2-bit的Entry Error及Exit Error,从而达到消除Burst Error的目的。对于单比特的突发错误,开启Precoding后会变成2-bit 错误,从而使系统误码率BER会提升为之前的两倍。

Precoding发生于Tx Scramble之后,Rx De-scramble之前。开启Precoding不会影响信号质量及完整性。

Image

4.2.2.6 128b/130b环回

环回用于测试和故障隔离。PCIe协议仅指定了进入环回模式和退出环回模式的行为,所有其他细节都是特定于实现的。

4.2.3 链路均衡(8.0 GT/s,及更高速率)

在PCIe链路传输中,由于电磁干扰,信号衰减失真或比特同步错误等原因,会改变数据流的比特数据,造成错误。比特出错概率(Bit Error Ratio,BER),是一个时间间隔内错误比特的数目与传送的总比特数的比值,通常以百分比表示。当BER过高,说明链路质量很差,可能会导致链路重新训练或者是链路不能正常工作。

在Gen 1/2中,使用固定的Tx去加重参数即可实现良好的信号质量。但是到了Gen 3,链路速率达到8GT/s,信号完整性问题变得严重。

链路均衡过程使组件能够在8.0GT/s和更高的数据速率下运行时,调整每个Lane的发射机和接收机设置,以提高信号质量。

链路均衡过程必须在第一次数据速率改变为8.0GT/s或更高的任何数据速率期间执行。如果链路上的组件不需要此过程,则需要在链路训练期间通过TS1/TS2有续集向对端组件公布此信息,从而绕过链路均衡过程。PCIe协议要求,当组件的物理层通知数据链路层其已准备好时(LinkUp=1),组件的物理层发射机参数必须提前设置好,也就是均衡过程完成。

概念介绍

在分析链路均衡之前,需要介绍几个概念。

为了实现更好的波形整形,PCIe协议规范要求发射机使用3抽头的FIR(有限脉冲响应)滤波器。

Image

FIR滤波器的三个输入可以通过它们的时间位置描述为“pre-cursor”C‐1、 “cursor”C0,“post-cursor”C+1,它们组合起来产生基于即将到来的输入、当前值,先前值的输出。调整抽头的系数可以使输出波得到最佳的整形。

滤波器根据分配给每个抽头的系数值(或抽头权重)对输出进行整形。三个系数幅度的绝对值之和是1,因此只需要给出其中的两个,就可以计算第三个。因此,规范中只给出了C-1和C+1,因此C0总是隐含的,并且总是正的。

Image

系数值的作用是调整输出电压,以创建多达四个不同的电压电平,以适应不同的信号环境。

下图显示了要传输的四种通用电压电平,它们是:maximum‐height (Vd),normal (Va),de‐emphasized (Vb),pre‐shoot (Vc)。

如果C-1和C+1都为0(C0为1.0),则Vc最大值就是信号的大小。

Image

当链路准备好从5.0GT/s变为8.0GT/s,下游端口DSP需要通过EQ TS2向上游端口USP发送一组预设值(preset)值,作为测试信号质量的起点。PCIe协议规范定义了11组预设值,如下图。

Image

如果使用预设值,链路的BER达到了10-12,则无需进一步训练。但是,如果BER过高,则使用均衡序列来微调系数设置,尝试不同的C‐1和C+1值并重新评估结果,并重复该序列直到达到所需的信号质量或错误率。

链路均衡阶段

链路均衡过程最多由四个阶段(Phase)组成,使用TS1有序集中的均衡控制(Equalization Control,EC)字段来传递Phase信息。

在PCIe协议规范中,使用下游端口和上游端口来分析链路均衡。如果理解不方便,可以将下游端口换成RC,上游端口换成EP,可能会更好理解下面的分析。

Phase 0

Phase 0,下游端口的LTSSM进入Recovery.RcvrCfg状态,通关EQ TS2向上游端口发送Tx Presets和Rx Hints。下游端口发送的Tx Presets值是基于自己的Equalization Control寄存器。需要注意的是,可能每条Lane的均衡值不同。下游端口将其Equalization Control寄存器中DSP值用于自己的发射机和接收机,将USP值发送给上游端口。

Image

Tx Preset字段的编码如下表:
image.png

Rx Hint字段的编码如下表:
image.png

一旦链路速率变化,下游端口开始进入Phase 1,发送TS1(EC=01b),等待上游端口也进入Phase 1。此时上游端口启动Phase 0,发送TS1与先前从EQ TS1和EQ TS2接收到的Preset值相呼应的TS1。上游端口使用下游端口请求的Tx Preset和Rx Hints。上游端口在评估输入信号之前可以等待500ns,但一旦能够识别出连续两个TS1,就可以为下一步做好准备,因为这意味着信号质量满足10-4的BER。随后,上游端口在其TS1中设置EC=01b,从而也进入第Phase 1,并将下一步的控制权交给下游端口。

Image

Phase 1

Phase 1同样的,下游端口识别出上游端口发出的连续两个TS1,意味着信号质量满足10-4的BER。一旦下游端口识别出上游端口发过来的TS1(EC=01b),确信链路工作良好,则Phase 1完成。下游端口通过设置其EC=10b启动Phase 2,并将下一步的控制权交给上游端口。当上游端口响应EC=10b时,两个端口都进入Phase 2。作为一个替代方案,下游端口如果确定信号质量已经足够好,不需要进一步调整,在这种情况下,它将其设置EC=00b直接退出均衡过程。

Image

Phase 2

Phase 2,上游端口可以请求下游端口设置其Tx参数,评估信号质量,并重复该过程,直到达到当前环境的最佳设置。为了进行请求,上游端口改变在其TS1中发送的均衡系数值,并根据接收到的下游端口的有续集评估链路质量。

Image

Image

Phase 3

Phase 3,下游端口通过发送EC=11b进行响应,现在可以对上游端口的发射机进行相同的信号评估过程。

Image

综上所述,Phase 0和1是对链路系数进行粗调,Phase 2和3是对链路系数进行细调。如果粗调就能满足链路BER要求,可以放弃Phase 2和3,直接退出链路均衡过程。

整个链路均衡过程在LTSSM状态机的Recovery状态控制下。

物理层是PCIe里面最复杂的,我的理解有限,估计有的地方理解不到位或者就错了,大家尽管指出,帮我提升,哈哈~~

【待续】

作者:老秦谈芯
文章来源:老秦谈芯

推荐阅读

更多 IC 设计干货请关注IC设计专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。

推荐阅读
关注数
21743
内容数
1339
主要交流IC以及SoC设计流程相关的技术和知识
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息