跳转到主要内容

VEK385 LPDDR5X-8533性能测试

作者:Wenbo,文章来源:安富利

前言

VEK385评估套件配备了第二代AMD Versal™ AI Edge系列2VE3858自适应SoC,内置5个DDRMC5E内存控制器,最高支持LPDDR5X 8533M的速率。本文将基于AMD官方开发板VEK385演示如何搭建一个DDR测试工程,并通过NoC性能监视器测试AXI流量的带宽。

  1. 测试环境

Vivado版本:2025.2

开发板:VEK385

串口调试工具

2. AMD官方LPDDR5X demo介绍

AMD官方提供了内存性能监控应用mem_perfmon, mem_perfmon是一款使用Python编写的性能监控应用,它利用了ChipScoPy的NoC性能监控API。这些API能够提取并报告来自NoC的NMU和DDRMC性能监控寄存器的带宽和延迟信息。该应用随后通过一个图形用户界面(GUI)来报告这些信息。

运行mem_perfmon之前,只需要确保VEK385通过USB线缆连接到电脑,并连接电源,设置JTAG启动后打开电源。

AMD官方LPDDR5X demo提供了一个一键运行的脚本LPDDR_v2.0.bat,双击脚本即可出现如下图形用户界面。

可以看到通过AMD官方LPDDR5X demo可以非常直观并且快速的评估VEK385开发板的LPDDR5X的性能。

看完了AMD官方LPDDR5X demo,可能有读者会考虑上面的demo虽然直观便捷,但是怎么在自己的板卡上快速测试DDR的性能呢?毕竟demo中直接提供了现成的比特流文件,可能没法直接在自己的板卡上运行。

下面本文将从创建vivado工程讲起,希望能够帮助读者快速评估versal器件的ddr控制器性能。

3. 创建vivado工程

3.1 新建vivado工程

选择开发板VEK385 Rev B创建一个vivado工程。

3.2 创建block design

  1. 创建block design。
  2. 添加Processing System Wizard ip核并运行run block automation,进行基础的配置,PL Clocks和PL Resets数量选择1.
  3. 配置Processing System Wizard ip核的参数,Clocking->Output Clocks->PL Fabric Clocks选项勾选PL CLK0,时钟频率设置为300.
  4. 添加AXI NoC2 ip核并运行run block automation,进行基础的配置,如图3.1. 本文设计使用两个AXI流量发生器(AXI Traffic Generator)对一个LPDDR5控制器进行读写。若读者想测试其它情况下的读写带宽,可以修改图3.1中红框的配置。

图3.1

  1. 配置AXI NoC2 ip参数,由于本文中使用两个AXI流量发生器进行同时读写测试,Number of AXI Slave Interfaces选择2。

Momory Controller选择Single Memory Controller,如果要测试多个ddr控制器的交织模式,此处可以选择x2或者x4的ddr控制器交织模式。

一个32bit的lpddr5x控制器理论峰值带宽可以达到34.1GB/s,一个lpddr5x控制器有两个NSU的端口挂到NoC总线上,Number of Memory Controller Ports选择2代表同时启用两个NSU的端口。

DDR Address Region 0可以设置DDR控制器分配的地址空间。

图3.2

分配每个AXI流量发生器通过哪个NSU端口访问DDR控制器,如图3.3。

图3.3

在QoS页面设置每个流量的期望带宽,NoC编译器会根据QoS设置的期望带宽自动寻找符合期望的NoC路径。还可以通过勾选Advanced选项,将不同的流量设置为不同的路由组。设置不同路由组后,NoC编译器会强制为不同的路由组设置专用路由,不同的路由组之间不会共享buffer,可以达到最大带宽。设置独占路由组后NoC布线路径可能会更长,这会带来更高的功耗和延时,本文为测试DDR效率设置了独占路由组,实际使用过程中要视情况综合考虑。

图3.4

DDRMC5新增了Inline ECC功能,相比与DDR4控制器的Sideband ECC模式,Inline ECC数据嵌入到数据流内传输,不需要额外的I/O引脚,能够简化PCB布线,减少DDR颗粒数量,但是会消耗一定的带宽和内存空间,可以在DDRMC5 Configuration界面启用。

另外还支持AES-XTS和AES-GCM两种加密模式也可以通过页面中的Crypto选项启用。

图3.5

DDR5控制器的相关参数配置需要点击DDRMC5 Configuration->Configure DDRMC5打开配置页面,如图3.6。

右侧红框是DDR颗粒的时序参数,如果需要更换ddr颗粒,需要根据ddr颗粒的手册调整相应的时序参数。

可以看到Versal DDRMC5新增了一个自动预充电的功能。选择LPDDR5默认启用此功能,启用后控制器自动在每个Bank最后一次Page Hit时自动触发预充电,这可以提升随机访问的效率。

图3.6

DDMC5支持除了传统的Row column bank/Row bank column/Bank row column等地址映射方式外还支持自定义地址映射方式,尽可能的提高各种使用场景下ddr的读写效率。

图3.7

LPDDR5还支持单个bank刷新的功能,相较于传统的ALL BANK刷新模式,PER BANK刷新模式可以在单个bank刷新期间继续响应其它bank的读写请求,可以显著降低刷新带来的带宽损失。

图3.8

6. 配置Performance AXI Traffic Generator ip核。双击noc_tg ip设置流量发生器的参数Configuration->Performance TG for Simulation选择SYNTHESIZABLE.

