首页 > 其他分享 >PCIe协议(一)

PCIe协议(一)

时间:2023-08-10 13:56:58浏览次数:41  
标签:协议 TLP PCIE PC PCIe 字段 DW

前言

首先说明一下,本文是个人的学习和理解,为了方便自己时长温习而进行整理。

 

一、概述

1.1、      PCIe的入门学习概述

首先,关于如何入门PCIE做简单介绍吧。下面仅是笔者自己的学习经验,仅供参考!!!!

 

然后,明确一下PCIE的学习目标吧!

 

阶段一:理解掌握TLP报文格式;

 

阶段二:自己建工程,使用(ISE)Vivado generate一个PCIE IP core,分析其example PIO工程的状态转移等,并运行do sim.do运行modelsim仿真;

 

阶段三:基于xapp1052,分析其提供的128示例工程,分析其接收、发送、存储模块;并运行do sim.do,看看其PIO仿真。

 

阶段四:基于xapp1052提供的BMD文件,自己搭建DMA工程;搭建DMA仿真环境,之后,运行do sim.do,看看其PIO仿真。若pio仿真pass,则说明DMA工程工程搭建基本正确。

 

阶段五:基于xapp1052提供的PC端软件驱动,基于阶段四搭建的DMA工程,进行板卡测试;

 

板卡依次测试PIO功能,测试DMA功能。

 

在该阶段,需要自己写写PC端的PCIE驱动程序,这一过程或许是痛苦的,但是很有必要!

(看自己能力,是否软硬通吃了)

 

最后,详细学习过程如下:

 

(1)理解掌握TLP报文格式:3DW/4DW报文头格式;完成报文CplD报文格式。这部分资料,网上有很多。

 

(2)自己建一个工程,分析一下其example_design 中的PIO设计,网上有讲解的这部分难度不大。

 

(3)使用modelsim 运行do sim.do,分析一下具体的PIO传输;分析一下官方的PIO仿真是如何搭建仿真环境的。这部分有点难度,也很有用,挺重要的。花点时间认真分析吧!

 

   在深入理解PIO代码及testbench仿真环境搭建之后,可以开始学习DMA操作。

 

(4)以xilinx官方的xapp1052作为学习材料,分析其DMA代码,状态转移。这部分,仅是分析代码和状态机,难度不大。

 

(5)基于xapp1052 BMD文件自己搭建一个DMA工程,使用modelsim运行PIO仿真。若是过了的话,则说明DMA工程搭建基本正确。

 

(6)搭建DMA的仿真环境,使用modelsim 进行DMA仿真。这部分有难度,不好弄。弄不出来就可以跳过了。

 

(7)基于xapp1052提供的PC调试驱动软件,以及步骤5搭建的DMA工程,进行板卡测试。

 

实际调试经验,在进行DMA的学习时,PC端的软件驱动,还是有必要写写的!在PC端实现如何开辟缓存、与PCIE卡进行通信等。

 

 

1.2PCIe的拓扑结构与链接层级

 

RC:根复合体,可以理解为一个超级大管家,负责PCIe总线域到存储器域的地址转换。RC把来自CPU的request转化成PCIe的4种不同的requests(configuration, Memory, I/O, Message)并发送给接在它下面的设备。从软件的角度来看,RC像是一组虚拟的PCI-PCI桥。

 

事务层包(TLP),数据链路层包(DLLP),物理层(PLP)产生于各自所在层,最后通过电或光等介质和另一方通讯。其中数据链路层包(DLLP),物理层(PLP)的包平常不需要关心,在 IP 核中封装好了。

1.3访问机制

PCIe板卡访问PC内存时,板卡向 PC 发送 TLP 包,例如 MWr 包,地址信息就是PC 的物理地址;如果是 MRd 包,那 PC 收到后回复一个完成包,板卡从完成包分析出数据即得到 MRd 读取地址的数据。这是PCIe板卡访问PC.

 

PC访问PCIe板卡,简单的解释,PC 启动是,BIOS 探测所有的外设。对 PCIe设备来说,BIOS 检测到板卡有多少个 BAR 空间,每个空间有多大,然后对应为这些 BAR 空间分配地址。对 PC 设备来说,它能“看”到 PCIe 板卡的空间只有 BAR 空间,也就只能访问这些 BAR 空间。也就是说,板卡可以发送合法的 PCIe TLP 包,并得到 PC 端的相应;但是 PC 端访问板卡被局限在 BAR 空间。

1.4 PCIE 链路训练、枚举扫描、配置BAR的顺序?

 

上电复位后,首先进行链路训练,之后进行枚举扫描、最后进行BAR的配置。

