第二十一讲、PCIE的TLP包的封包解包原理.pdf
00 Packet Coding.docx
掌握如何发送接收 Mrd(memory read TLP)、Mwr(Memory write TLP)、Cpl(Completion TLP)和Cpld(Completion with data TLP) 命令包
1、 TLP 包是由 PCIE 的 Endpoint 或者 Root Complex 组建发送。
2、 TLP 包只包含两种包头长度 3DW 和 4DW(double word is 32bit),数据内可以选择包含和不包含 ECRC 1DW(循环校验字 32bit)
绿色:传输层协议
浅蓝色:数据链路层协议
蓝色:物理层协议
紧挨着链路层的绿色部分由红色圈圈出的是用户的 TLP 包, 也就是接下来我们要重点讲解的部分。(此部分如果选择使用框架那么由框架创建例如 Riffa 和 XDMA,如果完全自定义那么就是需要自己的写这些 TLP)
传输层细节讲解
Memory write TLP 包结构
名称 | 字段 | 作用 |
---|---|---|
Fmt | DW0[31:29] | 决定了包头是3DW长度还是4DW长度的 |
Type | DW0[28:24] | 决定了包的类型,类型有Mrd(读地址内数据)、Mwr(向地址写数据)、Cfg(配置PCIe)、Msg(消息)、Cpl(读地址数据请求后返回的数据包) |
Traffic Class | DW0[22:20] | 包交换优先级,数字越大优先级越高 |
Attr | DW0[18]、DW0[13:12] | 包的属性。Attr[13]是解析包是顺序还是乱序,一般设置为顺序。Attr[12]是Cache一致性,数据量小的时候可以打开以提高数据传输效率,数据量大则关闭 |
TH | DW0[16] | PCIe2.1提出,xilinx7不支持此设置 |
TD(TLP Digest) | DW0[15] | 为1是必须添加ECRC,为0时不添加 |
EP(Error package) | DW0[14] | 错误包标志。为1时代表此包为错误包,将被忽略 |
AT(Addr Type) | DW0[11:10] | 地址类型。一共有三种类型:内存地址(00)、虚拟地址(10)、转换完成的内存地址(11)。当表示虚拟地址是需将地址转换成内存地址 |
Length | DW0[9:0] | 用来表示数据包的长度,用于Mwr、Cpl、Msg包。注意单位是DW,也就是32字节的,注意单位转换。一个数据包的数据长度最多为4096byte |
Requester ID | DW1[31:16] | 这个ID是PCIe的endpoint设备在root comlex初始化时对设备分配的,分为bus number[]、Device Number[]、Func[] |
Tag | DW1[15:8] | 扩展标识,由请求方产生,与Requeseter ID构成唯一标识,用来识别应答信息 |
First/Last byte Enables第一字节和最后一个字节有效标志 | DW1[7:0] | |
Address | DW2或者DW2 + DW3 | 地址位。Fmt决定了这个位数是32位还是64位 |
Completion/completion with Data TLPs 完成相应包
信号名称 | 信号作用 |
---|---|
Completer ID | 由谁反馈的数据 |
Requester ID | 由谁请求的数据 |
Completion status | 000 是成功相应, 001 是不支持此请求, 010 配置请求请重试, 100 请求被忽略 |
Byte Count | 剩余未反馈数据的字节数量 |
routing Tag | 从请求包中复制此字段 |
Lower Address | 第一个有效字节地址的低 7bit 位 特别注意: Lower address和 Length 不能跨越 Root Complex 的 RCB(Read Completion Boundary)读完成包的边界但可以是 RCB 的整数倍, RCB 是在 Root Complex 设置的,我们的 IPcore可以通过 link control 控制器知道此值, RCB 一般是 64 字节也可设置为 128 字节, 默认没设置情况是 64 字节。 |
MPS(Max Payload Size) | 每一个 EP 和 RC 都可以设置此值,那么系统的 MPS 会取所有 MPS 的最小值, 比如 X86 系统中有多个 |
系统中最小的 MPS 是 128byte 那么系统的 MPS 是 128, 此值会通过 IP 核接口呈现出来。