1. TLP包的包头

在PCIe的系统中,TLP包的包头的结构有许多部分是相似的,通过掌握这些常规的包头,能够帮助我理解在PCIe总线上各个设备之间是如何来进行数据的收发的。
下面的这个图在前面也见到过,是一个常用的请求包的格式。

1.2 通用字段

其中,通用的字段有:

通用字段 作用
Fmt 决定了包头是3DW还是4DW,TLP包是否包含数据
Type 决定了TLP包的类型,比如Mrd,Mwr,Cfg,Msg,Cpl,Cpld
TC Traffic Class,用于决定TLP包处理的优先级,3bit,数值越大优先级也就越高
Attr 属性,共有3个bit,需要注意3个bit不是连在一起的,Attr[2]表示的是ID的一种排序方法。Attr[1]表示的是TLP包的传输是强序还是乱序,强序需要严格的按照TLP包的顺序,一次响应,可能会阻塞等待,知道当前TLP包处理完成。Attr[0]表示是否需要cache一致性,在进行大量数据的传输的时候,可以选择关闭cache,提高效率。
TD TLP Digest 该字段为1的时候需要在TLP包的最末尾添加ECRC,0不需要添加
EP TLP包错误信号
AT Address Type,表示地址类型,是否需要进行地址的转换
Length 用于Mwr,Cpl,Msg包,以工10bit,0表示1024DW,1~1023分别表示对应数量的DW。TLP包的起始地址和结束地址不能跨4K的边界
First/Last DW BE 用于表示第一个DW和最后一个DW中有效的字节,每一位对应一个字节。对于数据量小于1个DW的情况下,First DW BE表示对应的有效数据,Last DW BE为0。对于数据量大于一个DW的情况下,Last DW不能为0,长度为0的包,两个BE都为0

1.3 内存请求 TLP包头结构



对于内存请求包的包头如上图所示,3DW和4DW对应的可访问的地址空间是不同的。

  • Requester ID
    其中这个Requester ID由三部分组成:分别是BUS_NUM[7:0]、DEVICE_NUM[4:0]、FUNC_NUM[2:0]决定。在前面的博客当中,也介绍过PCIe端点设备在上电时候会被RC进行枚举检测,并分配对应的ID,每个设备的ID在上电时确定,在断电之前,是保持不变的。

  • TAG扩展标识
    这个表示是由请求方产生的,可以和Request ID组成一个唯一的ID保证唯一性,可以用来识别应答信息,可以用于包过滤。

对于Mwr和Mrd TLP包,它们的包头信息基本是一致的,同样包含那些常规字段和Requester ID等。
但是读内存请求Mrd是一个非转发包Non-posted的包,需要一个独立的反馈事物来获取反馈回来的数据。
Mwr TLP包是一个转发包Posted,写TLP包当中就包含有数据。

1.4 完成包 CPL,CPLD包头

完成包的包头结构如下:

除了第一个DW的常规字段外还有一些特殊的字段,需要我来掌握一下:

字段 作用
Completer ID 指示是由谁反馈的数据
Requester ID 指示是谁请求的数据
Completion Status 3bit完成状态,000是成功,001是不支持,010是配置请求重试,100是忽略
Byte Count 指的是剩余未反馈数据的字节数量
Routing Tag 从请求包当中复制的表示信号
Lower Address 第一个有效字节地址的低7bit

需要注意的是:Lower Address和Length字段不能够跨越RC的边界也就是Root Completion Boundary RCB。CPLD包的边界可以是RCB的整数倍。

举一个RCB的例子:
如果系统的RCB是128字节,当前的读取数据的起始地址是0x0000_00F8,那么根据这个不能超过RCB的含义,也就是当前能够读取的数据,只能在最近邻的RCB整数倍附近,也就是0x0000_0100。
也就是说,如果一个TLP包请求读取从0x0000_00F8读取10个字节的数据的话,那么,由于不能跨越RCB的限制,第一个CPLD包只能返回8个字节的数据,也就是从0x0000_00F8到0x0000_00FF这8个字节的数据,然后在下一包当中会返回剩下的数据。

除了RCB需要注意之外,在PCIe系统中还有一个需要注意的参数就是最大负载大小(Max Payload Size),这个参数决定了每一个TLP包一次最多能够传输多少字节的数据。

