【PCIe】First/Last DW Byte Enables 介绍

2023-10-27 18:50

本文主要是介绍【PCIe】First/Last DW Byte Enables 介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!



🔥点击查看精选 PCIe 系列文章🔥
🔥点击进入【芯片设计验证】社区,查看更多精彩内容🔥


📢 声明

  • 🥭 作者主页:【MangoPapa的CSDN主页】。
  • ⚠️ 本文首发于CSDN,转载或引用请注明出处【https://mangopapa.blog.csdn.net/article/details/129265044】。
  • ⚠️ 本文目的为 个人学习记录知识分享。因个人能力受限,存在协议解读不正确的可能。若您参考本文进行产品设计或进行其他事项并造成了不良后果,本人不承担相关法律责任。
  • ⚠️ 若本文所采用图片或相关引用侵犯了您的合法权益,请联系我进行删除。
  • 😄 欢迎大家指出文章错误,欢迎同行与我交流 ~
  • 📧 邮箱:mangopapa@yeah.net
  • 💬 直达博主:loveic_lovelife 。(搜索或点击扫码)

文章目录

  • 1. FBE & LBE 简介
  • 2. FBE & LBE 基本规则
    • 2.1 基本规则
    • 2.2 Zero-Read, Zero-Write
  • 3. FBE & LBE 在 TLP Header 中的位置
    • 3.1 Byte Enables @NFM
    • 3.2 Byte Enables @FM
  • 4. FBE 对 CplD 的影响:LA[1:0] 计算
  • 5. 参考




1. FBE & LBE 简介


  在 PCIe 中,Address 字段低 2b 无效(默认 00b),Data Payload 为 DW 地址对齐。在 Axi Bus 中有 Wstrb 来指示 Wdata 相关 Bytes 是否有效,PCIe TLP 中也有类似的机制。PCIe TLP 中提供了 First DW Byte Enable (FBE) 及 Last DW Byte Enable (LBE) 两个 4b 宽的字段分别来指示 TLP Data Payload 的第一个 DW 及最后一个 DW 中的数据 Byte 是否有效。

  FBE 及 LBE 适用于 Memory、IO 及 Configuration 读写请求,Completer 依据 FBE 及 LBE 来完成读写操作。若 FBE 或 LBE 某 bit 为 0,表示该 Byte 数据不能写入 Memory 或不可预取、不可读;若为 1,表示该 Byte 数据必须写入或读出。

  FBE[3:0]、LBE[3:0] 跟地址的对应关系如图 1 所示。

在这里插入图片描述

▲图 1: First/Last DW Byte Enable 位置对应关系


2. FBE & LBE 基本规则


2.1 基本规则

  无论 Flit Mode 还是 Non-Flit Mode,TLP 中的 FBE 及 LBE 应遵循以下规则:

  • 若 Length > 1 DW,FBE 不能为 0000b。
  • 若 Length = 1 DW,LBE 必须为 0000b。
  • 若 Length > 1 DW,LBE 不能为 0000b。
  • 若 Length = 1 DW,FBE 可以不连续。
  • 若 Length = 1 QW 且地址 QW 对齐,FBE 及 LBE 均可以不连续。(1 QW = 2 DW)
  • 若 Length = 1 QW 但地址非 QW 对齐,或 Length ≥ 3 DW,FBE 与 LBE 之间的 1 必须连续。比如 FBE=1100b & LBE=0011b,比如 FBE=1000b & LBE=0111b。

2.2 Zero-Read, Zero-Write

  Data Payload Length = 1 DW 时,PCIe 允许 FBE 及 LBE 均为 0,即 Zero-Length 读写,或称 Zero-Read、Zero-Write。
Zero-Write 和 Zero-Read 是指 PCIe 发送的数据载荷长度为 0 的内存读写请求,常用于 Flush 操作,以确保早前 Posted 发送的数据传输完成。对于 Zero-Write,Length = 1 但是实际不携带 Data Payload;对于 Zero-Read,其对应的 CplD 仍需携带 1 DW Data Payload(协议未指定,可为任意值)。

  注意: PCIe TLP 中不采用 Length = 0 来指示 Zero-Length,是因为 Length = 0 时代表 Data Payload Size 为 1024 DW。



3. FBE & LBE 在 TLP Header 中的位置


3.1 Byte Enables @NFM

  Non-Flit Mode 时, FBE 及 LBE 位于 TLP Header 的 Byte 7,如图 2 所示。

在这里插入图片描述

▲图 2:Location of Byte Enables in TLP Header - Non-Flit Mode

  对于 Memory Write,FBE 及 LBE 在 TLP Header 中的位置如图 3 所示。

  对于 Memory Read 及 DMWr,若 TH 被置一,TLP Header 中原 FBE、LBE 字段不用做 Byte Enbale,而是用来放 ST[7:0](图 4)。此时,若 Length = 1 DW,采用默认值 FBE = 1111b & LBE = 0000b;若 Length > 1 DW,采用默认值 FBE = 1111b & LBE=1111b。

在这里插入图片描述

▲图 3:Location of ST[7:0] in the Memory Write Request Header - Non-Flit Mode

在这里插入图片描述

▲图 4:Location of ST[7:0] in Memory Read, DMWr, and AtomicOp Request Headers - Non-Flit Mode

