本文主要是介绍【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 所示。
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 所示。
对于 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.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)。
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 来指示有效地址偏移。
5. 参考
- PCI Express Base Spec 6.0
|
🔥 精选往期 PCIe 协议系列文章,请查看【 PCIe 专栏】🔥
⬆️ 返回顶部 ⬆️
这篇关于【PCIe】First/Last DW Byte Enables 介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!