MPSOC——详解ACP、HPC和HP接口

MPSOC——详解ACP、HPC和HP接口在本文中详细介绍了 ACP HPC 和 HP 的用法 特点等

大家好,欢迎来到IT知识分享网。

一文详解ACP、HPC和HP——MPSOC

写在前面:目前在网上关于ACP的文章几乎都是简单的介绍,并没有具体的说明如何使用。在本文中主要是围绕Cache一致性问题详细说明介绍AXI-ACP、AXI-HPC、AXI-HP的三个接口的性能和具体用法

一、ACP、HPC和HP是个啥?

  • ACP:加速一致性接口,通过CCI和L2的缓存分配,具有IO缓存一致性。
  • HPC:高性能缓存一致性接口,直通CCI和SMMU,提供单向的缓存一致性,没有L2缓存分配
  • HP:高性能接口,通过CCI实现缓存一致性,没有L2缓存分配。

看到这里,就会疑问,什么是CCI,什么叫one-way conherency?同时可以看到ACE支持 two-way conherency,这又是什么?为什么HPC叫高性能缓存一致性接口,而HP叫高性能接口?下面有解答。

二、三个接口在MPSOC中的位置

1)接口的位置

​ 从上图可以看出这三个接口在整个SOC系统中所在的位置。

  • ACP接口:直接是与APU核心连接的(具体连接到了哪里,可以看下面)。
  • HPC接口:通过内部互联接口,最终与CCI的S0接口连接。
  • HP接口:通过内部互联接口,最终与PS端的DDR控制器的S3接口连接。
2)MPSOC的内部缓存结构
3)Cache的五种状态

​ 在继续往下讲之前,要了解一下Cache的五种状态,这也是保证缓存一致性的根本。

  • Valid/Invalid:当有效的时候,表示缓存行是存在于缓存当中的
  • Unique/Shared:如果是唯一的,则表示该缓存行仅存在于一个缓存中,共享时,表示存在于多个缓存中
  • Clean/Dirty:如果是Clean,则表示缓存不必要去更新主内存,因为没有做过修改,如果是Dirty,则表示当前缓存已经相对主内存做了修改,之后需要及时更新到主内存中。
    在这里插入图片描述

​ 而在上一小节中的图里面,有一个Snoop Control Unit,该单元作用就是监听各个CPU中的L1 Dcache中的这些标志位,来维护Cache的这五种状态。同时还负责各个CPU之间的互联仲裁、通信、系统内存传输等。

4)何为CCI
5)one-way or two-way conherency

​ 在最开始说到,HPC接口提供了单向的缓存一致性,ACE接口则提供了双向的缓存一致性。那这俩有什么区别呢?区别就在于:

  • one-way conherency:指的就是PL端这边是不存在Cache的,只是根据PS端的Cache来保证HPC端读写的数据和PS端Cache上的数据是一致的,
  • two-way conherency:指的是,在PL端的内部也可以实现一个Cache,然后通过ACE接口和CCI模块,来保证PS端内部的Cache和PL端内部的Cache具有一致性。具体可以看下面的这个框图:
    在这里插入图片描述

​ two-way conherency实现了PS端和PL端的Cache到Cache的访问,直接避开了PS端的DDR,加速了访问过程,同时减少了DDR的负载和带宽需求。

三、如何用这三个接口

​ 经过上面的介绍,其实也大致了解到了,ACP接口和HPC接口,能够实现缓存一致性的传输。因为ACP是直接访问CPU的L2 Cache的,而HPC则是通过CCI的帮助下,来实现缓存一致性。但是HP接口则没有缓存一直性的功能。

1)ACP的使用注意事项

​ 其实ACP的使用和HPC、HP的使用差不多是一样的,都是AXI的接口,但是有些细节则不一样,需要注意:

如果不满足,则AXI事务将会返回slave error错误

  • 只支持INCR模式。
  • 由于是直接访问L2Cache,所以每次传输的长度必须和CacheLine对齐。只支持64Byte和16Byte对齐传输,由于数据位宽固定是128bit,所以AxLEN只能是0x03或者0x00
  • AxCACHE只能是0b0111,0b1011,0b1111。
  • ACP的Outstanding能力最高只能是4(可以是读/写的任意组合),但是每个ID的Outstanding能力只能为1
2)HPC的使用注意事项

​ 如果使用HPC接口的缓存一致性这个特性,需要:

  • 使得AxCACHE[3:2]=2’b11.
  • 同时需要使能CCI模块的S3端口的Snoop功能。
  • 同时还需要将传输的Memory设置成Outer Shareable