完成基地址配置后,就可以通过memory TLP读写进行寄存器的访问了。

2、链路训练、枚举扫描、配置BAR的过程

 

PCIE首先进行链路训练,上电复位后,链路训练状态机进入L0状态时链路训练完成后进入gen1模式,如果双方支持更高的速率,则立即进行gen2/3、4速率的训练,当链路训练状态机再次进入L0状态,链路训练完成。

 

链路训练完成开始进行枚举扫描,枚举扫描主要目的是CPU需要知道系统中有哪些PCIE 设备,并且为每个设备分配总线号。PCIE的配置读TLP报文中包含响应设备的BFD,因此PCIE设备需要知道自己的bus_number是多少。

 

枚举扫描过程中,CPU会通过配置读TLP读取PCIE配置空间的的verdor id和头标类型寄存器以及其他配置寄存器,此时PCIE返回的读返回TLP报文中complete_id(bus_number、function_number、device_number)为全0,因此此时PCIE不知道自己的bus_number。枚举过程中,CPU完成对PCIE的配置读后,会发起配置写TLP,此时PCIE接受到CPU发来的配第一次置写TLP,会从TLP中解析出bus_number字段存下来。随后的配置读TLP返回中,就会使用bus_number、和function_number和device_number拼接成complete_id。

 

枚举扫描完成后,会配置基地址寄存器,给PCIE分配地址空间。通过对BA0/1、BAR2/3等基地址寄存器先进行写全32’hffff_ffff,得到信息确认PCIE想申请32bit地址还是64bit地址以及向获得的地址空间,从而分配基地址。

 

下面我们举一些实际的例子:

1.CPU读取一个PCIE设备的memory

当CPU想要访问Endpoint时

Step1:CPU让RC产生一个MRd,经过Switch A,Switch B到达Endpoint。

Step2: Endpoint 接受数据包,进行数据读取。

Step3:Endpoint返回一个带有数据的Completion.

Step4: RC接受数据包,给CPU。

 

 

二、什么是BAR?

2.1、简单来说就是基地址,里面包括了type0与type1,type0用于PCIe设备属性,1用于rootport跟switch。一般的type0内最多有6个bar,一旦BAR的值确定了(Have been programmed),其指定范围内的当前设备中的内部寄存器(或内部存储空间)就可以被访问了。当该设备确认某一个请求(Request)中的地址在自己的BAR的范围内,便会接受这请求

三、TLP包的理论基础

2.1弄清3DW/4DW

PCIe中常用的3DW/4DW指的是TLP包存储器地址位宽是32位还是64位

32位宽的存储器,采用3DW;64位宽的存储器,采用4DW。

 

比如,下图是3DW存储器读请求TLP包头,即在下图中存储器地址位宽是32位的。

 

 

与上图对比,下图是 4DW存储器读请求TLP包头,即下图中存储器地址位宽是64位的。

 

 

TLP包字段和参数说明

TLP包是由PCIe的Endpoint或者Root Complex发送的数据包。在PCIe体系中的事务层生成。

 

 

TLP包其实三个部分组成的

TLP包的Hander部分

 

 

1、FMT[1:0]和TYPE[4:0],决定当前TLP报文的事务类型

 

 

 

Length字段

在存储器读请求TLP中并不包含Data Payload,在该报文中,Length字段表示需要从目标设备数据区域读取的数据长度;而在存储器写TLP中,Length字段表示当前报文的DataPayload长度。Length字段的最小单位为DW。当该字段为n时,表示需要获得的数据长度或者当前报文的数据长度为n个DW。值得注意的是,当n等于0时,表示数据长度为1024个DW。

 

DWBE字段

PCIe总线以字节为基本单位进行数据传递,但是Length字段以DW为最小单位。为此TLP使用Last DW BE和First DW BE这两个字段进行字节使能,使得在一个TLP中,有效数据以字节为单位。

 

这两个DW BE字段各由4位组成,其中Last DW BE字段的每一位对应数据Payload最后一个双字的字节使能位;而First DW BE字段的每一位对应数据Payload第一个双字的字节使能位。

 

 

LastDW BE和First DW BE这两个字段的使用规则如下。

 

 

·         如果传送的数据长度在一个对界的双字(DW)之内,则Last DW BE字段为0b0000,而First DW BE的对应位置1;如果数据长度超过1DW,Last DW BE字段一定不能为0b0000。PCIe总线使用LastDW BE字段为0b0000表示所传送的数据在一个对界的DW之内。

 

·         如果传送的数据长度超过1DW,则First DW BE字段至少有一个位使能。不能出现First DW BE为0b0000的情况。

 

