编辑
2024-03-05
记录知识
0

PCIE物理层-encoder

PCIE的物理层框图如下

image.png

对于PCIE的传输编码,如果在pcie1.0和pcie2.0,则使用8/10b的编码,如果是pcie3.0及以上,则使用128/130b传输编码

对于pcie3.0,默认是8GT/s,如果传输编码大于等于8GT/s,则默认使用128/130b编码,如果pcie3.0在L0状态,则默认是2.5GT/s传输,则此时使用8/10b编码。

8/10b编码

8/10b编码的作用是为了维持DC平衡,也就是电信号的0和1均匀分布(避免出现5个连续的1或0),8/10b的编码模型只在低于8GT/s下使用,故有必要介绍一下。8/10b的意义在于将8bit的信息按照3bit+5bit分割,填充成4bit+6bit作为10b使用。填充图解如下

image.png

这里填充还分为rd+和rd-模式。RD(running disparity),+/-是1的个数减去0的个数.默认选择rd-

其逻辑为,先默认按照rd-编码,如果是完美平衡码,则不变,如果不是,则转换极性作为rd+编码。 例如:D.x.3(011),其对应的4B码字有两种:1100和0011,此时RD为负,则取1100作为其对应的4B码字作为输出,发现是完美编码

再例如D.x.4(100),其对应的4B码字有两种:1101和0010,若此时RD为负,则取1101作为其对应的4B码字作为输出,但不是完美编码,1101的1的个数大于0的个数,则转换成相反极性,故转换极性为rd+,则默认编码为0010

如下图

image.png

对于特殊的符号编码,如下可知

image.png

上述举例

  • STP:在开始TLP包前,使用K27.7的符号作为STP符号
  • SDP:在开始DLLP包前,使用K28.2的符号作为SDP符号

具体图解如下:

对于TLP,包组成如下,这里物理层会在DLLP的TLP包上追加前缀符号STP和后缀符号END

image.png

对于DLLP,包组成如下,这里物理层会在DLLP的包上追加前缀符号SDP和后缀符号END

image.png

多lane数据的8/10b编码

如果是x1,则物理层按照上述编码即可,如下图

image.png

如果是x2,则数据是均匀分布,以TLP包为例,STP在lane0的开头,END在lane1的结束,如图

image.png

如果是x4,则如图

image.png

数据加扰

在8/10b的编码下,数据发送是先加扰在编码,数据接收是先解码在解扰。加扰解扰是通过LSFR(Linear Feedback Shift Registers)

LSFR计算方式不想明白,这里不介绍了。

128/130b编码

128/130b编码是在8GT/s速度以上,也就是pcie最后速度协商在pcie gen3以上启用。

128/130b的编码是在原128b上添加2b的头,H0和H1,类型如下:

  • 10b :代表是一个数据块
  • 01b :代表是一个Ordered Set块(有序设置块)

与8/10b不一样的是,在多lane的情况下,128/130b会在每个lane上传输H0/H1头,对于每个数据内容,按照小端方式存放

如下是1lane的传输方式

image.png

如下是4lane的传输方式

image.png

Ordered Set Blocks

在link training的阶段,可以通过特殊的有序集来判断块对齐,这个特殊的有序集就是电气空闲退出有序集(EIEOS),下面是通过EIEOS来判断对齐状态的逻辑

  • 未对齐阶段: 接收器在电气空闲后进入未对齐状态,例如刚进入128/130b编码或者退出低功耗状态,如果等待到下一个EIEOS,则进入对齐阶段
  • 对齐阶段: 接收器接收EIEOS和SDS(Start of Data Stream)有序集时进入对齐阶段,如果接收到SDS有序集,接收器进入锁定阶段,如果接收到00b或11b的header,则返回未对齐阶段
  • 锁定阶段: 这个阶段下,数据块将在SDS Ordered Set后正常发送。

Data Block

数据块由Framing Tokens 和 TLPS 和DLLPS组成,它以SDS Ordered Set开始,以SKP Ordered Set结束。

对于Framing Tokens主要有如下几类

image.png

  • IDL:没有TLPs和DLLPs或其他Framing Tokens传输时,传输此
  • SDP:开始DLLP包的Tokens,后面跟随DLLP包
  • STP:开始传输TLP包的Tokens,后面跟随12bit的TLP序列号,在后面是TLP包
  • EDB:End错误,用于确认之前的TLP包被取消
  • EDS:数据流结束,表示数据流结束,下一个块将是Ordered Set Block

