首页 > 其他分享 >高级FPGA开发之基础协议之PCIe(二)

高级FPGA开发之基础协议之PCIe(二)

时间:2024-02-07 11:01:15浏览次数:26  
标签:TLP 请求 FPGA 报文 高级 PCIe 字段 设备

高级FPGA开发之基础协议之PCIe(二)

一、TLP报文类型

在PCIe总线中,存储器读写、I/O读写和配置读写请求TLP主要由以下几类报文组成:

高级FPGA开发之基础协议之PCIe(二)_PCIe


1.1 存储器读请求TLP和读完成TLP

当PCIe主设备(RC或者EP)访问目标设备的存储器空间时,使用non-posted总线事务向目标设备发出存储器读请求TLP,目标设备收到这个存储器读请求tlp后,使用存储器读完成tlp,主动向主设备传递数据。当主设备收到目标设备的存储器读完成tlp后,将完成一次存储器读请求。

1.2 存储器写请求tlp

在PCIe总线中,存储器写使用posted总线事务。PCIe主设备仅使用存储器写请求tlp即可完成存储器写操作,主设备不需要目标设备的回应报文。

1.3 原子操作请求和完成报文

原子操作由PCIe V2.1总线规范引入,一个完整的原子操作包括原子操作请求和原子操作完成报文组成。 原子操作的使用方法与其他non-posted总线事务类似。 首先PCIe主设备向目标发送原子操作请求,之后目标设备向主设备发送原子操作完成报文,结束一次原子操作。

1.4 IO读写请求TLP和读写完成TLP

在PCIe总线中,IO读写操作使用non-posted,IO读写TLP读需要完成报文作为回应。只是在IO写请求的完成报文中不需要”带数据“,而仅含有IO写请求是否成功的状态信息。

1.5 配置读写TLP和配置读写完成TLP

从总线事务的角度来看,配置读写请求的操作工程和IO读写操作的过程类似。 配置读写请求 TLP 都需要配置读写完成作为应答,从而完成一个完成的配置读写操作。

1.6 消息报文

和PCI总线相比,PCIe总线增加了消息请求事务。PCIe总线使用基于报文的数据传送模式,所有总线都是通过报文实现的,PCIe总线取消了一些在PCI总线中存在的边带信号。 在PCIe总线中,一些由PCI总线的边带信号完成的工作,比如中断请求和电源管理等,在PCIe总线中由消息请求报文实现。

二、TLP报文详解

2.1 存储器读写请求TLP

存储器读写请求TLP的格式如下图:

高级FPGA开发之基础协议之PCIe(二)_PCIe_02


高级FPGA开发之基础协议之PCIe(二)_FPGA_03


在PCIe总线上,存储器写请求TLP使用posted数据传送方式。而其他与存储器和IO相关的报文都使用split方式进行数据传送,这些请求报文需要完成报文,存储器读写请求TLP使用地址路由方式进行数据传递。

length段

在存储器读请求TLP中,length字段表示需要从目标设备数据区域读取的数据长度。

在存储器写TLP中,length字段表示当前报文的data payload长度。

length字段的最小单位是DW。当字段为n时,表示需要获取的数据长度或者当前报文的数据长度为n个DW。注意n=0,表示长度为1024的DW。

DW BE字段

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

这两个

高级FPGA开发之基础协议之PCIe(二)_TLP_04


“Zero-Length”读请求的引入是为了实现“读刷新”操作,该操作的主要目的是为了确保之前使用 Posted 方式所传送的数据,到达最终的目的地,与“Zero-Length”读对应的读完成报文中不含有负载,从而提高了 PCIe 链路的利用率。

requester ID

requester ID字段包含生成这个TLP报文的PCIe设备的总线号(bus number)、设备号(device number)、功能号(function number)。

对于non-posted数据请求,目标设备需要使用完成报文作为回应。在这个完成报文中,需要使用源设备的requester ID字段

因此在non-posted数据请求TLP中,如存储器读请求、IO和配置读写请求、必须使用requester ID字段。

IO读写请求TLP规则

I/O 读写请求 TLP 只能使用32位地址模式和基于地址的路由方式且只能使用 Non-Posted 方式进行传递。

2.2 完成报文TLP

PCIe 总线支持 Split 传送方式,目标设备使用完成报文向源设备主动发送数据。

完成报文使用

所有的数据读请求,包括存储器、I/O 读请求、配置读请求和原子操作请求。当一个PCIe设备发出这些数据请求报文后,必须收到目标设备的完成报文后,才能结束一次数据传送。这一类完成报文必须包含

高级FPGA开发之基础协议之PCIe(二)_FPGA_05


requester ID和tag字段

完成报文使用ID路由方式。完成报文头的长度为3DW,完成报文头中包含了transaction ID,由requester ID和tag字段组成,这个ID必须和源设备发送的数据请求报文的tansaction ID对应,完成报文使用transaction ID进行ID路由,并将数据发送给源设备。