3.2 Byte Enables @FM

  PCIe 工作于 Flit Mode 时,对于不同的请求类型,FBE/LBE 位于不同类型的 OHC-A 中。Flit Mode 时,ST 字段为占用 FBE 及 LBE,而是在单独的 OHC-B 中。

  对于 Memory 请求,FBE 及 LBE 位于 OHC-A1 中(图 5)。实际情况中,若 Length ≥ 2 DW,允许不携带 OHC-A1,此时 FBE 及 LBE 均默认为 1111b。若 FBE 或 LBE 非全 1,必须携带 OHC-A1。

  对于 IO 请求,FBE 及 LBE 位于 OHC-A2 中,其 TLP Header 中必须携带 OHC-A2(图 6)。

  对于 Configuration 请求,FBE 及 LBE 位于 OHC-A3 中,其 TLP Header 中必须携带 OHC-A3(图 7)。

在这里插入图片描述

▲图 5:OHC-A1

在这里插入图片描述

▲图 6:OHC-A2

在这里插入图片描述

▲图 7:OHC-A3


4. FBE 对 CplD 的影响:LA[1:0] 计算


  在 Memory、IO 或 Configuration 请求中,有 FBE 及 LBE 来指示相关 Bytes 是否有效。对于 FBE 或 LBE 非全 1 的请求,其 CplD 中相关 Bytes 也并非全部有效。在 CplD 中,其 Header 中并不含有 FBE 或 LBE,该如何指示相关 Bytes 是否有效呢?当然,CplD 中可以不给任何指示,请求方自己知道哪些 Byte 是有效的,哪些能用哪些不能用完全由请求方自己保证。

  跟 FBE 相匹配的,PCIe Memory Read 的 CplD 提供了 Lower Address (LA[6:0]) 字段来标识 Data Payload 的起始地址。再说细一点,用以指明当前 Completion 所携带 Data Payload 的起始 Byte 地址,LA[1:0] 指示当前 CplD 第一有效 Byte 在当前 Address 上的地址偏移。对于 AtomicOp,LA[1:0] 预留,此外其他类型请求的 CplD LA[1:0] 为 0。下文 LA[1:0] 计算仅针对 Memory Read 请求的 CplD。

  若 FBE = xxx1b/0000b,LA[1:0] = 00b,地址偏移 0;若 FBE = xx10,LA[1:0] = 01b,地址偏移 1;若 FBE = x100,LA[1:0] = 10b,地址偏移 2;若 FBE = 1000,LA[1:0] = 11b,地址偏移 3。
对于 Non-Flit Mode,LA[6:0] 全部位于 Cpl Header 中 (图 8);对于 Flit Mode,LA[6:2] 位于 Header Base(图 9),LA[1:0] 位于 OHC-A5 中(图 10)。这也意味着,Flit Mode 时,对于 FBE 非全 1 的请求,其 CplD 需要添加 OHC-A5 来指示有效地址偏移。

在这里插入图片描述

▲图 8:Completion Header Format - Non-Flit Mode

在这里插入图片描述

▲图 9:Completion Header Base Format - Flit Mode

在这里插入图片描述

▲图 10:OHC-A5


5. 参考


  • PCI Express Base Spec 6.0


— END —


🔥 精选往期 PCIe 协议系列文章,请查看【 PCIe 专栏】🔥

⬆️ 返回顶部 ⬆️

这篇关于【PCIe】First/Last DW Byte Enables 介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/287661

相关文章

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}

C++——stack、queue的实现及deque的介绍

目录 1.stack与queue的实现 1.1stack的实现  1.2 queue的实现 2.重温vector、list、stack、queue的介绍 2.1 STL标准库中stack和queue的底层结构  3.deque的简单介绍 3.1为什么选择deque作为stack和queue的底层默认容器  3.2 STL中对stack与queue的模拟实现 ①stack模拟实现

如何编写Linux PCIe设备驱动器 之二

如何编写Linux PCIe设备驱动器 之二 功能(capability)集功能(capability)APIs通过pci_bus_read_config完成功能存取功能APIs参数pos常量值PCI功能结构 PCI功能IDMSI功能电源功率管理功能 功能(capability)集 功能(capability)APIs int pcie_capability_read_wo

Mysql BLOB类型介绍

BLOB类型的字段用于存储二进制数据 在MySQL中,BLOB类型,包括:TinyBlob、Blob、MediumBlob、LongBlob,这几个类型之间的唯一区别是在存储的大小不同。 TinyBlob 最大 255 Blob 最大 65K MediumBlob 最大 16M LongBlob 最大 4G

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

nginx介绍及常用功能

什么是nginx nginx跟Apache一样,是一个web服务器(网站服务器),通过HTTP协议提供各种网络服务。 Apache:重量级的,不支持高并发的服务器。在Apache上运行数以万计的并发访问,会导致服务器消耗大量内存。操作系统对其进行进程或线程间的切换也消耗了大量的CPU资源,导致HTTP请求的平均响应速度降低。这些都决定了Apache不可能成为高性能WEB服务器  nginx:

多路转接之select(fd_set介绍,参数详细介绍),实现非阻塞式网络通信

目录 多路转接之select 引入 介绍 fd_set 函数原型 nfds readfds / writefds / exceptfds readfds  总结  fd_set操作接口  timeout timevalue 结构体 传入值 返回值 代码 注意点 -- 调用函数 select的参数填充  获取新连接 注意点 -- 通信时的调用函数 添加新fd到