点击图3.9红框中的按钮可以选择自定义的pattern文件,板卡上电后会流量发生器会按照csv文件的规则自动产生axi的流量。

图3.9

通过更改默认的csv文件的参数就可以生成想要测试的AXI流量,csv文件如图3.10

图3.10

  1. 自动连线。点击Run Connection Automation,设置axi_clk_in_0连接pl0_ref_clk.

将pl_mmi_dc_1x_clk和pl_mmi_dc_2x_clk都设置连接到/noc_clk_gen/axi_clk_0.

再次点击Run Connection Automation,设置ext_reset_in连接到pl0_resetn.

  1. 添加Utility Buffer ip,连接Utility Buffer的输出到AXI NoC2的sys_clk0接口,如图3.11

图3.11

再次点击Run Connection Automation,设置CLK_IN_D连接到lpddr5_clk0_1.

3.3 运行NoC编译

点击Validate Design按钮,vivado会自动进行地址空间的分配和NoC路径的分配并打开NoC图形化界面如图3.12。在这个界面我们可以看到NoC的初步布线情况。

图3.12

此时NoC编译器没有控制器管脚的信息,因此无法知道我们选用的是最左边的控制器,可以放大NoC图形化界面后点击绿色的控制器模块打开NoC Cell Properties窗口。点击红色框的三个点可以选择NoC Sites,这里我们选择DDRMC5E_X0Y0也就是最左边的控制器。

图3.13

通过同样的操作点击蓝色的NMU也可以手动约束NMU的物理位置,约束完成后点击保存按钮,通过图形化界面设置的NoC约束会保存到bd的xdc文件里面。再次点击Validate按钮可以看到NoC编译器根据固定的NMU和DDRMC5的位置重新进行了NoC的布线。如图3.14。

图3.14

3.4 导出硬件xsa文件

  1. 在sources窗口中的bd文件上右键,点击Create HDL Wrapper生成顶层文件。
  2. 点击Flow Navigator窗口的Generate Device Image生成比特流。
  3. 点击File->Export->Export Hardware导出xsa文件。

4. 创建vitis工程

新建vitis platform工程

打开vitis,选择上面生成的xsa文件创建platform工程。

4.2 新建hello world例程

在flow窗口编译创建的platform工程后可以从模板创建一个helloworld的例程,如图4.1


图4.1

4.3 读取NoC性能监控器

NoC和DDRMC存在多种性能监视计数器,如字节计数和突发计数,可用于计算设计不同组件的带宽和延迟(最小值、最大值和累积值)。NoC组件和DDRMC的性能监视寄存器位于NPI寄存器空间中,可在NoC和集成内存控制器NPI寄存器参考(AM019)中找到。

寄存器偏移地址如图4.2.

图4.2

NMU的基地址可以在vivado中通过tcl脚本查到。

打开完成布局布线的vivado工程,点击Open Implementation Design打开实现后的设计,在Tcl Console运行下面的指令。

get_cells -hierarchical *NOC2_NMU512_INST*

运行指令后会显示出NMU在工程中对应的cell,将显示的cell分别替代下面的get_cells后的实例后可以打印出NMU的实际物理地址。

report_npi_addresses -of_objects [get_cells design_1_i/axi_noc2_0/inst/S01_AXI_nmu/bd_aea7_S01_AXI_nmu_0_top_INST/NOC2_NMU512_INST]如图4.3。

图4.3

修改hello world.c代码设置并读取NMU性能监控器寄存器的值。其中0xF6F60000为示例中NMU的基地址,需要更改为实际工程中需要测试的NMU的基地址。比如上面中的0xF61C0000和0xF6210000.

图4.4

  1. 带宽计算

Reg_perf_mon_burst_count是在默认采样周期内NMU性能监控器捕获到的AXI burst的数量。

每个AXI burst传输字节可以通过AXI的AxSize和AxLen计算得到。

Burst Size(Bytes)

= 2^AxSize(Bytes)*(AxLen+1)

= 2^6 * (3+1) = 256 Bytes

采样周期内传输的总字节数Total Bytes = 256 Bytes * Reg_perf_mon_burst_count

默认的采样周期是用一个32bit的计数器(时钟为NPI时钟,默认300M)的22bit来标志的。

Total Sampling Times(seconds) = 2^22 * NPI_Period(seconds)

Bandwidth(MBps)

= TotalBytes/Total Sampling Times(Seconds)

= TotalBytes*NPIFrequence(MHz)/Sampling Timebase

= 256 * Reg_perf_mon_burst_count * NPIFrequence / timebaseOver22

4.4 编译带宽测试程序

点击build编译裸机代码,点击Run右边的设置按钮,选择Load PL PDI,选择要测试的PDI文件,如图4.5

图4.5

5. 实际测试

5.1 上板测试

打开串口调试工具,设置波特率为115200,vek385设置为jtag启动,上电后点击vitis的RUN,可以在串口中看到打印出带宽测试结果,如图5.1

图5.1

5.2 测试不同参数下DDR带宽

调整DDR控制器的参数,更改TG测试pattern,重新生成PDI文件,可以测出不同参数下的DDR带宽,测试结果如图5.2。

LPDDR5X 8533理论峰值带宽为34.1GB, 可以看到下图测试中DDR最高效率为(15.1GB + 15.1GB)/ 34.1GB= 89%。

图5.2