当PCIe设备收到存储器读、IO读写或者配置读写请求TLP时,需要首先保证保存这些报文的transaction ID,之后当该设备准备好完成报文后,将完成报文requester ID和tag ID字段赋值为之前保存的transaction ID字段。

completer ID字段

completer ID字段的含义与requester ID字段较为相似,只是该字段存放发送完成报文的PCIe设备的ID号。

PCIe设备进行数据请求时需要在TLP字段中包含requester ID字段,而完成报文结束数据请求时,需要提供completer ID字段。

status字段

status字段保存当前完成报文的完成状态,表示当前TLP是正确地将数据传递给数据请求端,还是在数据传输过程中出现错误,或者要求数据请求方式进行重试。

高级FPGA开发之基础协议之PCIe(二)_TLP_06


BCM 位与 Byte Count 字段

bcm(byte count modified)字段由pci-x设备设置的。

pci-x设备也支持split transaction传送方式。当pci-x设备进行存储读请求时,且目标设备不一定一次将所有数据传递给源设备。此时目标设备在进行第一次数据传送时,需要设置byte count字段和bcm位。

bcm位表示byte count字段是否被更改,该位仅对pci-x设备有效,而PCIe设备不能操作BCN位。

byte count字段记录源设备还需要从目标设备中,获取多少字节的数据就能完成全部数据传递,当前的TLP中的有效负载也被byte count字段统计在内。该字段由12位组成。

该字段为0b0000-0000-0001表示还剩一个字节,为0b1111-1111-1111表示还剩4095个字节,而为0b0000-0000-0000表示还剩4096个字节。

除了存储器读请求的完成报文外,大多数完成报文的 Byte Count 字段为4。

lower address字段

如果当前完成报文为存储器读完成TLP,该字段存放在存储器读完成TLP中第一个数据所对应地址的最低位。

值得注意的是,在读完成报文中,并不存在first DW BE和last DW BE字段。

因此接收端必须使用存储器读完成

配置读写请求

配置读写请求

高级FPGA开发之基础协议之PCIe(二)_FPGA_07


消息请求报文

高级FPGA开发之基础协议之PCIe(二)_FPGA_08


PCIe 总线规定了以下几类消息报文:

INTx 中断消息报文(INTx Interrupt Signaling); 电源管理消息报文(Power Management); 错误消息报文(Error Signaling); 锁定事务消息报文(Locked Transaction Support); 插槽电源限制消息报文(Slot Power Limit Support); Vendor-Defined Messages;

三、TLP中与数据负载相关的参数

Max_Payload_Size 参数

PCIe 总线规定在 TLP 报文中,数据有效负载的最大值为4KB,但是 PCIe 设备并不一定能够发送这么大的数据报文。PCIe 设备含有“Max_Payload_Size”和“Max_Payload_SizeSupported”参数,这两个参数分别在Device Capability 寄存器Device Control寄存器中定义。

PCIe设备发送数据报文时,使用Max_Payload_Size 参数决定分割为多个进行发送。

Max_Payload_Size参数的大小与

Max_Read_Request_Size 参数

Max_Read_Request_Size 参数由 PCIe 设备决定,该参数规定了 PCIe 设备一次能从目标设备读取多少数据。

PCIe 总线规定存储器读请求,其读取的数据长度不能超过 Max_Read_Request_Size 参数,即存储器读 TLP 中的 Length 字段不能大于这个参数。如果一次存储器读操作需要读取的数据范围大于 Max_Read_Request_Size 参数时,该 PCIe 设备需要向目标设备发送多个存储器读请求 TLP。

RCB 参数

RCB 位在 Link Control 寄存器中定义。RCB 位决定了 RCB 参数的值,在 PCIe 总线中,RCB 参数的大小为64B 或者128B,如果一个 PCIe 设备没有设置 RCB 的大小,则 RC 的 RCB参数缺省值为64B,而其他 PCIe 设备的 RCB 参数的缺省值为128B。PCIe 总线规定 RC 的 RCB参数的值为64B 或者128B,其他 PCIe 设备的 RCB 参数为128B。

Read Completion Boundary (RCB),读完成边界,是


第一笔completion必须开始于request的起始地址,当request的length不大于RCB时不进行切分,当request的length大于RCB时在RCB处结束。

最后一笔completion返回的地址必须满足所有completion payload长度满足request的length。 所有中间的completions payload大小必须满足RCB。

1. Read request length 不大于RCB

例如RCB为128 Byte,read request length 小于128 Byte。这时不会返回multi-completions,所以不会对返回包进行切分,从request的起始地址读够length长度的数据返回。

Read request length 大于RCB,这种情况会返回multi-completions,且与起始地址有关系

例如:

