当前位置:   article > 正文

新手学习Vivado XDMA (1) - 配置详细分析_xdma 读写 bar 地址空间和 dma 内 存地址空间

xdma 读写 bar 地址空间和 dma 内 存地址空间

首先感谢 Xilinx XDMA 例程代码分析与仿真结果_xdma仿真-CSDN博客 的作者,也让我对XMDA有了比较多的认识,本文会从一个完全是新手的角度去理解和分析XDMA的使用,所以一旦中途有什么不懂的地方就会跳到相关的知识点进行补充说明,但因为知识浅薄,难免有理解分析出错的地方,欢迎留言反馈,共同进步。本文主要针对 XDMA (DMA/Bridge Subsystem for PCI Express) 进行了详细的配置分析,确保懂得每一个知识点,知道如何配置。


PCIe 基础知识

有毅力的朋友可以先去学习下基础知识,强烈安利这个网站: PCIe扫盲系列博文连载目录篇(第一阶段)-Felix-电子技术应用-AET-中国科技核心期刊-最丰富的电子设计资源平台 (chinaaet.com)。不过笔者有时候喜欢‘急功近利“,但遇到问题就需要跳出来学习,因为有时候这样记得住一点,和问题结合下理解也深入一点。各有千秋吧。所以我们就先跳过这部分,下面就让我们开始吧。


DMA IP 生成

我们使用的是 AMD 的 DMA/Bridge Subsystem for PCI Express (amd.com)。本文以Vivado 2020_2 版本为例进行说明。

首先打开 Vivado,建立一个空白工程。因为使用的是XDMA IP,并且想借用IP的example进行分析,所以可以通过以下两种途径打开,但不知为何第一种无法打开 example design,所以只能以第二种方式继续往下写。

工程名称默认即可:

在Diagram窗口中查找DMA IP 并双击会出现的图形化模块

双击xdma_0模块就会出现配置界面,下面针对配置进行逐一分析。


IP 配置分析

Basic

Basic 页面就是笔者选择的配置:

  • Functional Mode: 可以看出目前 Artix 7 只支持DMA模式
  • Mode: 选择Basic 就够用了
  • Device: 也选择不了其他的,我们的应用是作为EP(End Point), 也就是类似显卡插在 PC 主机的 PCIe 插槽里,所以可以理解为 EP, 还有个 RP(Root Point) 概念,PC 主机(CPU)就可以称为 RP。
  • PCIe Block Location: 对于我选择的这一款 FPGA 来说,只有一个位置可以选,规模大点的FPGA应该支持多个位置,注意 DMA 这个 IP 把 PCIe 的硬core 也包含进来了,所以这里需要我们选择 PCIe 对外的接口位置。
  • Lane Width: 可以理解为 PCIe 数据通信的通道数量,X2 就是支持2个通道。不同的PCIe 版本不同的通道数量,最终的吞吐量也是不一样的。下图(来自网络)显示的是不同的通道数和对应的吞吐量。举个例子,笔者的PCIe 开发板是2.0接口的,那么对应的传数速率等级为 5GT/s, 可以理解为 每秒传输bit数为 5Gbps,但由于是 8b10b编码,所以是5*8/10=4Gbps=500MB/s。笔者的PCIe 接口是 x4的,但因为FPGA 的另外两个接了 SFP 光口,所以只能用x2,即 2个lanes。所以最终理论可达1GB/s。另外补充下 1个lane 就是1对 TX/RX,而每个 TX/RX 都是一对差分信号线。

  • Mamimum Link Speed: 笔者的板卡是 PCIe 2.0版本,所以应该选择 5GT/s,或者我们不能用“应该”这个词,需要用“最高”。因为PCIe 是向下兼容的,所以即使硬件是 2.0的版本,我们可以用1.0的配置,把 2.0 的设备当作1.0的设备来用。
  • Reference Clock Frequency(MHz): PCIe 参考时钟,来自PCIe 接口(笔者的接口时钟是100MHz),或者通过CDR 从数据中恢复出来,可以参考: PCIe扫盲——关于PCIe参考时钟的讨论-Felix-电子技术应用-AET-中国科技核心期刊-最丰富的电子设计资源平台 (chinaaet.com)。 PCIe spec 推荐的时钟方案是Common Refclk (Shared Refclk) Architecture
  • AXI Data Width: 目前只能选64bits。
  • AXI Clock Frequency: 笔者理解,这个和 FPGA 系统设计相关,就看自己的项目中需要怎么样的时钟,这里选择125MHz
  • DMA Interface option: 对于用户侧来说,DMA的访问方式可以有AXI-MM和AXI-S 两种方式,如果Host(RP)需要基于FPGA 内部 AXI 地址总线访问的那么就可以选择 AXI-MM
  • AXI-Lite Slave interface: 如果勾选此接口,可以通过用户侧访问 DMA/Bridge Subsystem for PCIe 这个IP 的相关寄存器。
  • Enable PIPE Simulation: DMA子系统支持 PIPE 模式仿真,即内核的 PIPE 接口与链路合作伙伴的 PIPE 接口相连。该模式可提高仿真速度。在EP模式或RP模式下启用 PIPE 模式仿真。外部 PIPE 接口信号在内核边界生成,用于访问外部设备。启用此功能还可提供必要的钩子,以使用第三方 PCI Express VIP/BFM 代替示例设计中提供的RP模型。这里先不启用此功能。
  • Enable GT Channel DRP Ports: Dynamic reconfiguration port(DRP), 通过此端口,可以动态的更改GT收发器的参数,我们先不勾选(限于篇幅不展开分析)
  • Enable PCIe DRP Ports: Dynamic reconfiguration port(DRP), 通过此端口,可以动态的更改PCIe的参数,我们先不勾选(限于篇幅不展开分析)
  • Additional Transceiver Control and status ports: 顾名思义,对收发器的附件控制和状态获取,我们先不勾选(限于篇幅不展开分析)
  • Enable Lane Reversal: 此功能不建议开启。设置此功能的目的主要是为了能让PCIe 接口的板上布线更加灵活一点,但不是所有的反转都是支持的,需要慎重考虑。可以参考 Lane Reversal • UltraScale+ Devices Integrated Block for PCI Express Product Guide (PG213) • Reader • AMD Adaptive Computing Documentation Portal (xilinx.com)

