• 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。

    名称字段作用
    FmtDW0[31:29]决定了包头是3DW长度还是4DW长度的
    TypeDW0[28:24]决定了包的类型,类型有Mrd(读地址内数据)、Mwr(向地址写数据)、Cfg(配置PCIe)、Msg(消息)、Cpl(读地址数据请求后返回的数据包)
    Traffic ClassDW0[22:20]包交换优先级,数字越大优先级越高
    AttrDW0[18]、DW0[13:12]包的属性。Attr[13]是解析包是顺序还是乱序,一般设置为顺序。Attr[12]是Cache一致性,数据量小的时候可以打开以提高数据传输效率,数据量大则关闭
    THDW0[16]PCIe2.1提出,xilinx7不支持此设置
    TD(TLP Digest)DW0[15]为1是必须添加ECRC,为0时不添加
    EPDW0[14]错误包标志。为1时代表此包为错误包,将被忽略
    AT(Addr Type)DW0[11:10]地址类型。一共有三种类型:内存地址(00)、虚拟地址(10)、转换完成的内存地址(11)。当表示虚拟地址是需将地址转换成内存地址
    LengthDW0[9:0]用来表示数据包的长度,用于Mwr、Cpl、Msg包。注意单位是DW,也就是32字节的,注意单位转换。一个数据包的数据长度最多为4096byte
    Requester IDDW1[31:16]这个ID是PCIe的endpoint设备在root comlex初始化时对设备分配的,分为bus number[]、Device Number[]、Func[]
    TagDW1[15:8]扩展标识,由请求方产生,与Requeseter ID构成唯一标识,用来识别应答信息
    First/Last byte Enables第一字节和最后一个字节有效标志DW1[7:0]
    AddressDW2或者DW2 + DW3地址位。Fmt决定了这个位数是32位还是64位

      数据完成包的包头结构
    在这里插入图片描述
      DW0部分与前面相同。下面重点介绍与前面一个包不同的部分。

    名称字段作用
    Completer IDDW1[31:16]反馈设备ID,可以用于DEBUG
    Requester IDDW2[31:16]数据请求设备的ID,一般从请求包复制ID
    Completer statusDW1[15:13]包状态。成功响应(000),不支持请求(001),配置请求重试(010),请求忽略(100)
    Byte countDW1[11:0]未发送数据位计数
    Lower AddressDW2[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]
    存储器读请求Mrd00=3DW,无数据   01=4DW,无数据0 0000
    锁定存储器读请求MrdLk00=3DW,无数据   01=4DW,无数据0 0001
    存储器写请求MWr10=3DW,有数据   11=4DW,有数据0 0000
    IO读请求IORd00=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
    完成Cpl00=3DW,无数据0 1010
    带数据的完成CplD10=3DW,有数据0 1010
    锁定完成(CplLk)00=3DW,无数据0 1011
    带数据的锁定完成CplDLk10=3DW,有数据0 1010

    路由方式

    TLP类型路由方式
    Mrd,MRdlk\MWr地址路由
    IOEd、IOW地址路由
    CfgRd0、CfgRd1、CfgWr0、CfgWr1ID路由
    Msg、MsgD地址路由、ID路由或隐含式路由
    Cpl、CpIDID路由

    地址路由

      端点设备检查TLP包中的地址与BAR中所有的地址进行比较,如果不属于本端点范围,则拒绝。

    ID路由

      端点设备检查TLP包里的总线ID和设备ID功能ID是否与本端点一致,这些信息可以再Type0的配置信息里捕获。

    读写过程

      处理器发送MRD给目标的设备ID,设备响应CPld包给处理器。

  • 相关阅读:
    JavaScript
    uniapp项目实践总结(十六)自定义下拉刷新组件
    Linux调试器---gdb的使用
    笔记01:第一行Python
    【开题报告】基于微信小程序的个人健康管理系统的设计与实现
    【大麦小米学量化】什么是量化交易?哪些人适合做量化交易?
    kubernetes-pod的更新策略与回滚策略
    MES系统中生产计划模块的重要作用
    java学到什么程度才算是精通?
    iOS替换应用图标
  • 原文地址:https://blog.csdn.net/q1594/article/details/126778040