1. 例如RCB为128 Byte,read request length 为200 Bytes,起始地址为0X60。这时会有三笔completion返回, 第一笔从0X60开始读取32 Bytes数据,第二笔数据从0X80开始读取128 Bytes数据,第三笔从0X100地址开始读取40 Bytes数据。 2. 例如RCB为128 Byte,read request length 为200 Bytes,起始地址为0X10。这时会有两笔completion返回, 第一笔从0X10开始读取112 Bytes数据,第二笔数据从0X80开始读取88 Bytes数据。

四、未完待续

下章将继续介绍:FPGA IP核的相关概念。
欢迎关注知乎:北京不北;
+v:beijing_bubei 
欢迎关注douyin:near.X (北京不北) 
获得免费答疑,长期技术交流。

五、参考文献

https://blog.csdn.net/qq_21186033/article/details/117124757

https://blog.csdn.net/holden_liu/article/details/91445728

标签:TLP,请求,FPGA,报文,高级,PCIe,字段,设备
From: https://blog.51cto.com/u_16419576/9635121

相关文章

  • bcdedit是Windows操作系统中的一个命令行工具,用于查看和修改启动配置数据(BCD)。启动配
    bcdedit是什么bcdedit是Windows操作系统中的一个命令行工具,用于查看和修改启动配置数据(BCD)。启动配置数据存储重要的启动信息,包括启动加载程序和启动设置。这个工具主要由高级用户、系统管理员和开发人员使用,以调整与系统启动相关的各种参数。为什么使用bcdedit修改启动设置......
  • Angular 17+ 高级教程 – NgModule
    前言NgModule在Angularv14以前是一门必修课。然而,自Angularv14推出StandaloneComponent以后,它的地位变得越来越边缘化。本教程从开篇到本篇,所有例子使用的都是 StandaloneComponent,一点NgModule的影子也没有......
  • 全国产T3+FPGA的SPI与I2C通信方案分享
    近年来,随着中国新基建、中国制造2025规划的持续推进,单ARM处理器越来越难胜任工业现场的功能要求,特别是如今能源电力、工业控制、智慧医疗等行业,往往更需要ARM+FPGA架构的处理器平台来实现例如多路/高速AD采集、多路网口、多路串口、多路/高速并行DI/DO、高速数据并行处理等特定......
  • [office] 学会LOOKUP函数这个高级用法,多条件查询就很容易了!
    如下表,是某快递公司价格表,每当查询价格时,会涉及很多条件,始发地、目的地、重量区域等,在全部条件判断完之后,还得与最低价进行比较,取两者之间的最大值。价格表如下:查询表如下:举例,始发地为义乌,目的地是北京,重量为1680.57,对应价格为1.6。金额为:=1680.57*1.6,算出金额之后,再与最低价200相......
  • NTFS(New Technology File System)是Windows操作系统中使用的一种文件系统,它具有高级功
    NTFS(NewTechnologyFileSystem)是Windows操作系统中使用的一种文件系统,它具有高级功能和性能。NTFS文件系统的模型基于多个概念和组件,包括文件、目录、磁盘空间分配、访问控制等。下面是NTFS文件系统的技术原理和运作机制的简要介绍:文件和目录:NTFS使用树状结构组织文件和目录......
  • 第五章:SQL高级处理
    第五章:SQL高级处理5.1窗口函数5.1.1窗口函数概念及基本的使用方法窗口函数也称为OLAP函数。OLAP是OnLineAnalyticalProcessing的简称,意思是对数据库数据进行实时分析处理。为了便于理解,称之为窗口函数。常规的SELECT语句都是对整张表进行查询,而窗口函数可以让我们有选......
  • 几个高级 JavaScript 技巧
    赋值解构:赋值解构是一种从数组或对象中提取值并将其分配给变量的简洁方法。它简化了代码并提高了可读性。对于数组,您可以使用方括号表示法,对于对象可以使用大括号。扩展语法:可以使用扩展语法将数组的元素或对象的属性扩展到另一个数组或对象。这对于制作副本、合并对象以及将多个......
  • lua 语法介绍与 NGINX lua 高级用法实战操作
    目录一、概述二、lua安装三、lua语法1)lua数据类型2)lua变量3)lua拼接字符串4)lua循环5)lua函数6)lua条件控制7)lua库模块四、NGINXlua高级用法一、概述lua是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活......
  • Angular 17+ 高级教程 – HttpClient
    前言HttpClient是Angular对 XMLHttpRequest和 Fetch的封装。HttpClient的DX(DeveloperExperience)比 XMLHttpRequest和 Fetch都好,只是学习成本比较高,因为它融入了RxJS概念。要深入理解HttpClient最好先掌握3个基础技能:XMLHttpRequest--看这篇Fetch......
  • 20240201-高级数据结构随记
    intmain(){intn;cin>>n;for(inti=1;i<=n;i++){scanf("%d",&a[i]);sum[i]=sum[i-1]+a[i];}intmn=sum[0];for(inti=1;i<=n;i++){//枚举右端点if(sum[i]-mn>ans)ans=sum[i]-mn;......