PCIe ID

这页不需要更改配置,默认就行,但可以解释下。

ID initial Values

  • Vendor ID: 10EE 是Xilinx 公司的设备(FPGA PCIe)的ID,由PCI Special Interest Group指定,ID唯一。
  • Device ID: 以这里的7022为例,7表示7系列器件,如果是8和9那么代表是的 UltraScale和UltraScale+器件。0代表EP(显然,1代表RP)。第1个2表示lane的数量,即X2,注意最多的X16需要用F来表示。第2个2表示当前PCIe EP的版本,这里就是PCIe Gen2(2.x)。
  • Revision ID: 表示器件ID的扩展,暂时不用关心
  • Subsystem Vendor ID: 子系统供应商ID, 对于Xilinx来说,因为是同一家公司,所以这里和Vendor ID保持一致,如果不一致,可能会出现问题(看到有其他人这么分析过,笔者没有证实)。
  • Subsystem ID: 和Device ID类似,我们选择默认即可。
  • Enable PCIe-ID interface: 勾选以后,会有pcie_id的接口,我们不需要读取此ID,Host 通过协议可以访问到相关ID。

Class Code

在开始解释说明之前,我们需要跳出来学习一个PCIe 配置空间的概念。其实,PCI有三个相互独立的物理地址空间: memory地址空间、I/O地址空间和配置空间。我们可以通过读取配置空间获得设备的信息,也可以通过配置空间来配置设备。下图显示了EP模式下配置空间的Header(64 DWs):

其中第03个DW高3个字节就是Class Code. 具体解释可以参考: PCIe配置空间(PCIE Configuration Space) – 类型码(Class Code) - 码峰编程笔记 (cfnotes.com)

笔者将一个包含此IP的bit文件烧写进开发板后,安装了 TeleScan PE 软件获取到PCIe开发板的如下信息: 

从第一句话中可见系统已经成功识别了这是来自Xilinx公司的PCIe 设备。Class的配置和我们配置界面 070001 也是一致的。

PCIe : BARs

这里有3个接口可以选择,如果都勾选上了,那么根据定义分为为:BAR0,BAR1,BAR2

