【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

相关文章

Pytest多环境切换的常见方法介绍

《Pytest多环境切换的常见方法介绍》Pytest作为自动化测试的主力框架,如何实现本地、测试、预发、生产环境的灵活切换,本文总结了通过pytest框架实现自由环境切换的几种方法,大家可以根据需要进... 目录1.pytest-base-url2.hooks函数3.yml和fixture结论你是否也遇到过

MySQL中慢SQL优化的不同方式介绍

《MySQL中慢SQL优化的不同方式介绍》慢SQL的优化,主要从两个方面考虑,SQL语句本身的优化,以及数据库设计的优化,下面小编就来给大家介绍一下有哪些方式可以优化慢SQL吧... 目录避免不必要的列分页优化索引优化JOIN 的优化排序优化UNION 优化慢 SQL 的优化,主要从两个方面考虑,SQL 语

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

Python实现html转png的完美方案介绍

《Python实现html转png的完美方案介绍》这篇文章主要为大家详细介绍了如何使用Python实现html转png功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 1.增强稳定性与错误处理建议使用三层异常捕获结构:try: with sync_playwright(

Java使用多线程处理未知任务数的方案介绍

《Java使用多线程处理未知任务数的方案介绍》这篇文章主要为大家详细介绍了Java如何使用多线程实现处理未知任务数,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 知道任务个数,你可以定义好线程数规则,生成线程数去跑代码说明:1.虚拟线程池:使用 Executors.newVir

Java实现将byte[]转换为File对象

《Java实现将byte[]转换为File对象》这篇文章将通过一个简单的例子为大家演示Java如何实现byte[]转换为File对象,并将其上传到外部服务器,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言1. 问题背景2. 环境准备3. 实现步骤3.1 从 URL 获取图片字节数据3.2 将字节数组

JAVA SE包装类和泛型详细介绍及说明方法

《JAVASE包装类和泛型详细介绍及说明方法》:本文主要介绍JAVASE包装类和泛型的相关资料,包括基本数据类型与包装类的对应关系,以及装箱和拆箱的概念,并重点讲解了自动装箱和自动拆箱的机制,文... 目录1. 包装类1.1 基本数据类型和对应的包装类1.2 装箱和拆箱1.3 自动装箱和自动拆箱2. 泛型2

四种Flutter子页面向父组件传递数据的方法介绍

《四种Flutter子页面向父组件传递数据的方法介绍》在Flutter中,如果父组件需要调用子组件的方法,可以通过常用的四种方式实现,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录方法 1:使用 GlobalKey 和 State 调用子组件方法方法 2:通过回调函数(Callb

Python进阶之Excel基本操作介绍

《Python进阶之Excel基本操作介绍》在现实中,很多工作都需要与数据打交道,Excel作为常用的数据处理工具,一直备受人们的青睐,本文主要为大家介绍了一些Python中Excel的基本操作,希望... 目录概述写入使用 xlwt使用 XlsxWriter读取修改概述在现实中,很多工作都需要与数据打交

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.