1.前言
相信很多朋友对AMBA都比较熟悉了,对AHB总线也不陌生,在AHB总线中,hready这个信号是最难理解,最容易搞错,也是系统调试的过程中出问题最多的地方之一,同时也是很多面试官最喜欢问的知识点之一。本文做一个梳理,帮助大家彻底理解这个知识点。
2.理解一下hready和hready_out的含义
我们先看一个简单的场景,就是系统中只有一个AHB Slave的场景。
下图是AHB2协议中的一张截图,其中hready作为Slave发给Master的握手信号,它表明AHB总线上该笔传输的完成。AHB Slave的HREADY信号是Slave“延长”AHB传输的数据阶段的指示。如果Slave不能立即响应,通常会发生这种情况,因此该Slave将HREADY信号拉低,以通知Master延长数据阶段,以便Slave有足够的时间响应。这种场景比较简单,根本不需要hready_in信号,我就不仔细分析了,相信大家都能看懂。
写到这里,补充一下,AHB2协议里只有hready的叫法,并没有hready_out这一说法的,到AHB3和AHB5协议里就有了hready_out的叫法。但协议原文中都没有hready_in的称呼,hready_in只是工程项目中比较形象、比较好沟通的一种称呼。这种称呼很流行,甚至很多ip厂商也这么给信号命名。大家对照理解,不要搞混了。下图中的hready就是通常所说的hready_out。到这里,相信你已经理解了hready和hready_out的含义。
3.为什么AHB_slave还会有hready_in信号
下面让我们看一个复杂的场景,就是系统中有多个AHB Slave,那么当发生流水操作(pipeline)的时候应该怎么处理呢?关于这个问题,AHB5协议中给出了一个经典的方案,参见下方截图。每个Slave的HREADYOUT都“与”在一起,以给出系统范围的HREADY信号,该信号再作为输入反馈给每个Slave。这意味着每个Slave将具有2个HREADY信号: HREADY_in(系统范围的HREADY信号)和HREADY_out。因此,如果任何Slave将HREADYOUT设为低,则hready_in将变为低电平。因此每个Slave都等该hready_in变为高电平,然后才能做出响应。每个Slave的HREADYOUT用来扩展数据阶段,并且每个Slave必须有hready_in,以便知道系统上是否有任何其他Slave正在请求数据阶段扩展。如果任何Slave的hready_in为低电平,则该Slave必须等待其hready_in变为高电平,然后才能响应任何AHB请求。因此每个Slave都有两个hready信号,一个hready_in信号,一个hready_out信号。建议每个Slave的HREADY信号默认值设为“1”。 感谢关注微信公众号《芯片验证日记》
4.hready_in作用示例
即便是pipeline操作,如果AHB连续对同一个Slave进行突发读写,hready_in的作用也体现不出来,只有下边的情况才能体现hready_in的作用:
①AHB流水操作;②AHB连续访问,并且是跨多个Slave访问;③Slave存在反压。如下图所示:
AHB master第二次访问S0时,S0出现反压,但此时访问S1的addr phase已经出现,且此时S1处于ready状态(hready_out_s1=1),但由于此时访问S0的data_phase未结束,S0通过hready_out_s0反压hready_in_s1,因此即便S1处于ready状态也必须hold住。因此在设计AHB slave时,必须hready_out和hready_in同时为高,当次访问才能完成。感谢关注微信公众号《芯片验证日记》
5.AHB协议分享
为了方便大家查阅,我搜集整理了各个AHB协议版本,详见下图。关注微信公众号《芯片验证日记》,后台回复”ahb”,即可获得百度网盘连接。注意,“ahb”三个字母全小写,写错得到的链接可能是错的,我已经测试过了。
如果觉得对您有帮助,麻烦点个在看,并分享给自己的朋友。感谢关注《芯片验证日记》