在嵌入式系统设计中,总线架构的选择直接影响着整个系统的性能表现。作为ARM处理器与外围设备通信的核心通道,AHB(Advanced High-performance Bus)总线在ARM7TDMI和ARM9系列处理器中扮演着至关重要的角色。这些处理器原生采用ASB(Advanced System Bus)协议,需要通过专门的封装模块(Wrapper)进行协议转换才能接入标准AHB总线体系。
我第一次接触AHB封装设计是在2005年参与一个机顶盒SoC项目时,当时为了将ARM926EJ-S核心集成到系统中,不得不深入研究AHB wrapper的每个信号时序。这段经历让我深刻认识到,一个优秀的封装设计不仅要实现协议转换的功能正确性,更需要考虑时钟域同步、测试模式支持和面积优化等多重因素。
ARM7TDMI的AHB封装模块采用分层设计思想,主要包含以下几个关键子模块:
A7TWrapTest:测试接口控制块,负责TIC(Test Interface Controller)测试模式下的信号处理。在实际应用中,如果不需要生产测试功能,可以移除该模块以节省芯片面积。移除时需要将原本由该模块产生的输出信号固定为特定值,这些固定值在HDL代码中有明确说明。
A7TWrapCtrl:测试封装控制多路复用器,专门用于核心TIC测试期间的控制信号切换。它独立于主测试模块设计,便于在不需要测试功能时单独移除。当测试封装被移除后,综合工具会自动优化掉这个多路复用器,输出端将直接连接到默认值。
重要提示:在移除测试相关逻辑时,BUSEN、DBE和nENIN等信号需要设置为恒定值,因为这些信号在正常系统使用或核心TIC测试期间都不需要动态控制。
在AHB从模式下的信号处理值得特别关注:
HREADYOUTS:始终驱动为高电平,因为封装模块从不产生等待状态。这意味着从设备接口永远不会通过插入等待周期来延长传输。
HRESPS:始终驱动为OKAY响应,封装模块不会产生SPLIT、RETRY或ERROR响应。这种设计简化了从模式接口的状态机实现。
HRDATAS:根据当前测试控制信号的输出动态生成,数据来源有三种可能:
这种灵活的数据选择机制使得封装模块既能支持正常操作,又能满足测试需求。
ARM7TDMI AHB封装中采用了一些特殊的电路设计技术:
模块内部实例化了一个时钟反相器(nHCLKgen)来生成nHCLK(反相的HCLK),该信号主要用于:
使用反相时钟的目的是确保所有HDL代码仅描述上升沿触发的时序逻辑。这种做法有两个重要优势:
另一个关键时钟门控是MCLKgen,这是一个时钟NAND门,用于生成ARM7TDMI内存接口的时钟MCLK。在综合流程中,这些时钟门控模块会先被单独综合并设置为dont_touch属性,然后再链接到主封装模块中。这种方法确保了时钟门控实例具有明确的参考,并防止后续优化流程修改这些关键门电路。
模块中实例化了一个透明锁存器(DelCLKEN)用于生成dCLKEN(MCLK的一个使能项)。这个锁存器在LATS设计块中描述(带异步置位的透明锁存器),其综合方法与时钟门控相同——先单独综合并设置dont_touch属性,再链接到主设计。
ARM920T AHB封装模块采用主从分离架构,既处理核心作为主设备的ASB总线,也管理作为从设备的测试接口。图4-1所示的顶层框图清晰地展示了这种设计:
code复制A920TWrapSM → 协议转换状态机
A920TWrapMaster → 主设备接口处理
A920TWrapSlave → 从设备测试接口
与ARM7TDMI封装相比,ARM920T封装的一个显著特点是它同时拦截ASB主总线(用于核心正常操作)和ASB从总线(用于TIC测试模式)。这种双总线设计使得核心既能作为主动发起传输的主设备,也能在测试模式下作为被访问的从设备。
ARM920T AHB封装的信号接口可分为以下几类:
特别值得注意的是BCLK信号必须直接连接到AHB系统时钟HCLK,这是与ASB原生设计不同的关键点之一。
ARM920T封装的主模式状态机是整个设计中最复杂的部分,它负责将ASB访问转换为类AHB-Lite格式的伪AHB访问。状态机使用AddrState变量(寄存为LastAddrState)管理传输过程,主要状态包括:
状态转换图(图4-2)展示了这些状态之间的转换关系,所有转换都发生在HCLK的上升沿。某些状态(如BUF_WRITE_SEQ和READ_SEQ)可以转换回自身,用于实现突发传输中的连续访问。
状态机内部采用三种地址源:
这种多源地址生成机制使得AHB访问可以在核心访问之前开始(例如当NCMAHB信号指示当前读突发中有更多访问时),显著提高了总线利用率。
ARM920T封装支持HRESP上的ERROR响应,但仅限于以下访问类型:
对于其他访问类型,ERROR响应在AHB封装内部被屏蔽。这种选择性处理是为了避免由于AHB封装内部的流水线设计导致错误响应出现在ASB上响应下一个访问的情况。
A920TWrapMaster模块实现了保持寄存器(holding register),用于在遇到SPLIT或RETRY响应时保存当前传输。当HoldSel信号有效时,AHB输出会多路复用到保持寄存器内容上。这种机制确保了即使在总线授权丢失或收到复杂响应时,传输也能在条件允许时正确恢复。
与ARM7TDMI封装类似,ARM920T封装也采用了一些特殊的电路设计技术:
实例化了一个时钟反相器(nHCLKgen)产生nHCLK,主要用于:
同样采用先单独综合时钟门控并设置dont_touch属性的方法,确保综合流程不会意外修改这些关键部件。
在A920TWrapSlave中实例化了两个透明锁存器(uLATRwrite和uLATRdsel),用于在TIC测试期间保持核心输入WRITEIN和DSEL的稳定。由于输入信号到达时间较晚,简单的寄存器无法满足时序要求,必须使用透明锁存器。
ARM920T AHB封装对编程模型有一个重要例外情况:Drain Write Buffer命令(CP15寄存器7)的执行语义有所不同。在原生设计中,该命令会刷新写缓冲区并暂停核心执行直到刷新完成。但在AHB封装中:
为解决这个问题,建议在执行Drain Write Buffer命令后添加一条会引起总线访问的指令(如从非缓存内存加载或向非缓冲内存存储)。这条额外指令将不会完成,直到写缓冲区刷新完成,从而有效暂停核心。
AHB封装模块的一个重要功能是支持通过TIC(Test Interface Controller)进行生产测试。在测试模式下:
需要注意的是,ARM920T的从模式测试不能达到与主模式相同的最大频率。由于AHB和ASB之间的连接在某些路径上只有HCLK的半个周期(而不是完整周期)来完成信号传递,建议将从模式测试限制在最大HCLK频率的四分之一。
通过多年的项目实践,我总结了以下几点ARM9 AHB封装性能优化经验:
NCMAHB信号利用:当读取非缓存区域的突发传输时,该信号可以提前启动下一个读传输的地址相位,有效隐藏地址生成延迟。
ASTB信号处理:正确识别合并的I-S周期(指令-数据周期合并)可以提前开始AHB访问,减少等待状态。
保持寄存器管理:合理设置HoldSet和HoldClr条件可以最小化SPLIT/RETRY响应对性能的影响。
测试逻辑移除:在生产版本中移除A7TWrapTest和A7TWrapCtrl等测试相关逻辑,可以显著减少芯片面积并可能提高最大时钟频率。
在实际项目中,我曾遇到一个典型案例:某客户发现他们的ARM920T系统性能比预期低15%。经过分析,发现问题出在没有正确利用NCMAHB信号,导致非缓存区域突发读取效率低下。通过调整AHB封装配置,最终不仅恢复了这15%的性能损失,还额外获得了约5%的性能提升。