BAR0

  • PCIe to AXI Lite Master Interface: 通过这个接口 Host 和可以和用户侧的逻辑进行通信,譬如中断,控制等非大数据量搬运的场景。
  • size: 表示用户侧的需要设计的地址空间大小,scale表示其单位。该地址空间可以是由多个应用端口组成,但最后的地址不能超过这里size 设置的空间大小。
  • value: 该值跟随size的变化而变化,对这点笔者花了较多时间去理解,即使是 Vivado 官方文档里的解释笔者仍然不是特别清楚,最后偶然发现有人描述了 BAR 的握手确认机制,所以大概率是以下解释。以下图为例,当系统起来的时候,BAR 地址会是未初始化的状态,图中显示的是4KB 用户空间,当我们配置4KB大小的时候,value显示的是0xFFFFF000, 这意味着低12bits 是不可写入的。第2步,Host (譬如BIOS)会向BAR地址写全1并回读,发现高20bits 都为1,但低12bits 都为0,此时 BIOS 就知道该用户空间的地址的最小单位是4KB。并且回读时还会获取到低4bits的信息,因为当前配置参数时Memory,32bits,不预取,所以低4位都是0.

 

  • PCIe to AXI Translation: 该地址需要被理解位PCIe在系统中的地址到FPGA内部AXI地址的映射关系。以下图为例,PCIe的BAR0起始地址为0x8400_0000,如果Host 想访问 AXI Space下的GPIO中的偏移地址为0x1000的内部寄存器,那么Host的访问地址就应该为0x8400_1000。请注意,这里的0x4000_0000就是配置页面中需要我们手动输入的值。

 

BAR1

DMA空间,这里IP隐藏了一些配置,DMA需要256KB地址,这是默认设置。

BAR2

和BAR0的配置理解一致。

PCIe: MISC

  • User Interrupts: 最大支持16个用户中断,这里选择1个作为示例就行
  • 中断请求类型有三种,Legacy/MSI/MSI-X, 查阅相关资料后发现,目前最流行的时MSI-X,其他两种应该会慢慢过时,具体区别大家可去百度搜索下。对于MSI-X本身的理解,这篇文章解释的比较好:PCIe中断机制(4): MSI和MSI-X - 知乎 (zhihu.com)这里写下笔者其他的理解。用户逻辑侧产生的中断请求会发给XDMA接口'usr_irq_req'上,然后IP 会自动产生MSIX capability structure并通过事务层封装好memory write类型的 transaction 数据包发给Host。这个请求需要被一直拉高直到 'usr_irq_ack' 确定请求已被确认(被谁确认?XDMA还是Host?)。另外,如果这三种或者两种中断请求都使能了,那么IP 会按照如下优先级来工作,MSI-X -> MSI -> Legacy, 当使用了高优先级中断请求类型,那么低优先级的就无效了。
  • Extended Tag Field: Tag 这里的意思是PCIe TLP 包中的一个field,如下图:这个表示是由请求方产生的,可以和Request ID组成一个唯一的ID保证唯一性,可以用来识别应答信息,可以用于包过滤。

  • Configuration Management Interface:  关于PCIe 的配置管理接口,我们先选上,看看后续可以做些什么。
  • Enable Slot Clock Configuration: 如果被选上了,那么link选择的参考时钟来自RP的时钟,否则采用的是异步时钟。这点我们前面讨论过,推荐使用同步时钟更安全。

PCIe : DMA

在开始解释各个配置之前,我们可以先看下整个DMA的框图,如下

框图中上半部分中有H2C和C2H模块,并且是多个叠加的。H2C 主要表示数据的搬运方向是从右边的Host 发送到左边的Card(可以理解为PCIe卡)。

  • Number of DMA Read Channel(H2C):从用户侧(EP)的角度看,是向Host读数据的通道,通道数越多,一般传输速率越快。
  • Number of DMA Write Channel(H2C):从用户侧(EP)的角度看,是向Host写数据的通道,通道数越多,一般传输速率越快。
  • Number of Request IDs: 指的是在途(或者叫提前)发起的读写请求数量,我们选择默认就行
  • Descripor Bypass: 描述符旁通。再跳出来复习下什么叫DMA,可以参考这里的DMA 和 LL-DMA, DMA、链式DMA、RDMA(精华讲解)_sg_alloc_table_from_pages-CSDN博客。然后这里需要解释下这个描述符的作用。描述符可以认为是一种指令,指令里面包含了数据搬运的源地址,目的地址,搬运多少等信息。对于我们当前的设计来说,我们采用的是AXI-MM接口,这意味着Host是知道用户侧的目标地址的,所以我们不能旁通这个描述符,即需要使用这个描述符中的地址信息。如果Host不知道地址,那么我们就需要旁通这个功能,并且因此会在输入接口上多出bypass的接口,由FPGA用户侧来组装这样的地址信息发送给IP。注意,每个bit对应是上面 H2C/C2H的每个通道。

  • AXI ID Width: AXI 协议中 ID 位宽,我们选默认4。

到此为此,所有的配置工作已经完成,点击完成。


打开example design

后续我们可以通过右键这个IP,打开example design 进一步分析其工作机制。注意,这步操作会自动新建一个工程。

最后的结果如下,后续再更新第二章内容,关于如何认识仿真环境。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/701978
推荐阅读
相关标签
  

闽ICP备14008679号