上述几类令牌的具体格式如下所示

image.png

所以对于TLP和DLLP的整体包格式图如下

image.png

如上图,TLP包含STP+TLP Prefix(如有)+TLP Header+TLP Payload+TLP 摘要(如有)+LCRC。 如果一个TLP有3DW的Header,1DW的payload,不包括TLP摘要,则整体TLP的length的长度为6=1(Tokens)+0(TLP Prefix)+3(TLP Header)+1(Payload)+0(TLP digest)+1(LCRC)

对于DLLP则简单了,就是在DLLP上加上SDP的Token,即SDP+DLLP+CRC

对于x8的lane的pcie接口,总包数据传输如下所示

image.png

从上面可以知道,对每个lane,H0/H1都是存在的,而Tokens+TLP+DLLP则是均匀遍布在每个lane上。具体为:STP+TLP Header+TLP Payload+LCRC+SDP+DLLP+CRC+IDL+STP....

对于取消TLP是整包示例如下

image.png

这里值得注意的是,EDB的Tokens是作为TLP的扩展,它不计算在TLP的lenth字段中,所以TLP包在传输的过程中,会直接带一个EDB作为TLP的取消。

之前提到了SKP作为整个数据库的结束,故如下图展示带SKP Tokens的整包示例

image.png

可以看到,在EBS之后,新的包是10+SKP+SKP_END+LSFR。故SKP Ordered Set作为整个数据块的结束

数据加扰

通过LSFR加扰,在128b/130b下,前两位H0/H1不会被加扰,EIEOS Ordered Set,SDS,SKP, EIOS不会加扰,LSFR会在EIEOS发送后加扰(有效数据加扰),在EIEOS接收后解扰(接收器解扰数据)。

编辑
2024-03-05
记录知识
0

PCIE数据链路层-DLLPs

数据链路层在事务层下面,它封装了TLP数据包,并加上前缀和后缀,形成了DLLP包。如下是层级关系

image.png

DLLP包是完全由硬件完成的

数据链路状态机

数据链路状态机如下

image.png

DLLP

所有的DLLP包含1dword,前面8bit作为dllp的type,后面作为dllp的type的衍生字段。最后16bit作为crc校验,如下

image.png

这里关于dllp type的类型如下

image.png

所以根据不同类型的dllp的字段如下

ack/nak

image.png

InitFC1

image.png

InitFC2

image.png

UpdateFC*

image.png

PM_*

image.png

Vendor Specific

image.png

包装TLP

对于数据链路层,先发送了DLLP包出去,里面标明了DLLP的type和DLLP的type对应字段,再加上CRC。然后再发送TLP,这时候的TLP包会包装前缀和后缀,用作标明TLP包的序列号以及TLP的LCRC校验,也就是如下

image.png

这里的Sequence ID 和LCRC是对TLP的封装。

所以数据链路层的通信流程如下

image.png

这里A是发送者,B是接收者,A会发送TLP包给B,所以B会发送ACK/NAK的DLLP给A接收,这里的DLLP就包含两个部分,一个是1dword+16bit crc的DLLP,一个是包装TLP包加上Sequence和LCRC的完整TLP包。

DLLP发送接收流程

上面已经知道DLLP包括自定义的DLLP字段以及会在TLP添加前缀和后缀。这里根据文档描述,讲述DLLP的发送和接收流程

TLP发送流程

image.png

NEXT_TRANSMIT_SEQ:存放下一个待发TLP包的序列号,TLP包前缀。 AckNak_Seq_Num:DLLP的ACK/NAK字段,存放最后成功接收TLP的序列号 ACKD_SEQ:存放最近收到的序列号(从DLLP的ACK/NAK返回)

所以先判断下一个待发TLP的序列号,不能大于总Counter(4096)的一半。 如果ACKD_SEQ(存放的序列号)和AckNak_Seq_Num(DLLP的ACK/NAK)不相等,则意味着上一次的包发送成功,开始发下一个包,则清空原来的retry buffer,将新的包的序列号加载到ACKD_SEQ,开始发送,如果接收到ACK,则成功,如果为NAK,则重发。

TLP接收流程

image.png