(1)为什么需要这样设置?
  • 关于CCI的寄存器
  • 其次关于Outer Shareable

    内存的cache属性包括non-shareable, inner shareable,outer shareable。inner shareable范围只包含A53 和L2 cache。缺省情况下,Inner Shareable的内存传输不会被广播给CCI。为了使能硬件同步cache,必须使Inner Shareable的内存传输也被广播给CCI或者将内存的属性配置为outer shareable

(2)具体该如何设置?
  • 配置CCI的寄存器
    //可以在FSBL中配置,也可以在Application中配置。 //如果在FSBL中配置,需要在fsbl的main函数中的XFSBL_STAGE4下面去配置 unsigned int snoop_control=0; snoop_control = Xil_In32(0xFD6E4000); Xil_Out32(0xFD6E4000, snoop_control|0x1); snoop_control = Xil_In32(0xFD6E4000); 
  • 配置Outer Shareable

    由于上面提到,可以配置为,将Inner Shareable的内存传输也被广播给CCI,这个是在一篇博客中看到的,这个寄存器地址为0xFF41A040,而且需要在A53复位的时候进行配置,因此需要修改boot.bin文件,相对比较麻烦,而且在MPSOC的寄存器手册中我也没有看到这个寄存器,所以还是配置成Outer Shareable方便一点。

    //直接将需要操作的地址配置成OUTER_SHAREABLE即可 Xil_SetTlbAttributes(USR_DMA_DST_ADDR,DEVICE_MEMORY|OUTER_SHAREABLE); 
3)HP接口

​ HP接口就比较简单了,由于没有缓存一致性的特性,就正常使用就行。

四、三种接口的性能对比

1)关于ACP接口

​ 该接口与紧密耦合的协处理器相比,ACP访问的延迟较长,就不太适用于细粒度的指令级加速。但是又因为每次的传输只有64byte或者16byte,与HPC相比,带宽较小,也不适合粗粒度加速(如视频帧级处理),但是比较适合中粒度事务的加速,比如视频块级别的处理等。

​ 但是与HPC和HP接口相比,由于ACP直接连接到L2 Cache,因此,单次访问的延迟比较小。且不需要软件来维护Cache的一致性,能够提高整体的软件运行效率。

2)关于HPC接口

​ 通过以上正确配置之后,使用HPC接口实现Cache IO的一致性,能够减少软件维护Cache一致性的开销,且带宽够大。但是由于经过CCI模块,与HP接口相比,单次访问的延迟会比HP接口多几个CLK。

3)关于HP接口

​ 由于HP接口没有Cache一致性的特性,因此需要软件上去维护Cache的一致性,也就是说,每次使用HP接口传输完之后或者之前(根据读或者写)都需要使用Xil_DCacheFlush()或者Xil_DCacheFlushRange,来更新缓存或者使缓存无效。单次访问的延迟要比HPC少几个CLK,但是需要软件去维护Cache一致性。

4)综合对比
  • 从单次访问延迟来看:ACP<HP<HPC

    实测数据:PL使用150Mhz时钟,对PS端进行写操作,Burst长度为4,数据位宽128bit

    • ACP单次访问的延迟:大概为37个clk
    • HPC单次访问的延迟:大概为50个clk
    • HP单次访问的延迟:大概为46个clk
  • 从传输带宽来看:HPC≈HP>ACP
  • 从CPU维护Cache一致性的开销来看:HPC≈ACP<HP

五、实际测试验证

​ 由于Xilinx自带DMA的AXI中的AxCache不可修改,因此如果需要测试,则需要自己写一个DMA模块,搭建block design如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HidQjKbG-1692698856883)(C:\Users\11492\AppData\Roaming\Typora\typora-user-images\image-20230822164708732.png)]

​ 自己写了一个user_dma模块,从PL传输数据到PS端,可以从PS端配置burst的长度传输的目的地址AWCache的值AWprot的值、和起始数据(传输的数据是递增的)

  • usr dma配置接口时钟100M,数据流时钟为150M(一般控制和数据都是不同的时钟,方便之后使用,就直接采用不同的时钟来测试)
  • PS同时引出ACP、HPC和HP三种接口,通过访问地址来区分具体通过哪些端口访问PS。地址分配如下:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-00uoWP5O-1692698856884)(C:\Users\11492\AppData\Roaming\Typora\typora-user-images\image-20230822164918949.png)]

    可以看出,当访问0x00000000-0x1FFFFFFF时,使用的ACP接口,当访问0x-0x3FFFFFFF时,使用的是HPC接口,当访问0x-0x5FFFFFFF时,使用的是HP接口。

  • 同时可以产生中断。

PS端的核心配置如下:

