第二章 事务层
2.2 Transaction Layer Protocol‑Packet Definition 事务层报文定义
报文定义(NFM/FM报文头部、OHC正交扩展头)
- NFM Non‑Flit Mode:传统PCIe报文模式,TLP由Header DW+payload+ECRC组成;前缀是独立TLP Prefix(Local/End‑End前缀),放在TLP头部前面。
- FM Flit Mode:PCIe6新增分片模式;不再使用老的独立TLP前缀,全部前缀信息挪进OHC(Orthogonal Header Content正交扩展头),OHC紧跟基础Header Base之后。
- OHC:正交扩展内容,一组可选DW扩展段;OHC[4:0]位于FM TLP第一个DW,位域编码表示后面存在哪些OHC块;多个OHC同时存在时强制顺序:A → B → C。
- TS[2:0]:FM报文Trailer Size字段,标识报文末尾Trailer(尾部)有多少DW,用于放ECRC、IDE‑MAC、PCRC。
- IDE‑TLP:完整性增强TLP,需要OHC‑C,Trailer携带IDE‑MAC/PCRC校验。
- UIO:Unordered IO,无序IO虚拟通道,仅FM模式支持;UIO TLP不能转换为NFM。
- Reserved保留位:发送方必须写全0;接收方必须忽略;交换机透传时原样转发。
PCIe是基于报文的协议,两端器件事务层之间交换TLP报文。基础事务一共4大类:Memory存储器、I/O、配置Configuration、Message消息。存储器请求支持两种地址格式:32位短地址、64位长地址。
- UIO TLP:绑定UIO虚拟通道的TLP。
- 事务分为两大类:Request请求、Completion完成包。
- Completion不是每个请求都有;读请求必须返回Completion;I/O写、配置写也会返回Completion确认写完。
- 所有UIO请求强制要求返回Completion。
- Completion靠报文头内
Transaction ID事务ID字段和原始请求做匹配。保留字段规则:构造TLP的时候,所有标记Reserved保留位必须填0;接收设备必须忽略保留位的值;交换机转发不能修改保留位。注意:部分字段有“规定值”和“保留值”两套编码,这两种情况的处理规则协议分开定义。
NFM与FM格式转换要点
NFM和FM有两套完全不同TLP头部格式。当入端口和出端口模式不一样(一边FM一边NFM),端口必须做TLP格式翻译转换。部分TLP无法完成转换,协议专门定义这类报错处理逻辑。
2.2.1 公共报文头部字段
2.2.1.1 Non‑Flit Mode(NFM传统模式)公共头部
NFM TLP第一个DW的字节0包含Fmt[2:0]格式字段、Type[4:0]报文类型字段。
Fmt[2:0]:说明TLP头部DW长度,以及报文后面有没有payload有效载荷。 Table2‑2:
Fmt[2:0] 含义 000b 3DW头部,无数据载荷 001b 4DW头部,无数据载荷 010b 3DW头部,带数据载荷 011b 4DW头部,带数据载荷 100b 存在TLP Prefix前缀 其余编码全部保留。
- Type[4:0]:TLP事务类型,决定报文是什么事务(MRd存储器读、MWr存储器写、CfgRd配置读、Msg消息、Cpl完成包、原子操作等),同时决定交换机如何路由该TLP。
NFM头部其余字段(DW0剩余bit,DW1/DW2)
- TC[2:0] Traffic Class流量类别:虚拟通道VC选择依据。
- R保留位:原来的LN轻量通知bit,该特性已经废弃;现在保留,未来可重分配。
- TH(TLP Hints):=1代表TLP头部存在TPH处理提示字段。
- Attr[1:0],Attr[2] 属性字段:存储器事务的强/弱排序、可缓存属性。
- TD bit:TLP Digest置1表示报文尾部携带ECRC端到端校验DW。
- EP Error Poisoned:数据中毒标记,标记payload数据已经损坏。
- Length[9:0]:payload数据长度,单位DW(双字4字节)。
- ✅数据载荷必须4字节自然对齐。
- 对于没有payload的TLP(Cpl完成包、CplLk锁定完成包、大部分Message消息)Length字段是保留。
Table2‑3:Fmt+Type组合表,定义全部NFM TLP:MRd、MRdLk、MWr、IORd/IOWr、CfgRd0/CfgWr0、CfgRd1/CfgWr1、DMWr可延迟存储器写、Msg/MsgD消息、Cpl/CplD/CplLk/CplDLk完成包、FetchAdd/Swap/CAS原子操作、LPrfx本地前缀、EPrfx端到端前缀。
Table2‑4 Length编码:Length值=00_0000_0001b代表1DW;最大值1023DW;Length=0代表1024DW载荷。⚠️极易踩坑:Length=0不是0字节,是最大值1024DW。
2.2.1.2 Flit Mode(FM分片模式)头部定义
FM TLP报文语法结构(报文组成顺序)
- 0个或多个1DW大小Local TLP Prefix本地前缀
- Header Base基础头部(大小由
Type[7:0]决定);紧随其后0‑7DWOHC正交扩展头(由OHC[4:0]字段指明有哪些OHC块) - TLP payload载荷,0~1024DW
- TLP Trailer尾部(可选,TS[2:0]指明尾部DW数量;放ECRC / IDE‑MAC /PCRC)
NOP TLP空报文
链路没有其他TLP发送的时候,必须发NOP填充报文;接收设备收到NOP直接丢弃,不产生任何影响;NOP除Type字段以外,其余头部全部是保留位。
FM对比NFM关键架构变更(重点)
- NFM中独立的End‑End TLP前缀,FM全部移入OHC扩展头,不再放在报文最前面。
- NFM中Steering Tag、PH、ST、AMA、AV字段,FM不再复用字节使能位置;全部收拢放到OHC‑B里面。
- UIO TLP只允许FM链路;禁止转换成NFM格式。如果UIO报文转发去往NFM出端口,报不可纠正错误。
FM Header Base第一个DW字段(Figure2‑6)
从低bit到高bit字段:Type[7:0]、TC流量类别、OHC[4:0]、TS[2:0]、Attr属性、Length长度。
- Type[7:0]FM的TLP类型,比NFM的5bit更宽。
- 所有接收器件必须完整解码全部Type编码,哪怕硬件不支持该事务类型。
- 流控FC要按照Type对应的FC类型处理。
- FC‑Type=None的TLP,接收端不需要缓存,静默丢弃。
- Switch交换机要缓存、路由TLP(包含保留编码的TLP)。
- EP上游端口、RootPort必须缓存报文;遇到不支持OHC内容,允许丢弃不支持OHC部分,但要做Header logging。
TS[2:0] Trailer Size字段
- 000b:无Trailer
- 001b:1DW Trailer,存放ECRC
- 010b~111b:不同DW长度的Trailer;其中IDE‑MAC/PCRC只有OHC‑C存在并且标记IDE TLP时才有意义,否则Trailer内容保留。
OHC[4:0]字段(5bit,核心!)
用来指示后面紧跟哪些OHC扩展块:
- 0 0000b:没有OHC
- x xxx1b:OHC‑A存在
- x xx1x b:OHC‑B存在
- x x1xx b:OHC‑C存在
- 0 0xxx b:无OHC‑E
- 0 1xxx b:OHC‑E1
- 1 0xxx b:OHC‑E2
- 1 1xxx b:OHC‑E4
⚠️规则:多个OHC同时存在时,物理顺序强制OHC‑A → OHC‑B → OHC‑C,不能乱序。 发送端:特定TLP类型强制要求带上指定OHC; 接收端:检查OHC规则违例;
- 请求报文违反OHC强制规则:报Unsupported Request不支持请求;
- Completion报文违反OHC强制规则:报Unexpected Completion意外完成包。
全部OHC块逐条解析 A1/A2/A3/A4/A5 / B / C
OHC‑A组(OHC‑A1 ~ A5,同属OHC‑A大类)
OHC‑A表:不同子A格式分别对应不同事务;当报文使用A1,那么A2‑A5所有bit全部保留。
OHC‑A1(Figure 2‑7)
适用场景:带显式字节使能、带PASID的存储器请求;ATS翻译请求。 字段:
- NW(No‑Write):仅ATS翻译请求有效;其余请求下该位保留。
- PV(PASID Valid):PASID有效位。PV=0时,PASID、ER、PMR全部保留必须为0。
- ER Execute Request;PMR Privileged Mode Request:ATS翻译请求才使用;其他请求保留。
- PASID:进程地址空间ID。
- 1st DW BE / Last DW BE:第一个DW、最后一个DW字节使能。
OHC‑A2(Figure 2‑8)
用于IO请求;只携带首DW、末DW字节使能;其余bit保留。
OHC‑A3(Figure 2‑9)
用于配置事务。
- DSV(Destination Segment Valid):目标分段有效标记。
- DSV=0,则Destination Segment字段保留。
- Destination Segment:目标Hierarchy分层域编号。
OHC‑A4(Figure 2‑10)
用于ID路由消息报文;需要PASID或者Destination‑Segment的时候必须带A4。
- PV=0 → PASID字段保留;
- DSV=0 → Destination Segment字段保留。
OHC‑A5(Figure2‑11,Completion完成包专用!)
就是前面讲跨Hierarchy返回Completion的扩展头
- LA[1:0] LowerAddress:低地址两位。
- DSV:Destination Segment有效位;DSV=0时Destination Segment保留。
- Destination Segment:Completion要返回的目标分层域(复制原始请求Requester_Segment)
- Completer Segment:响应方设备自身所属分层域编号
- Cpl Status:Completion完成状态。
OHC‑B(Figure 2‑12)
⚠️重要:OHC‑B仅允许用于【地址路由请求】;别的TLP里面出现OHC‑B,则B全部bit是保留。 用途:承载TPH TLP处理提示相关PH、ST、AMA、AV字段。
- HV Hints‑Valid:提示有效,用来限定PH/ST哪些位有效
- 00b:PH、ST全部无效,保留
- 01b:PH有效,ST高8bit无效,ST低8bit有效
- 10b:保留编码,接收按00b处理
- 11b:PH全部、ST全部字段有效
- PH:Processing Hint处理提示
- ST:Sub‑Stream子流ID
- AV:AMA有效位;AV=0时AMA字段保留。
- AMA:Address Mask Attribute地址掩码属性。
OHC‑C(Figure 2‑13)【分段+IDE TLP核心】
字段列表:
- Requester Segment:请求发起方所在Hierarchy分层域编号
- RSV(Requester‑Segment Valid):RSV=1代表Requester‑Segment字段有效;RSV=0,该字段保留。
- PR_Sent_Counter
- Stream_ID流ID
- Sub‑Stream子流
- R、K、T字段
OHC‑C硬性规则(高频易错)
- IDE‑TLP必须携带OHC‑C。
- Sub‑Stream = 000b/001b/010b:PR_Sent_Counter、Stream_ID、K、T有效;
- Sub‑Stream=011b~100b:接收行为未定义;
- IDE Completion报文:Requester‑Segment字段保留,RSV必须清0。
- 非IDE TLP携带OHC‑C时,Sub‑Stream必须等于111b。此时PR_Sent_Counter、StreamID/K/T全部保留。
IDE‑TLP注意:IDE报文不能在FM/NFM边界做转换;一旦IDE TLP从FM端口发往NFM端口,报文必须丢弃,报Misrouted IDE‑TLP错误。NOP报文严禁被标记成IDE TLP。
Segment分段字段完整规则(只存在FM模式)
Segment的两大作用:
- 跨Hierarchy分层域P2P路由:让RC不需要强制对NP请求做taking‑ownership接管;Completion报文依靠Destination‑Segment直接路由回原始发起端分层域。
- 错误日志增强:AER日志里带上Segment;多个Hierarchy内存在相同BDF号的时候,可以区分是哪个域设备报的错。
字段位置总结:
- Requester‑Segment:存于OHC‑C,标记请求发起设备所在分层域;RSV位控制该字段是否有效。
- Completer‑Segment:存于OHC‑A5,标记响应设备所在分层域。
- Destination‑Segment:OHC‑A3 / OHC‑A4 / OHC‑A5;DSV位控制是否有效;告诉交换机该报文要送往哪个分层域。
配置写请求FM模式下,Root Port发出配置TLP强制携带OHC‑A3,DSV=1,填入正确Destination‑Segment;Completer设备依靠这个配置报文捕获自己Segment值。
高频踩坑&容易理解错误汇总
- ❌Length=0代表0DW数据 ✅Table2‑4:Length=0 → payload=1024DW;Length只有1‑1023直接对应DW数量。
- ❌FM模式下本地前缀还是放在TLP报文最前面 ✅FM模式:Local TLP Prefix依旧在报文最开头;老的End‑End前缀全部取消,功能迁移进OHC扩展头。
- ❌OHC块可以随便排顺序 ✅当多个OHC同时存在,物理DW顺序强制A→B→C,不能调换。
- ❌UIO TLP可以做FM→NFM转换 ✅UIO仅FM;转发到NFM端口直接报错不可纠正错误。
- ❌OHC‑B可以用于Completion包、消息报文 ✅协议明确:OHC‑B只允许地址路由请求;其余TLP里面OHC‑B全部bit保留。
- ❌DSV=1可以随便写Destination‑Segment ✅DSV=0时,硬件强制忽略该字段,字段内容是保留,发送方写0。
- ❌只要带上OHC‑C就一定是IDE TLP ✅不是;非IDE报文也允许带OHC‑C,但是此时Sub‑Stream必须=111b;IDE‑TLP是Sub‑Stream取000/001/010。
- ❌Trailer的IDE‑MAC一直有效 ✅只有OHC‑C指明该TLP是IDE TLP的时候,TS字段里面IDE‑MAC/PCRC才生效;其余情况Trailer对应位置是保留内容。
- ❌FM模式Type字段和NFM一样是5bit ✅NFM Type是5bit;FM的Type拓宽为8bit Type[7:0]。
- ❌NOP报文可以带IDE标记 ✅协议强制禁止:NOP不能当IDE‑TLP;如果收到NOP标记IDE,判定畸形报文Malformed TLP。
- ❌配置请求的Completion也要携带Destination Segment ✅配置请求本身不带Requester_Segment;所以对应的Completion不携带Destination Segment,只依靠Transaction ID在RP内完成匹配。
- ❌RSV=1/DSV=1可以独立随便置位 ✅RSV=0,则Requester‑Segment字段硬件层面当作保留;DSV=0,Destination‑Segment当作保留;发送端必须对应字段写0,接收直接忽略。
NFM vs FM头部核心差异速表
| 项目 | NFM Non‑Flit Mode | FM Flit Mode |
|---|---|---|
| Fmt | 2bit Fmt字段控制头部DW长度、有无数据 | 取消Fmt;头部长度完全由8bit Type[7:0]决定 |
| TLP Prefix | 独立前缀LPrfx/EPrfx,放在报文头部之前 | Local前缀保留;End‑End前缀全部移入OHC扩展头 |
| 扩展机制 | TLP Prefix前缀 | OHC正交扩展头(A/B/C/E系列) |
| 尾部校验 | TD位控制ECRC DW | TS[2:0] Trailer Size;支持ECRC、IDE‑MAC+PCRC |
| 分段Segment | 不存在Segment字段 | Requester‑Segment(OHC‑C),Destination‑Segment(OHC‑A3/A4/A5),Completer‑Segment(OHC‑A5) |
| 字节使能 | 放在TLP头部DW | 挪入OHC‑A1/A2 |
| TPH PH/ST/AMA | 复用头部保留bit | 全部放入OHC‑B |
| UIO支持 | 不支持UIO虚拟通道 | 原生支持UIO;UIO报文禁止转NFM |