·         如果传送的数据长度大于等于3DW,则在First DW BE和Last DW BE字段中不能出现不连续的置1位。

 

·         如果传送的数据长度在1DW之内时,在First DW BE字段中允许有不连续的置1位。此时PCIe总线允许在TLP中传送1个DW的第1,3字节或者第0,2字节。

 

·         如果传送的数据长度为2DW之内时,则First DW BE字段和Last DW BE字段允许有不连续的置1位。

 

值得注意的是,PCIe总线支持一种特殊的读操作,即“Zero-Length”读请求。此时Length字段的长度为1DW,而First DW BE字段和LastDW BE字段都为0b0000,即所有字节都不使能。此时与这个存储器读请求TLP对应的读完成TLP中不包含有效数据。再次提醒读者注意“Zero-Length”读请求使用的Length字段为1,而不是为0,为0表示需要获得的数据长度为1024个DW。

 

“Zero-Length”读请求的引入是为了实现“读刷新”操作,该操作的主要目的是为了确保之前使用Posted方式所传送的数据,到达最终的目的地,与“Zero-Length”读对应的读完成报文中不含有负载,从而提高了PCIe链路的利用率。在PCIe总线中,使用Posted方式进行存储器写时,目标设备不需要向主设备发送回应报文,因此主设备并不知道这个存储器写是否已经达到目的地。而主设备可以使用“读刷新”操作,向目标设备进行读操作来保证存储器写最终到达目的地。

 

RequesterID字段

RequesterID字段包含“生成这个TLP报文”的PCIe设备的总线号(Bus Number)、设备号(Device Number)和功能号(Function Number),其格式如图5‑9所示。对于存储器写请求TLP,Requester ID字段并不是必须的,因为目标设备收到存储器写请求TLP后,不需要完成报文作为应答,因此Requester ID字段对于存储器写请求TLP并没有实际意义。

内存请求 TLP包头结构

 

 

数据完成包的包头结构

 

 

 

DW0部分与前面相同。下面重点介绍与前面一个包不同的部分。

 

注意: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设置,是系统传输数据的最大承载数量。c

     3.包头的Fmt和Type数据表如下:

 

 

下面举例说明:DWBE与地址RCB

 

 

 

 

一定长度的MemR/Wr TLP包是如何发送的?

 

0x1000f8%0x80(128)=0x78(120)。所以还差8个就到达RCB(128).

所以第一个包只能发8个。地址往往不是RCB的整数倍,所以第一个包需要控制数量对到RCB的整数倍上。

还剩下272-8=264个bytes.再发2个128(RCB),即264-256=8个bytes。所以还剩下8个bytes.

==> 所以一共四个包。(8+128+128+8)

或者第2个包发两倍的RCB,即256个。即(8+256+8)

Lower address是第一个有效字节地址的低7位。如果第一个数据First DW BE为4‘b1110,需要往后面顺延一个地址,即地址加一。

 

 

 

 

 

 

TLP包解析示例

下图是一个简单的TLP 包,即包含两个64位的数据。clock0时刻,采样的,64位宽的数据1,clock1时刻,采样的是64位宽的数据2。需要注意,下面的TLP报文是:01a0090f40000001+0403020100000010,这个字节发送顺序,是采用AXI Bit的顺序。因此,举例,若需要解析TLP保温里的Request ID,则其对应的TLP报文是第一个64位宽的数据的高16位,即“01a0=0000_0001_1010_0000”.

这是一个,由于一次发送64位,因此这个报文的前64位是标头,后64位是数据和地址。

按照上图的数据格式可知

    Request ID:16’b0000_0001_1010_0000

    Tag:8’b0000_1001

    Last DW BE:4’b0000

    First DW BE:4’b1111

    Fmt:2’b10

    Type:5’b0_0000

    Length:10’b00_0000_0001

    Data:32’h04030201

    Address:32’h00000010(低两位无效)

 

 

特别说明:

 

上图中的Data:32’h04030201,这个仅是AXI的interface 接口顺序,实际PC写FPGA MEM的数据是32’h01020304.。

 

只有传输的数据data是颠倒的,其他的如 Request ID、 Length、 Address等,都是按照上图的字节顺序。

 

所以 ,要是需要对数据进行解析的话,是需要将data的顺序颠倒一下。比如DMA操作,可能就需要对data进行高低位颠倒一下。

 

下图中是PIO的仿真波形,RX_CTRL是PIO的APP模块数据接口。

 

具体分析如下:

接收到的TLP包为 : 01a0090f40000001+0403020100000010