//以下是各个配置寄存器的地址 #define USR_DMA_BASE_ADDR 0x #define USR_DMA_DST_ADDR_ADDR USR_DMA_BASE_ADDR #define USR_DMA_INT_DATA_ADDR USR_DMA_BASE_ADDR + 0x04 #define USR_DMA_CACHE_ADDR USR_DMA_BASE_ADDR + 0x08 #define USR_DMA_ENABLE_ADDR USR_DMA_BASE_ADDR + 0x0C #define USR_DMA_UPDATE_ADDR USR_DMA_ENABLE_ADDR + 0x04 #define USR_DMA_PROT_ADDR USR_DMA_UPDATE_ADDR + 0x04 #define USR_DMA_BURST_LEN_ADDR USR_DMA_PROT_ADDR + 0x04 //传输的目的地址 //0x00000000-0x1FFFFFFF ACP //0x-0x3FFFFFFF HPC //0x-0x5FFFFFFF HP #define USR_DMA_DST_ADDR 0x //配置相关信息 Xil_Out32(USR_DMA_DST_ADDR_ADDR,USR_DMA_DST_ADDR); //配置目的地址 Xil_Out32(USR_DMA_INT_DATA_ADDR,0x00);//配置起始数据 Xil_Out32(USR_DMA_CACHE_ADDR,0x0F); //配置awcache信号 Xil_Out32(USR_DMA_PROT_ADDR,0x00);//配置awprot信号 Xil_Out32(USR_DMA_BURST_LEN_ADDR,0x04);//配置burst长度 Xil_Out32(USR_DMA_UPDATE_ADDR,0x01);//更新配置 Xil_Out32(USR_DMA_ENABLE_ADDR,0x01);//启动传输 

1、测试ACP接口

  • 单次延迟:可以看出从发送写地址到收到response的写回复中间有36个clk的延迟。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-En1kvCFT-1692698856884)(C:\Users\11492\AppData\Roaming\Typora\typora-user-images\image-20230822175239343.png)]
  • Cache一致性测试
    • 测试流程:
      • CPU对地址0x地址进行写操作,CPU将该地址数据写为0x15,由于开启了Dcache,此时0x的数据存在cache中
      • 开启DMA传输,传输的起始数据为0x00。
      • 在传输结束后的中断中,CPU查看0x的数据,如果数据仍然为0x15,则说明传输的数据并未修改cache,如果数据为0x00,则说明已经将cache进行了修改。
        在这里插入图片描述

2、测试HPC接口

  • 单次访问延迟:可以看出从发送写地址到收到response的写回复中间有48个clk的延迟。
    在这里插入图片描述
  • Cache一致性测试
    • 不开启Cache特性(即不配置Outer Shareable和CCI的S3 Snoop寄存器)
      1. CPU对地址0x地址进行写操作,CPU将该地址数据写为0x15,由于开启了Dcache,此时0x的数据存在cache中
      2. 开启DMA传输,传输的起始数据为0x00。
      3. 在传输结束后的中断中,CPU查看0x的数据
        在这里插入图片描述

        可以看到,如果不做任何操作,此次传输并未改变Cache的数据。

      那如果不适用Cache一致性,在软件上如何修改?

      1. CPU对地址0x地址进行写操作,CPU将该地址数据写为0x15,由于开启了Dcache,此时0x的数据存在cache中
      2. 等CPU操作完之后,使用Xil_DCacheFlush将Cache中的存入内存。
      3. 开启DMA传输,传输的起始数据为0x00。
      4. 再使用Xil_DCacheInvalidate操作将数据再更新到Cache中
      5. 在传输结束后的中断中,CPU查看0x的数据
        在这里插入图片描述
    • 开启Cache特性
      • 在FSBL中修改CCI的S3 Snoop寄存器
      • 在App开始配置0x为OUTER_SHAREABLE
      • CPU对地址0x地址进行写操作,CPU将该地址数据写为0x15,由于开启了Dcache,此时0x的数据存在cache中
      • 开启DMA传输,传输的起始数据为0x00。
      • 在传输结束后的中断中,CPU查看0x的数据
        在这里插入图片描述

3、测试HP接口

  • 单次访问延迟测试:可以看出从发送写地址到收到response的写回复中间有45个clk的延迟。
    在这里插入图片描述

写在最后:如需引用请注明出处。总的测试工程已经上传至我的资源,可自行下载,如果需要积分,可以留言发送邮箱,使用的Vivado版本为2021.2。文中如果错误的地方,可以留言探讨交流。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/111644.html

(0)
上一篇 2026-01-23 15:45
下一篇 2026-01-23 16:10

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信