PCIe(二)——TLP包构成
1 简介
TLP包是由PCIe的Endpoint或者Root Complex发送的数据包。在PCIe体系中的事务层生成。
深蓝色部分是物理层添加的开始和结束字段,浅蓝色部分是链路层添加的。这些都是由IP核自动添加,用户无需关心。中间红框内的是TLP包,在事务层生成,如果用户使用的是Riffa等集成度较高的框架也无需关心。但是有时可能会要求自己构建TLP或者解析TLP包。所以将重点介绍TLP包的构成。
由图可以看出TLP包由头(Hander)、数据(Data)、ECRC(校验)四个部分组成。重点看TLP包的头和数据部分。
TLP包的Hander部分
一个DW字节是32位,4byte。
名称 | 字段 | 作用 |
---|---|---|
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 | 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位 |
数据完成包的包头结构
DW0部分与前面相同。下面重点介绍与前面一个包不同的部分。
名称 | 字段 | 作用 |
---|---|---|
Completer ID | DW1[31:16] | 反馈设备ID,可以用于DEBUG |
Requester ID | DW2[31:16] | 数据请求设备的ID,一般从请求包复制ID |
Completer status | DW1[15:13] | 包状态。成功响应(000),不支持请求(001),配置请求重试(010),请求忽略(100) |
Byte count | DW1[11:0] | 未发送数据位计数 |
Lower Address | DW2[6:0] | 第一个有效字节地址的低七位 |
注意:1.Lower address和length不能跨越Root Complex的RCB(Read Completion Boundary)读完成包的边界但是可以是RCB的整数倍。意思是单个包发送的数据如果大于RCB就必须是RCB的整数倍,如果不足RCB则结束地址一定是RCB的整数倍,所以一个数据请求信号的应答包通常会分成几个数据包来应答数据包。IPcore的link control可以知道此值,一般设为64或者128,默认128。
2.MPS(Max Payload Size)由EP和RC设置,是系统传输数据的最大承载数量。PCIe设备都有一个值。系统的MPS会取最小值,对应的IPcore接口为PCIe core:cfg_dstatus[15:0]MPS
3.包头的Fmt和Type数据表如下:
TLP类型 | Fmt[1:0] | Type[4:0] |
---|---|---|
存储器读请求Mrd | 00=3DW,无数据 01=4DW,无数据 | 0 0000 |
锁定存储器读请求MrdLk | 00=3DW,无数据 01=4DW,无数据 | 0 0001 |
存储器写请求MWr | 10=3DW,有数据 11=4DW,有数据 | 0 0000 |
IO读请求IORd | 00=3DW,无数据 | 0 0010 |
IO写请求 | 10=3DW,有数据 | 0 0010 |
Type 0配置读请求(CfgRd0) | 00=3DW,无数据 | 0 0100 |
Type 1配置读请求(CfgRd1) | 00=3DW,无数据 | 0 0101 |
Type 0配置写请求(CfgRd0) | 10=3DW,有数据 | 0 0100 |
Type 1配置写请求(CfgRd1) | 10=3DW,有数据 | 0 0101 |
消息请求(Msg)) | 01=4DW,无数据 | 1 0rrr |
带数据的消息请求(MsgD)) | 11=4DW,有数据 | 1 0rrr |
完成Cpl | 00=3DW,无数据 | 0 1010 |
带数据的完成CplD | 10=3DW,有数据 | 0 1010 |
锁定完成(CplLk) | 00=3DW,无数据 | 0 1011 |
带数据的锁定完成CplDLk | 10=3DW,有数据 | 0 1010 |
路由方式
TLP类型 | 路由方式 |
---|---|
Mrd,MRdlk\MWr | 地址路由 |
IOEd、IOW | 地址路由 |
CfgRd0、CfgRd1、CfgWr0、CfgWr1 | ID路由 |
Msg、MsgD | 地址路由、ID路由或隐含式路由 |
Cpl、CpID | ID路由 |
地址路由
端点设备检查TLP包中的地址与BAR中所有的地址进行比较,如果不属于本端点范围,则拒绝。
ID路由
端点设备检查TLP包里的总线ID和设备ID功能ID是否与本端点一致,这些信息可以再Type0的配置信息里捕获。
读写过程
处理器发送MRD给目标的设备ID,设备响应CPld包给处理器。
PCIe(二)——TLP包构成相关推荐
- PCIe学习笔记(一)-------1.5 一个TLP包的传输过程
1,MRd包的传输 以MRd TLP包的传输为例,说明一个Non-Posted事务的TLP是如何在PCIe系统层次中处理的. 1)Requester的软件层发送需要传送的信息给事务层. 2)事务层将数 ...
- 6.PCIe协议分析3-PCIe TLP包详解2
1.回顾 上一篇博文我们讲解了TLP简介以及TLP Header结构,并列出了TLP的所有类型,如下图.本篇博文讲解核心几个TLP类型的具体结构(下图标注红色的),这些核心的TLP包结构,就是我们下章 ...
- 【PCIE】PCIE TLP包解析
PCIE TLP包解析 说明:本文摘自 V3学院 尤老师的培训班笔记,仅用于个人学习,不用于任何商业用途. 满足个人在公交车上或者其他需要不得不等待的时间段内学习的需要. TLP包的公共部分 Memo ...
- FPGA基础----TLP包格式以及组包方法(1)
1. TLP包的包头 在PCIe的系统中,TLP包的包头的结构有许多部分是相似的,通过掌握这些常规的包头,能够帮助我理解在PCIe总线上各个设备之间是如何来进行数据的收发的. 下面的这个图在前面也见到 ...
- 一方包,二方包,三方包的区别
一方包(也称一方库): 本工程中的各模块的相互依赖 二方包(也称二方库): 公司内部的依赖库,一般指公司内部的其他项目发布的jar包 三方包(也称三方库): 公司之外的开源库, 比如apache.ib ...
- alpine linux apk删除,把玩Alpine linux(二):APK包管理器
原标题:把玩Alpine linux(二):APK包管理器 Alpine Linux非常精简,开机内存占用也在二三十兆大,没有拆箱即用,就需要我们自己去做一些了解和配置. Alpine Linux的优 ...
- 一方包、二方包、三方包是什么?
一方包(也称一方库).二方包(也称二方库).三方包(也称三方库)说明: 一方包:本工程中的各模块的相互依赖 二方包:公司内部的依赖库,一般指公司内部的其他项目发布的jar包 三方包:公司之外的开源库, ...
- 用实战项目经验告诉你什么是二方包!
前言 只有光头才能变强. 文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y 最近在整合各种的系统,在这个过程中遇到了各种的问 ...
- 一方包、二方包和三方包的概念
在看一些技术文档的时候经常会看到有二方包这种名词,这里来记一下概念. 一方包(一方库) 本工程中的各模块的相互依赖. 二方包(二方库) 公司内部的依赖库,一般指公司内部的其他项目发布的jar包. 三方 ...
最新文章
- 互联网泛娱乐直播安全的解决之道
- java接口中多继承的问题
- 苹果cmsV10仿哈哩哈哩动漫自适应模板
- Condition 接口
- GNS3(eNSP)和VMWare搭建网络学习环境
- 【版本控制】如何从github 上删除项目
- 如何从零设计结构清晰、操作友好的权限管理模块
- C#基础-Func,Action
- XY相互独立,且服从指数分布,求U=max(X,Y)和V=min(X,Y)的概率密度函数
- 发布最新通用挤房器:全能挤房器1.0
- Word字体间距变大
- Photoshop教程一:精细选择工具
- [转贴]风险管理之巴塞尔协议
- Tableau豆瓣电影数据项目实战练习3
- 模糊测试框架 Sulley 使用手记 (一)
- Apache + Tomcat + JK 集群
- tensor.chunk、split的组合、拼接、切片
- 西红柿炒鸡蛋的神奇功效
- 小而巧的数字压缩算法:zigzag
- Logistic Regression 逻辑斯蒂回归