2. 具体的TLP组包分析

2.1 内存读请求Mwr

假设系统的一些参数如下:

  • PCIe的最大负载为MPS=512 字节;
  • 系统边界RCB=128 字节;
  • 需要读取的地址的起始地址:0x0010_00f8;
  • 需要读取的长度:272 字节;
  • 请求ID号Requester ID:0x0001;
  • 回复者ID号Completer ID:0x1000;
  • 标识Tag:0x00。

基于上面的消息我们就能够来模拟一个TLP包的传输了。

首先需要产生一个读请求包,所以可以确定Ftm字段和Type字段的值。
然后是TC,ATTR等字段,都保持为0就可以了。
然后需要注意的是要读取的数据长度为272字节,刚好是68个DW,所以在长度这里需要填入DW的长度,也就是0x44=0b00_0100_0100;由于读取的长度刚好是DW的正数倍,因此在First DW BE 和Last DW BE里面都填1,表示第一个和最后一个DW的数据中的每个字节都有效。
然后把TAG,ID填写到TLP包当中,最后是填写入地址就可以了。

因此,得到的最终的这个Mrd包的结果如下:

当RC接收到这个读取请求包之后,就会从内存当中读取数据,并把这些数据组成一个一个的TLP包通过ID路由的方式,发送给端点的PCIe设备。

2.2 Cpld

CPLD包的包头结构如下:

接下来就是返回的数据包的分析:

2.2.1 第一个CPLD包

首先确定CPLD包的类型,确定FMT字段和TYPE字段的值。
然后看第一个包能够发送多少数据,因为要读取的数据的地址是0x0010_00F8,由于不能跨RCB的边界,因此第一次能够读取的数据个数为8字节,所以第一个TLP包的长度为8/4=2DW。
然后是需要填写当前还剩多少字节的数据没有返回,由于第一个TLP还没有返回数据因此还剩下272个字节没有发送,所以这里需要填入272。
Status的值,需要根据返回的状态来确定,正确返回需要填入3’b000
然后依次把请求者ID和回复者ID还有TAG进行一个填写。
最后还需要关心的是一个Lower Address字段,该字段因该填入第一个有效字节的地址的低7位,也就是0x0010_00F8的低7位,也就是0x78。
然后在CPLD的包头后面,跟上从内存当中读出的数据就好了。
因此可以得到第一个CPLD包的内容如下:

2.2.2 第2个CPLD包

第一个CPLD包返回了8字节的数据,还剩下264字节的数据。根据最大负载的MPS=512字节,所以还剩下的数据小于最大负载。然后再考虑RCB,再保证不跨RCB的情况下能够传输的最大长度就是两个RCB的长度也就是256字节。因此,本次传输的数据的长度是256字节,换算成DW就是256/4=64=0x40。本次传输的其实地址是接着上一个包的结束地址,也就是0x0010_0100,可以可以构成第2个CPLD包。
关键参数:

  • 长度64DW
  • 剩余字节数264字节
  • Lower address,第一个有效字节的低7位也就是0x00

第3个CPLD包

在上一个包返回了256字节数据之后,还剩下8个字节的数据没有发送,因此在本包当中,还需要完成最后的这八个字节的发送。本次发送的起始地址是0x0010_0200;发送的长度是2个DW

这样就完成了本次请求的全部的CPLD包的返回了。