下图是仿真报告,仿真报告里说写MEM的数据是32’h01020304,与上图显示的AXI用户接口传输的数据位是颠倒的。

 

 

下图是 PIO 的testcase,测试的写MEM数据是32’h01020304。

 

 

下次分享下PIO的代码以及TLP解析组包

 

 

标签:协议,TLP,PCIE,PC,PCIe,字段,DW
From: https://www.cnblogs.com/FPGA-Jenson/p/17620128.html

相关文章

  • 详解UART、USART、SPI、IIC、CAN,以太网等通信协议
    目录详解UART、USART、SPI、IIC、CAN,以太网等通信协议基本通信知识通信协议分类串行和并行同步和异步全双工和半双工波特率UARTUSARTSPIIICCAN以太网详解UART、USART、SPI、IIC、CAN,以太网等通信协议基本通信知识通信协议分类串行和并行串行通信是指利用一条传输线将数据一......
  • 用户空间协议栈设计和netmap综合指南
    本文分享自华为云社区《用户空间协议栈设计和netmap综合指南,将网络效率提升到新高度》,作者:LionLong。协议概念1.1、七层网络模型和五层网络模型应用层: 最接近用户的一层,为用户程序提供网络服务。主要协议有HTTP、FTP、TFTP、SMTP、DNS、POP3、DHCP等。表示层: 数据的表示......
  • MQTT协议入门介绍
    目录MQTT概览MQTT特点MQTT协议的主要特性MQTT主要应用MQTT基于主题(Topic)消息路由MQTTV3.1.1协议报文MQTT消息QoSMQTT会话(CleanSession)MQTT连接保活心跳MQTT遗愿消息(LastWill)MQTT保留消息(RetainedMessage)MQTTWebSocket连接MQTT协议客户端库MQTT与XMPP协议对比MQTT在线......
  • DEVICENET转MODBUS-TCP协议网关ethercat和profinet的区别
     DEVICENET转MODBUS-TCP协议网关JM-DNT-TCP1.产品功能JM–DNT-TCP是自主研发的一款DEVICENET从站功能的通讯网关。该产品主要功能是将DEVICENET总线和MODBUS-TCP网络连接起来。本网关连接到DEVICENET总线中做为从站使用,连接到MODBUS-TCP总线中做为主站或从站使用。2.拓扑......
  • 4--端口协议
    端口的作用一台拥有IP地址的主机可以提供许多服务,比如Web服务、FTP服务、SMTP服务等,这些服务完全可以通过1个IP地址来实现。那么,主机要区分不同的网络服务,显然不能只靠IP地址,因为IP地址与网络服务的关系是一对多的关系。实际上是通过“IP地址+端口号”来区分不同的服务的。 ......
  • Modbus通信协议实践(1)-通过modbusRTU实现TPC7022kt对电流表数据的读取
    需求:1.昆仑通泰TPC7022kt触摸屏2.安装了MCGSpro的PC一台3.能使用RS485通讯协议的数显直流电流表一个 操作步骤:1.以常规1mm电线和双绞线连接电流表和昆仑通泰触摸屏,网线连接触摸屏和pc。2.根据数显直流表的说明书,设置该表的通讯地址为01,波特率为9600,N81无校验位,8个数据位,1......
  • 使用C#配合modbus协议的16进制代码生成crc16校验码的计算方法
    前言在网上也是查看了很多关于crc16校验的文章,但是好像都是对于有基础的人看的,我当时拿起直接使用,发现行不通,这对于零基础的不是很友好,所以决定贡献一篇,哈哈哈哈~~~publicuintCalcCRC16(stringhexCommand){byte[]pBuf=HexStringToByteArray(......
  • 如何用AIRIOT物联网平台接入Modbus通讯协议
    Modbus协议是一种已广泛应用于当今工业控制领域的通用通讯协议。通过此协议,控制器相互之间、或控制器经由网络(如以太网)可以和其它设备之间进行通信。Modbus协议使用的是主从通讯技术,即由主设备主动查询和操作从设备。一般将主控设备方所使用的协议称为ModbusMaster,从设备方使用的......
  • redis协议介绍
    ......
  • C# 使用TouchSocket实现Tcp协议通讯,并且解决分包、粘包的问题
    我们知道如果Socket传输数据太频繁并且数据量级比较大,就很容易出现分包(一个包的内容分成了两份)、粘包(前一个包的内容分成了两份,其中一份连着下一个包的内容)的情况。粘包的处理方式有很多种,常见的三种是:每个包都在头部增加一个当前传输包的int4字节大小作为包头。每次接收到数据......