为什么PCIe TLP标头有“Last DW BE”和“First DW BE”?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么PCIe TLP标头有“Last DW BE”和“First DW BE”?相关的知识,希望对你有一定的参考价值。

我遇到了与PCIe相关的问题。我使用驱动程序将0x12345678写入BAR0 +偏移量,并使用Xilinx Chipscope查看波形。在我们的英特尔Rangeley板上,我们看到TLP有效载荷分为两个DW,即00_00_00_78 56_34_12_00,而在戴尔PC上,我们看到有效载荷中只有一个DW。我确信两种情况都符合PCIe规范。

但我真的很想知道,为什么PCIe规范会有这种设计,即TLP头的第二个DW中的“Last DW BE”和“First DW BE”?

答案

您的问题涉及内存请求PCI传输,对于您的问题,可以将其调整为4个参数:地址,长度,第一个双字节字节启用和最后一个双字节字节启用。

地址和长度是双字对齐的,即PCI规范的address[1:0] = 0。那么如果你想写一个字节会怎么样?或者在非双字对齐的地址,如0x3567?您强制写入至少1个dword,但您不想删除相邻的字节。这就是第一个DW BE发挥作用的地方。例如,要将1个字节写入地址0x3567,您将拥有:

  • 地址= 0x3564,因为双向对齐
  • 长度= 1 dword,允许的最小尺寸
  • 第一个DW BE = 0b1000,只有第四个字节有效
  • 最后DW BE = 0b0000,没有字节有效

类似地,当您的传输未在双边界上结束时,最后一个DW BE将起作用。例如,如果要在地址6处写入27个字节:

  • 地址= 4,因为双字对齐
  • 长度= 7,因为它必须是dword倍数
  • 第一个DW BE = 0b1100,因为在地址4只有高2字节有效(地址4和5无效)
  • 最后DW BE = 0b0001,因为在地址4 + 6 * 4只有第一个字节有效(地址4 + 6 * 4 + 1,4 + 6 * 4 + 2和4 + 6 * 4 + 3无效)

以上是关于为什么PCIe TLP标头有“Last DW BE”和“First DW BE”?的主要内容,如果未能解决你的问题,请参考以下文章

PCIe学习笔记(15)--- TLP的ROUTING方式

RK3399平台开发系列讲解(高速设备驱动篇)6.56PCIe事务包(TLP)详解

PCIe Max_Payload_Size 和 Max_Read_Request_Size

017 PCIe总线的事务层

PCIe物理层逻辑部分基础

PCIe调试心得_DMA part3