第1章:AXI通道信号详解
各位同学,今天我们来聊聊AXI总线最核心的东西——五个独立通道的信号定义与时序。说实话,我刚接触AXI时也被这五个通道搞得有点晕,但后来发现,只要理解了每个通道的「职责」,一切就清晰了。
1.1 为什么是五个通道?
AXI协议把读写操作拆成了五个独立的通道。你想想看,这就像一条高速公路,把不同方向的车流分开,互不干扰。这样做的好处很明显:
- 读地址通道(AR):发送读请求的地址和控制信息
- 读数据通道(R):返回读到的数据
- 写地址通道(AW):发送写请求的地址和控制信息
- 写数据通道(W):发送要写入的数据
- 写响应通道(B):返回写操作的完成状态
我个人习惯把这五个通道分成两组:读操作(AR+R)和写操作(AW+W+B)。这样记起来方便,调试时也容易定位问题。
核心要点:五个通道都是独立的,每个通道都有自己的握手信号(VALID/READY),可以独立控制传输节奏。
1.2 读地址通道(AR)
读地址通道负责告诉从设备:「我要读哪个地址的数据」。它的信号其实不多,但每个都很关键。
| 信号 | 宽度 | 描述 |
|---|---|---|
| ARID | 可配置 | 读事务ID,用于匹配读请求和读数据 |
| ARADDR | 32/64位 | 读起始地址 |
| ARLEN | 8位 | 突发长度,表示一次突发传输的数据个数 |
| ARSIZE | 3位 | 每次传输的数据宽度 |
| ARBURST | 2位 | 突发类型:FIXED/INCR/WRAP |
| ARVALID | 1位 | 主设备表示地址有效 |
| ARREADY | 1位 | 从设备准备好接收地址 |
嗯,这里要注意ARLEN和ARSIZE的配合。我在项目中遇到过一个问题:ARLEN设成了3(表示4次传输),但ARSIZE设成了4(32位),结果从设备只返回了2个数据就停了。后来发现是从设备的地址对齐没处理好。
经验之谈:ARADDR必须与ARSIZE对齐。比如ARSIZE=4(32位),地址的低2位必须是0。我曾经因为地址没对齐,浪费了一整天调试时间。
1.3 读数据通道(R)
读数据通道是从设备返回数据的通道。它和读地址通道是一一对应的,通过RID来匹配。
| 信号 | 宽度 | 描述 |
|---|---|---|
| RID | 可配置 | 读事务ID,必须与ARID一致 |
| RDATA | 8/16/32/64/128位 | 读回的数据 |
| RRESP | 2位 | 读响应状态:OKAY/EXOKAY/SLVERR/DECERR |
| RLAST | 1位 | 最后一次传输的指示 |
| RVALID | 1位 | 从设备表示数据有效 |
| RREADY | 1位 | 主设备准备好接收数据 |
读数据通道的时序其实很简单:从设备在RVALID有效时给出数据,主设备在RREADY有效时接收。但要注意,RLAST信号只在最后一次传输时拉高。我见过有人把RLAST和RVALID搞混,结果数据少收了一个。
避坑指南:我曾经在验证一个DMA控制器时,发现读数据总是少一个。查了半天,原来是RLAST信号在倒数第二个数据就拉高了。后来发现是从设备的突发长度计算有bug。
1.4 写地址通道(AW)
写地址通道和读地址通道几乎一样,只是方向不同。它告诉从设备:「我要往这个地址写数据」。
| 信号 | 宽度 | 描述 |
|---|---|---|
| AWID | 可配置 | 写事务ID |
| AWADDR | 32/64位 | 写起始地址 |
| AWLEN | 8位 | 突发长度 |
| AWSIZE | 3位 | 每次传输的数据宽度 |
| AWBURST | 2位 | 突发类型 |
| AWVALID | 1位 | 主设备表示地址有效 |
| AWREADY | 1位 | 从设备准备好接收地址 |
说白了,AW通道和AR通道就是一对双胞胎。唯一的区别是,写操作还需要额外的W通道和B通道来完成整个事务。
1.5 写数据通道(W)
写数据通道负责传输要写入的数据。它和写地址通道是独立的,但通常我们会让它们并行工作。
| 信号 | 宽度 | 描述 |
|---|---|---|
| WID | 可配置 | 写事务ID(注意:有些协议版本已弃用) |
| WDATA | 8/16/32/64/128位 | 要写入的数据 |
| WSTRB | WDATA宽度/8 | 字节选通信号,指示哪些字节有效 |
| WLAST | 1位 | 最后一次传输的指示 |
| WVALID | 1位 | 主设备表示数据有效 |
| WREADY | 1位 | 从设备准备好接收数据 |
WSTRB这个信号很有意思。它允许你只写入数据中的某些字节。比如你想写一个32位寄存器的低8位,就可以把WSTRB设成4'b0001。我刚开始做验证时,经常忘记检查WSTRB,结果发现数据写错了位置。
重要提醒:WLAST信号必须在最后一次数据传输时拉高。如果WLAST和WVALID不同时有效,从设备可能不知道传输何时结束。
1.6 写响应通道(B)
写响应通道是写操作的「收尾」通道。从设备通过它告诉主设备:「写操作完成了,结果如何」。
| 信号 | 宽度 | 描述 |
|---|---|---|
| BID | 可配置 | 写事务ID,必须与AWID一致 |
| BRESP | 2位 | 写响应状态:OKAY/EXOKAY/SLVERR/DECERR |
| BVALID | 1位 | 从设备表示响应有效 |
| BREADY | 1位 | 主设备准备好接收响应 |
写响应通道只有一个响应信号,但它必须在整个突发传输完成后才返回。也就是说,从设备要等到WLAST和WVALID都有效,并且所有数据都接收完毕,才会给出BVALID。
调试技巧:我建议在验证时,重点关注B通道的时序。如果BVALID迟迟不来,很可能是WLAST信号有问题,或者从设备内部处理超时了。
1.7 五个通道的时序关系
好了,现在我们把五个通道串起来看看。下面这张图展示了读操作和写操作的完整时序流程:
从这张图可以看出:
- 读操作:先通过AR通道发送地址,然后从R通道接收数据。AR和R是串行的,但可以流水线化(即发完一个AR请求后,不等数据返回就可以发下一个)。
- 写操作:AW和W通道可以同时进行,但B通道必须在所有数据发送完毕(WLAST有效)后才返回响应。
1.8 握手协议:VALID和READY
每个通道都有一对握手信号:VALID和READY。它们的组合决定了数据传输的时机。有三种情况:
- VALID先有效,READY后有效:发送方先准备好数据,等待接收方就绪。
- READY先有效,VALID后有效:接收方先表示可以接收,发送方随后给出数据。
- VALID和READY同时有效:双方一拍即合,数据立即传输。
我个人建议在验证时,三种情况都要覆盖到。我曾经只测了第一种情况,结果流片后发现从设备在第二种情况下会丢数据。嗯,那次的教训挺深刻的。
重要规则:VALID信号一旦拉高,必须保持到握手完成(即VALID和READY同时有效)。不能中途撤销!这是AXI协议的铁律。
1.9 小结
好了,这一章的内容就到这里。五个通道的信号定义和时序,说白了就是:
- 读操作:AR发地址,R收数据
- 写操作:AW发地址,W发数据,B收响应
- 每个通道都有VALID/READY握手,独立控制节奏
下一章我们会深入讲突发传输的细节,包括INCR、WRAP和FIXED三种模式的区别。到时候我会用实际项目中的例子来说明,保证让你印象深刻。