将NEXT_RCV_SEQ:这里是一个计数器,对TLP包计数加1,用来判断NEXT_TRANSMIT_SEQ和自己是否相等

先计算收到的TLP包的LCRC值,然后判断物理层确定TLP是否有效,再获取这次接收到的TLP包的DLLP的后缀LCRC,判断自己计算的LCRC和DLLP的LCRC是否匹配,最后判断当前TLP包的序列号是否等于NEXT_RCV_SEQ,如果等于,将NEXT_RCV_SEQ自增加1,开始处理TLP包,发送ACK,否则发送NAK。

编辑
2024-03-01
记录知识
0

PCIE事务层-消息请求

消息请求主要传递如下信号:

  • INTx中断信号
  • 电源管理
  • 错误信号
  • 锁定事务支持
  • slot电源限制支持
  • Vendor-Defined信息
  • LTR(延迟容忍报告)
  • OBFF(buffer刷新和填充的优化信息)
  • DRS
  • FRS
  • PTM

对于一个消息请求,格式如下所示

image.png

对于上面header内的type域的[2:0]代表了消息路由类型如下:

image.png

INTx中断信号

MSI/MSI-X是PCIE首选的中断信号机制,中断消息的length字段是reserved的,有如下8种中断消息

image.png

image.png

电源管理信号

image.png

错误信号消息

image.png

锁定事务

image.png

槽位电源限制

限制下游端口的电源大小 image.png

Vendor-Defined信息

image.png

image.png

LTR(Latency Tolerance Reporting)

延迟容忍上报信息用于上报设备对读写服务消息的容忍度

image.png

OBFF信息

OBFF是向EP设备上报平台的中心资源情况

image.png

PTM信息

Precision Time Measurement,高精度时间测量

image.png

image.png

编辑
2024-02-29
记录知识
0

PCIE事务层-tlp事务层描述符

描述符通过三个部分组成,事务ID,属性域,TC域。如下图

image.png

Transaction ID

由上可以知道,事务ID是以一个16位的的requester ID和一个8位的tag组成。 这是由请求者的BDF,Bus Number[7:0]、Device Number[4:0]、Function Number[2:0]组成的信息。 对于post请求,仅发送bdf作为requester id即可,对于non-posted请求,还需要tag字段,

attributes

这里之前有提到,对于attr[2]和attr[1:0]定义如下

image.png

对于bit1和bit2,有四种模式为,1.pci强排序模式,2.轻松排序模式,3.基于ID的排序模式,4.轻松排序或ID排序,如下

image.png

对于bit0,选择是否cache一致性。0是默认一致,1可不一致,如下图

image.png

tc

tc作为流量控制,之前也提到过,000为默认不控制,001-111按照优先级做流控

image.png

编辑
2024-02-28
记录知识
0

PCIE事务层-tlp路由寻址

tlp有三种方式路由,Address方式,ID方式和implicit(隐式) address和id是常用路由方式,implicit仅用作message request的type tlp包的路由,这里描述一下address和id。

地址路由

address 路由用作memory和io类型,如果是64位地址则header是4dword,32位地址则是3dword,如下

image.png

对于地址路由时,header的1dword的at字段在memory read/write和atomicOp请求时有效,其他tlp类型时,at字段保留。如下

image.png

也就是:00b=未转换的地址,01b=地址转换请求,10b=已转换的地址,11b=预留

如果存在转换的地址,则地址映射关系,体现在header域的byte8-byte15上,如下图所示

image.png

值得注意的是,对于4g以下的地址,请求必须以32位的格式。

ID路由

id路由通常作为配置请求,ID Routed Message和Completions。对于header中,需要定义Vendor_Defined Messages作为ID。

id路由通过BDF(Bus,Device,Function Numbers)来明确TLP的目的地址

对于ari和非ari设备,id路由的header域值如下

image.png

如果是4dword的tlp header,id路由的header布局如下.(不同字节的header由tlp的类型决定)

image.png

如果是3dword的tlp header,id路由的header布局如下

image.png

这里可以从byte8和byte9来确定BDF值作为id路由的依据

First/Last DW Byte

对于header的byte7,有两个字段,last dw/1st dw。它与byte2和byte3的length[9:0]有一定关系:

  • 如果length的长度是大于1dword,则1st的值不能为0000,last的值也不能为0000
  • 如果length的长度等于1字节,则last的值必须是0000