FPGA基础----TLP包格式以及组包方法(1)相关推荐

  1. 蓝牙基带数据包格式说明及包类型定义说明

    微微网中使用的分组类型与使用的物理链路有关.蓝牙的物理链路主要包括:ACL,SCO and eSCO;    因为蓝牙的跳频是:1600次/s,所以蓝牙时隙为:1/1600=625us;    关于A ...

  2. 【FPGA】SRIO中的关键问题总结(一)SRIO中的关键数据包格式总结

    目录 1 SRIO事务及其类型 2 常用的I/O逻辑操作事务 3 HELLO包格式(重点) 4 SRIO数据包包格式 5 控制符号数据包格式 1 SRIO事务及其类型 SRIO(Serial Rapi ...

  3. linux_驱动_V4l2层_camera_应用层调用流程_MIPI协议包格式简介

    一. 摄像头基础介绍 1.摄像头结构和工作原理. 拍摄景物通过镜头,将生成的光学图像投射到传感器上,然后光学图像被转换成电信号,电信号再经过模数转换变为数字信号,数字信号经过DSP加工处理,再被送到电 ...

  4. Java版ISO8583报文组包/解包

    文章目录 一.8583协议简介 二.位图规则 三.8583格式报文参考 四.组包/解包思路 五.相关代码 一.8583协议简介   8583协议是基于ISO8583报文国际标准的包格式的通讯协议,85 ...

  5. 分包组包 北斗通信_一种基于北斗的低功耗双向非实时通信方法

    一种基于北斗的低功耗双向非实时通信方法 [技术领域] [0001]本发明涉及一种基于北斗的低功耗双向非实时通信方法,属于北斗系统通信技术领域. [背景技术] [0002]北斗卫星系统具备的短报文通信功 ...

  6. MQTT协议详解 二、MQTT控制包格式

    文章目录 系列文章目录 前言 一.MQTT控制包格式 二.固定包头 控制包类型 控制包类型标识 剩余长度 三.可变包头 数据包标识 四.载荷 系列文章目录 MQTT协议详解 一.MQTT简介 MQTT ...

  7. 常见网络报文数据包格式

    当我们应用程序用TCP传输数据的时候,数据被送入协议栈中,然后逐个通过每一层,知道最后到物理层数据转换成比特流,送入网络.而再这个过程中,每一层都会对要发送的数据加一些首部信息.整个过程如下图. 以太 ...

  8. 蓝牙广播数据包_蓝牙BLE数据包格式汇总

    以蓝牙4.0为例说明: BLE包格式有:广播包.扫描包.初始化连接包.链路层控制包(LL层数据包).逻辑链路控制和自适应协议数据包(即L2CAP数据包)等: 其中广播包又分为:定向广播包和非定向广播包 ...

  9. IP数据包格式(ICMP协议与ARP协议)

    这里写目录标题 IP数据包格式 网络层的功能 IP数据包格式 ICMP协议 ping 广播域 ARP协议(地址解析协议) 无故ARP ARP工作原理: ARP报文 查看arp缓存表(静态arp和动态a ...

最新文章

  1. R语言F分布函数F Distribution(df, pf, qf rf )实战
  2. [转载]dorado学习笔记(二)
  3. 排序---快速排序及其切分函数Partition应用
  4. 深度学习(二十)基于Overfeat的物体检测-2014 ICLR-未完待续
  5. 数据挖掘-数据预处理的必要性及主要任务
  6. linux mysql进阶_mysql进阶学习二之搭建主从
  7. Guava、Spring 如何抽象观察者模式?
  8. python pygame sdl2教程_无法安装pygame sdl2
  9. ZenHub Epics创造了GitHub中敏捷Epics
  10. Multi-statement transaction required more than ‘max_binlog_cache_size‘ bytes of storage
  11. Windows XP/2003 Server操作系统源代码完整版下载链接
  12. AVOD、SVOD、TVOD、PVOD:视频点播商业模式
  13. linux里case命令,Linux系统中的case命令怎么用
  14. php判断信用卡,PHP函数验证信用卡卡号是否正确
  15. php流量统计代码_用php编写的简单的网站流量统计程序
  16. SAP系统管理的常用T-CODE
  17. 02 推荐的起点:断物识人
  18. includes()的用法
  19. 华宇智能数据官网全新上线,赋能行业数字化转型
  20. 一师兄的面试经历:对于销售职位来…

热门文章

  1. 学习大数据需要什么基础?大数据要学哪些内容?
  2. 手机APP开发:学JAVA转安卓APP开发是不是很容易?
  3. MySQL 查看每个 IP 的连接数
  4. SQLServer删除数据列
  5. 光格科技产品系列之分布式光纤温度传感
  6. Java导出word 图片重复
  7. 其次线性方程组,行列式为0,一定有非0解.
  8. 电路板PCBA清洗工艺
  9. feded计算机音乐,Romeo And Jazzie/Alan Walker《Faded Refix》[FLAC/MP3-320K]
  10. 地理坐标系和投影坐标系详解(及坐标系在ArcGIS中的应用)