PCIE系统标准体系结构解读(四):体系结构概述之处理层数据包
1.4.1 TLP 的结构
通用 TLP 头的格式:下图展示了一个 3DW 头的格式内容。
头字段 |
头位置 |
字段用途 |
Lenth[9:0] |
字节3的7:0 字节2的1:0 |
TLP 数据有效载荷的传送大小,以DW为单位,最大为 1024 DW。编码:00 0000 0001b = 1DW;00 0000 0010b = 2DW;…;11 1111 1111b = 1023DW;00 0000 0000b = 1024W |
Attr |
字节2的比特5:4 |
bit5:灵活的顺序,设置为1时,对于此TLP,允许使用PCI-X的灵活顺序。设置为0,则使用PCI的严格顺序。 bit4:不侦测,设置为1时,表明请求者对于此TLP不存在主机缓存一致性的问题。引起处理器缓存侦测一致性不需要系统硬件,设置为0时,要求进行PCI类型的缓存侦测保护 |
EP(中毒数据) |
字节2的比特6 |
设置为1时,尽管允许正常完成事务,但伴随此数据应该是被认为时无效的 |
TD(摘要字段存在) |
字节2的比特7 |
如果设置为1,可选的一个双字的TLP摘要字段要包含在TLP中,而且该TLP包含ECRC值。 |
TC(流量类别)[2:0] |
字节1的比特6:4 |
000b=流量类别0(默认) 111b=流量类别7 |
Tpye[4:0](类型) |
字节0 的比特4:0 |
编码此TLP使用的事务变体。类型字段和Fmt[1:0]字段用来指定事务的类型、头的大小、数据有效载荷是否存在等。 |
Fmt[1:0](格式) |
字节0的比特6:5 |
编码有关头大小以及数据有效载荷是否该TLP的一部分等信息:00b-3DW头,没有数据;01b-4DW,没有数据;10b-3DW头,有数据;11b-4DW头,有数据 |
第一个DW字节允许 |
字节7的比特3:0 |
这4个比特一对一映射到有效载荷第一个双字中的各字节。 比特3=1:第一个双字中的字节3有效,否则无效; 比特2=1:第一个双字中的字节2有效,否则无效; 比特1=1:第一个双字中的字节1有效,否则无效; 比特0=1:第一个双字中的字节0有效,否则无效。 |
最后一个DW字节允许 |
字节7的比特7:4 |
这4个比特一对一映射到有效载荷最后一个双字中的各字节。 比特3=1:最后一个双字中的字节3有效,否则无效; 比特2=1:最后一个双字中的字节2有效,否则无效; 比特1=1:最后一个双字中的字节1有效,否则无效; 比特0=1:最后一个双字中的字节0有效,否则无效。 |
1.4.2 头类型/格式字段的编码
1.4.3 事务描述符字段
1.4.4 IO 请求
字段名 |
头字节/比特 |
用途 |
Lenth[9:0] |
字节3的比特7:0 字节2的比特1:0 |
DW为单位,数据有效载荷的大小。对于IO请求,这个字段总为1。 |
Attr[1:0] |
字节2的比特5:4 |
属性1:灵活的顺序比特 属性0:不侦测比特 IO请求中,总为0 |
EP |
字节2的比特6 |
为1时表明数据有效载荷中毒 |
TD |
字节2的比特7 |
如果为1,表明存在摘要字段(1DW) |
TC[2:0] |
字节2的比特6:4 |
数据包的传送类别。IO请求,TC=0 |
Type[4:0] |
字节0的比特4:0 |
TLP数据包的类型字段。对于IO请求总设置为00010b |
Fmt[1:0] |
字节0的比特6:5 |
00b-IO读;10b-IO写 |
Byte count[3:0] |
字节7的比特3:0 |
第一个双字的字节允许,对于IO请求,任意的比特组合都有效 |
Byte count[7:4] |
字节7的比特7:4 |
最后一个双字的字节允许,对于IO请求,这些比特必须为0000b |
标记[7:0] |
字节6的比特7:0 |
这些比特用来标识请求者发出的每一个未完成的请求,如果发送的是非报告请求,则分配下一个连续的标志。默认情况:只使用比特4:0;如果控制寄存器中的扩展标记比特置1,则可以使用全部8个比特 |
Requester ID[15:0] |
字节5的比特7:0;字节4的比特7:0 |
识别请求者,以便返回完成数据包等。 字节4-7:0:总线号 字节5-7:3:设备号 字节5-2:0:功能号 |
Address[31:2] |
字节8的比特7:2;字节7,6,5,的比特7:0 |
IO传送的32比特起始地址的高30比特。最低两位保留(00b),强制起始地址为DW对齐 |
1.4.5 存储器请求
PCIe 存储器事务包括两大类:读请求/完成和写请求。当请求存储器数据传送时,决不允许存储器事务跨 4KB 边界。
3DW 和 4DW 头之间的差别在于起始地址字段的位置和大小:对于 3DW 头,地址比特 31:2 在字节 8~11 中,字节 12 ~ 15 没用。对于 4DW 头,地址比特 31:2 在字节12 ~ 15 中,地址比特 63:32 在字节8~11 中。
4DW 存储器请求头字段
字段名 |
头字节/比特 |
功能 |
长度[9:0] |
字节3的比特7:0 字节2的比特1:0 |
TLP 数据有效载荷传送大小 |
属性 |
字节2的比特5:4 |
bit5:灵活的顺序 bit4:不侦测 |
EP |
字节2的比特6 |
中毒数据 |
TD(摘要) |
字节2的比特7 |
设置为1时,一个可选的双字摘要字段包含在此TLP中 |
TC |
字节1的比特6:4 |
000b-流量类别0 111b-流量类别7 |
类型[4:0] |
字节0的比特4:0 |
类别字段 00000b-存储器读或写 00001b-存储器读锁定 |
格式[1:0] |
字节0的比特6:5 |
00b-3DW存储器读 10b-3DW存储器写 01b-4DW存储器读 11b-4DW存储器写 |
第一个DW BE[3:0] |
字节7的比特3:0 |
|
最后一个DW BE[3:0] |
字节7的比特7:4 |
|
标记7:0 |
字节6的比特7:0 |
|
请求者ID[15:0] |
字节5的比特7:0 字节4的比特7:0 |
字节4-7:0:总线号 字节5-7:3:设备号 字节5-2:0:功能号 |
地址[31:2] |
字节15的比特7:2 字节14的比特7:0 字节13的比特7:0 |
|
地址[63:32] |
字节11的比特7:2 字节10的比特7:0 字节9的比特7:0 字节8的比特7:0 |
|
1.4.6 配置请求
字段名 |
头字节/比特 |
功能 |
长度[9:0] |
字节3的比特7:0 字节2的比特1:0 |
这一字段总为1 |
属性[1:0] |
字节2的比特5:4 |
bit5:灵活的顺序 bit4:不侦测 |
EP |
字节2的比特6 |
中毒数据 |
TD(摘要) |
字节2的比特7 |
设置为1时,一个可选的双字摘要字段包含在此TLP中 |
TC |
字节1的比特6:4 |
TC=0 |
类型[4:0] |
字节0的比特4:0 |
类别字段 00100b-类型0配置请求 00101b-类型1配置请求 |
格式[1:0] |
字节0的比特6:5 |
00b-3DW配置读 10b-3DW配置写 |
第一个DW BE[3:0] |
字节7的比特3:0 |
|
最后一个DW BE[3:0] |
字节7的比特7:4 |
0000b |
标记7:0 |
字节6的比特7:0 |
|
请求者ID[15:0] |
字节5的比特7:0 字节4的比特7:0 |
字节4-7:0:总线号 字节5-7:3:设备号 字节5-2:0:功能号 |
寄存器数号 |
字节11的比特7:2 |
配置空间偏移量的低6比特 |
扩展寄存器数号 |
字节10比特3:0 |
配置空间偏移量的高端4比特 |
完成者ID[15:0] |
字节9的比特7:0 字节8的比特7:0 |
字节8-7:0:总线号 字节9-7:3:设备号 字节9-2:0:功能号 |
1.4.7 完成
完成在以下每个非报告事务请求后返回:存储器读请求可能导致带数据的完成;IO读请求可能导致带或不带数据的完成;IO写请求可能导致没有数据的完成;配置读请求可能导致带数据的完成;配置写请求可能到时没有数据的完成。
字段名 |
头字节/比特 |
功能 |
长度[9:0] |
字节3的比特7:0 字节2的比特1:0 |
这一字段总为1 |
属性[1:0] |
字节2的比特5:4 |
bit5:灵活的顺序 bit4:不侦测 |
EP |
字节2的比特6 |
中毒数据 |
TD(摘要) |
字节2的比特7 |
设置为1时,一个可选的双字摘要字段包含在此TLP中 |
TC |
字节1的比特6:4 |
TC=0 |
类型[4:0] |
字节0的比特4:0 |
类别字段 00100b-类型0配置请求 00101b-类型1配置请求 |
格式[1:0] |
字节0的比特6:5 |
00b-3DW配置读 10b-3DW配置写 |
字节计数 |
字节7的比特7:0 字节6的比特3:0 |
读请求结束之前的剩余字节数。 |
BCM(修改的字节计数) |
字节6的比特4 |
只能由PCI-X完成者设置为1。表示字节数字段能够反映第一次传输的有效载荷,而不是剩余的总有效载荷。 |
CS[2:0](完成者状况代码) |
字节6的比特7:5 |
由完成者对这些比特编码表示成功实现请求。 000b-成功完成SC 001b-不支持的请求UR 010b-配置请求重试状态CR,S 100b-完成者终止CA |
完成者ID[15:0] |
字节5比特7:0 字节4比特7:0 |
标识完成者。尽管路由完成数据包不需要这一信息,但在调试总线流量时,这一信息可能非常有用。 字节4-7:0:完成者总线号 字节5-7:3:完成者设备号 字节5-2:0:完成者的功能号 |
低地址[6:0] |
字节11比特6:0 |
一次读操作返回数据的第一个允许字节的地址的地段7比特。可以由请求数据包中的长度和字节允许来计算,常用来确定下以合法读完成的边界。 |
标记[7:0] |
字节10波特7:0 |
设置这些比特以反映接收的请求标记,请求者使用这一字段将入站的完成数据包与未完成的请求关联起来。 |
请求者ID[15:0] |
字节9的比特7:0 字节8的比特7:0 |
从请求中复制此字段,用来路由完成数据包返回原请求者。 字节4-7:0:请求者总线号 字节5-7:3:请求者设备号 字节5-2:0:请求者功能号 |
1.4.8 消息请求
消息请求可以代替早期总线协议使用的中断、错误和电源管理等边带信号。所有消息请求都使用 4DW 头格式,并且处理消息请求的过程与处理存储器写事务基本相同。消息可以使用地址、ID或隐式路由方法来路由。数据包头中的路由子字段表示应用的路由方法,以及另外在使用哪些头寄存器。
字段名 |
头字节/比特 |
功能 |
长度[9:0] |
字节3的比特7:0 字节2的比特1:0 |
这一字段总为0或1 |
属性[1:0] |
字节2的比特5:4 |
bit5:灵活的顺序 bit4:不侦测 |
EP |
字节2的比特6 |
中毒数据 |
TD(摘要) |
字节2的比特7 |
设置为1时,一个可选的双字摘要字段包含在此TLP中 |
TC |
字节1的比特6:4 |
TC=0 |
类型[4:0] |
字节0的比特4:0 |
类别字段 bit4:3-10b=Msg bit2:0(消息路由子字段) 000b-路由至根联合体 001b-根据地址路由 010b-根据ID路由 011b-根联合体广播Msg 100b-本地,终止于接收器 101b-收集/路由至根联合体 其它-保留 |
格式[1:0] |
字节0的比特6:5 |
01b-没有数据的消息请求 11b-带数据的消息请求 |
消息代码[7:0] |
字节7的比特7:0 |
这一字段含有表明要发送的消息类型的编码 0000 0000b-解除锁定消息 0001 xxxb-电源管理消息 0010 0xxxb-INTx消息 0011 00xxb-出错消息 0100 0000b-热插拔消息 0101 0000b-插槽电源消息 0111 111xb-厂商类型0消息 0111 1111b-厂商类型1消息 |
标记7:0 |
字节6的比特7:0 |
所有消息请求都是非报告请求,没有分配表肌比特,这些比特都是0 |
请求者ID[15:0] |
字节5的比特7:0 字节4的比特7:0 |
标识发送消息的请求者。 字节4-7:0:请求者总线号 字节5-7:3:请求者设备号 字节5-2:0:请求者功能号 |
地址[31:2] |
字节11的比特7:2 字节10的比特7:0 字节9的比特7:0 字节8的比特7:0 |
如果选择地址路由,则此字段含有起始地址的低32比特,否则不使用此字段 |
地址[63:32] |
字节15的比特7:0 字节14的比特7:0 字节13的比特7:0 字节12的比特7:0 |
如果选择地址路由,则此字段含有起始地址的高32比特,否则不使用此字段 |