简介:本文围绕AXI片上总线协议展开,帮助开发者理解五通道架构、握手机制、突发传输、Outstanding请求、事务排序及数据对齐等核心概念,并通过接口设计、时序验证、性能优化和常见故障排查,建立从协议接入到系统调试的完整实践方法。
本教程旨在帮助读者完成以下任务:
AXI是一种面向高性能、高带宽和低延迟片上系统的总线协议,适合处理器、存储控制器、直接存储器访问控制器、高速外设以及片上互联网络等场景。
本文适合芯片设计人员、数字逻辑开发者、验证工程师、系统架构师,以及需要理解片上数据通路的技术人员阅读。
在复杂片上系统中,多个处理单元、存储器控制器和外设会同时产生访问请求。如果地址、控制和数据必须严格绑定在同一条通道中传输,某个访问的等待就可能阻塞其他访问,进而降低总线利用率。
AXI通过以下方式缓解这一问题:
需要注意的是,AXI的高性能并不是由单个信号直接带来的,而是由通道解耦、流水线、缓存、请求调度和返回控制共同实现的。
在开始设计AXI接口前,建议具备以下基础:
AXI接口通常工作在明确的时钟域内。设计前需要确认:
如果两个模块处于不同的时钟域,不能直接连接AXI信号,而应使用经过验证的异步桥接结构或异步队列。
需要提前确定:
地址宽度与数据宽度应结合系统规模确定。地址空间过小会限制扩展能力,过大则可能增加译码和存储资源开销。
AXI存在不同版本和应用 profile。不同版本在写数据交错、用户扩展信号、缓存属性以及锁定访问等方面可能存在差异。
因此,项目开始时应形成一份接口约束文档,明确:
没有明确实现范围时,主设备和从设备很容易出现“双方都认为对方支持某功能”的兼容性问题。
AXI通常由五条独立通道组成。
写地址通道用于传输写请求的地址和控制信息。常见信号包括:
主设备在有效信号置高时表示地址信息有效,只有当有效信号与就绪信号在同一个时钟周期同时为高时,写地址传输才算完成。
写数据通道用于传输实际写入的数据。除数据本身外,通常还包含:
字节有效掩码可以表示当前数据总线中哪些字节真正有效,这为窄传输和部分字节写入提供了基础。
从设备完成写操作后,通过写响应通道返回结果。响应一般用于表示:
主设备必须持续等待响应,不能因为写数据已经发送完毕就认为事务已经完成。
读地址通道用于传输读请求的地址和控制信息。主设备提交读地址后,从设备可以在之后的一个或多个周期返回数据。
读地址与读数据分离后,从设备可以根据内部存储器延迟、仲裁状态或缓存命中情况安排返回时间。
读数据通道用于返回读取结果。除数据和事务标识外,还包含:
对于读突发,主设备需要根据结束标志确认最后一个数据拍,而不能仅依赖固定周期判断事务结束。
AXI所有通道的核心都是VALID/READY握手。
基本规则如下:
一个通用的时序逻辑可以抽象为:
发送方:准备数据和控制信息VALID = 1在握手完成前保持数据与控制信息不变VALID && READY 后进入下一项传输接收方:有空闲缓冲区时 READY = 1缓冲区满或暂时无法处理时 READY = 0READY可以在后续周期重新拉高
设计中最常见的错误是让VALID依赖READY,同时又让READY依赖VALID,形成组合环路。更稳妥的做法是让关键控制信号经过寄存器或明确的状态机管理。
AXI写事务通常分为写地址、写数据和写响应三个阶段。写地址和写数据并不要求在同一个周期到达,因此从设备需要分别接收并缓存两类信息。
推荐的设计步骤如下:
当写地址通道握手完成后,保存地址、突发长度、数据尺寸、事务标识等信息。
如果系统允许多个Outstanding写请求,就不能只设置一组地址寄存器,而应建立请求队列或事务表。
接收写数据时,需要根据字节有效掩码决定实际更新哪些字节。对于突发写入,应维护当前数据拍序号,并检查结束标志是否与预期长度一致。
若数据提前结束或超出预期长度,应返回错误响应,避免后续数据被错误归属到其他事务。
写数据全部接收、校验并完成内部处理后,从设备生成写响应。响应不能过早发送,否则主设备可能认为写操作已经生效,而实际存储尚未完成。
如果内部存储器存在等待周期,写响应应在真正完成或明确失败后再返回。
读事务通常包括读地址和读数据两个阶段。
从设备接收读地址后,应检查:
如果是单次访问,返回一个数据拍即可。如果是突发访问,则需要逐拍生成数据,并在最后一拍标识事务结束。
从设备不应在读数据尚未准备好时提前拉高数据有效信号。主设备未准备好时,从设备需要保持当前数据、响应和结束标志不变,直到握手完成。
如果系统只允许一个未完成事务,设计相对简单,读数据按请求顺序返回即可。
如果允许多个Outstanding请求,则需要维护事务标识和请求上下文。对于相同标识的事务,通常需要遵循协议规定的顺序;对于不同标识的事务,在系统允许的前提下可以乱序返回,以减少慢请求对整体吞吐量的影响。
突发传输的核心思想是:一次发送起始地址和控制信息,随后连续传输多个数据拍,从而减少重复地址传输。
设计突发访问时,重点检查以下内容:
非对齐访问不能简单理解为“任意地址都能直接访问”。它通常依赖字节有效掩码、数据拼接逻辑以及从设备能力。若下游存储器只支持自然对齐访问,互联模块可能需要将一次非对齐访问拆分成多次对齐访问,再重新组合结果。
建议从功能、协议和性能三个层面验证。
构造以下测试场景:
检查数据内容、地址归属、响应状态和事务结束标志是否正确。
重点检查:
可以通过协议断言或监控模块自动捕获违规行为。
统计以下指标:
如果总线长期处于VALID为高而READY为低的状态,通常说明接收端处理能力、缓存容量或仲裁策略存在瓶颈。
常见原因包括:
排查时应同时观察五条通道的VALID、READY和事务标识,并定位最后一次成功握手发生在哪个阶段。
可能原因有:
建议先关闭乱序和多Outstanding功能,验证单事务路径,再逐步增加并发度。
重点检查字节有效掩码、写数据结束标志、写地址与写数据关联关系,以及下游存储器的字节写支持能力。
可以从以下方面分析:
适当增加请求队列深度和数据缓冲深度,允许多个事务并行处理;在保证顺序规则的前提下,合理使用乱序返回;优先采用连续突发访问,减少地址阶段开销。
避免大范围组合逻辑直接连接多个通道。必要时插入寄存器切片或流水线级,将复杂译码、仲裁和数据选择逻辑分散到多个时钟周期。
空闲时保持通道处于稳定状态,减少无效翻转;根据系统级低功耗策略控制时钟和数据通路。进入或退出低功耗状态时,应确保未完成事务得到妥善处理,避免截断访问。
对所有请求设置资源上限和异常处理路径。对于非法地址、超长突发、响应超时等情况,应提供可观测的错误状态,便于系统定位。
将接口参数、地址映射、支持的事务类型和限制条件集中定义,并在设计文档中明确。验证环境应覆盖正常、边界、阻塞、错误和复位恢复场景。
AXI的核心价值在于将地址、数据和响应解耦,并通过独立通道、VALID/READY握手、突发传输和事务标识提升片上数据传输效率。
实际设计时,应按照“明确协议范围—确定地址与数据参数—实现通道状态机—处理并发事务—完成协议验证—进行性能优化”的顺序推进。对于初次接触AXI的开发者,建议先实现单事务、单突发和严格顺序返回,再逐步引入多Outstanding、乱序处理和跨时钟域结构。这样既能降低调试复杂度,也能为后续构建高性能片上互联打下可靠基础。