在Versal里实现cache一致性传输

本文转载自: XILINX开发者社区

本文作者:赛灵思工程师 Longley Zhang

在Zynq MPSoC里,我们有以下文章介绍怎么在MPSoC实现cache一致性的传输:

[1]https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18842098/Zynq+Ultr...

[2]https://support.xilinx.com/s/article/69446?language=en_US

Versal与MPSoC在cache维护数据的架构上,有一定的相似性。所以在Versal器件里,我们仍然可以使用上述文档 [1] 里8.1和8.2的checklist去检测系统是否满足一致性传输的条件。

本篇博客提供了一个基于VCK190 ES1开发板和2021.1 Vivado/Vitis的例子,用来简单介绍在Versal里实现数据从PL 经过 FPD CCI 到达 NoC DDR的一致性传输。

这个例子与上面文档 [2] 的例子类似,使用AXI CDMA IP实现数据的传输,通过修改AXI CDMA在Vitis里的参考设计,实现CPU直接读写AXI CDMA传输过来的数据,不必进行额外的cache操作。

这个例子里,AXI CDMA通过NOC连接到CIPS IP的NOC_FFD_CCI_1接口,这个接口是连接到PS内部的cache管理模块CCI-500,下面是这个例子的Block Design截图。更具体的block design,请新建一个VCK190 ES1的工程,然后运行附件的tcl文件创建完整的block design。

可以通过双击CIPS IP,选择PS PMC,使能连接NoC的CCI接口。(另外,还可以使用PS与PL的ACP或ACE接口,这两个接口也能实现数据的一致性传输。)

NoC的AXI Slave接口需要配置如下AxCache和AxProt的值,具体原因请参考文档 [2]。

AxCache: 0xF

AxProt: 0x0

在Block Design创建后,由于工具的已知问题(https://support.xilinx.com/s/article/76566),需要在tcl里运行下面命令,否则AXI CDMA会访问不到NoC DDR。运行完以下命令后,再重新分配地址。

set_property CONFIG.CONNECTIONS [list FPD_CCI_NOC_1] [get_bd_intf_pins /versal_cips_0/NOC_FPD_CCI_1]

最后把工程导出到Vitis,新建一个基于A72_0的应用工程。把(1)附件的xaxicdma_example_simple_poll.c导入到新的工程里,编译出elf。

(2)附件的xaxicdma_example_simple_poll.c是基于AXI Cdma IP自带的例子修改而来的。里面主要做了两处修改,一是使能了CCI模块S4接口的snooping,二是把例子里对cache的操作去掉。

下面是使能snooping的代码:

Xil_Out32(0XFD005000,0x1);

dmb();

最后可以运行下面的bootgen命令,通过(3)附件的bif文件把pdi和elf文件打包成boot.bin, 然后拷贝到VCK190的SD卡上运行。

[以上123附件可在公众号内回复“123附件”下载]

bootgen -arch versal -image long.bif -w -o boot.bin

下面是正常的输出:

[4.021]PLM Initialization Time

[4.083]***********Boot PDI Load: Started***********

[4.161]Loading PDI from SD1_LS

[4.223]Monolithic/Master Device

[307.009]302.813 ms: PDI initialization time

[307.087]+++Loading Image#: 0x1, Name: lpd, Id: 0x04210002

[307.175]---Loading Partition#: 0x1, Id: 0xC

[332.064]****************************************

[336.419]Xilinx Versal Platform Loader and Manager

[340.945]Release 2021.1 Feb 11 2022 - 09:36:03

[345.384]Platform Version: v1.0 PMC: v1.0, PS: v1.0

[349.908]BOOTMODE: 0xE, MULTIBOOT: 0xF0000000

[353.921]****************************************

[358.315] 51.029 ms for Partition#: 0x1, Size: 2336 Bytes

[363.312]---Loading Partition#: 0x2, Id: 0xB

[367.799] 0.527 ms for Partition#: 0x2, Size: 48 Bytes

[372.021]---Loading Partition#: 0x3, Id: 0xB

[379.571] 3.587 ms for Partition#: 0x3, Size: 60592 Bytes

[381.822]---Loading Partition#: 0x4, Id: 0xB

[387.173] 1.387 ms for Partition#: 0x4, Size: 5968 Bytes

[390.705]---Loading Partition#: 0x5, Id: 0xB

[395.390] 0.721 ms for Partition#: 0x5, Size: 80 Bytes

[399.482]+++Loading Image#: 0x2, Name: pl_cfi, Id: 0x18700000

[404.800]---Loading Partition#: 0x6, Id: 0x3

[11801.051] 11392.281 ms for Partition#: 0x6, Size: 863984 Bytes

[11803.906]---Loading Partition#: 0x7, Id: 0x5

[11872.509] 64.470 ms for Partition#: 0x7, Size: 467600 Bytes

[11875.153]+++Loading Image#: 0x3, Name: fpd, Id: 0x0420C003

[11880.401]---Loading Partition#: 0x8, Id: 0x8

[11885.475] 0.942 ms for Partition#: 0x8, Size: 1104 Bytes

[11889.911]+++Loading Image#: 0x4, Name: apu_ss, Id: 0x1C000000

[11895.178]---Loading Partition#: 0x9, Id: 0x0

[11908.765] 9.453 ms for Partition#: 0x9, Size: 176208 Bytes

[11911.365]***********Boot PDI Load: Done***********

[11915.925]194.206 ms: ROM Time

[11918.708]Total PLM Boot Time

--- Entering main() ----

Successfully ran AxiCdma_SimplePoll Example

--- Exiting main() ---

这篇博客只是着重介绍了在Versal工程里实现cache一致性传输的一些要点。如果在创建工程或运行方面遇到进一步问题,建议到赛灵思中文技术支持社区咨询。

最新文章

最新文章