riscv-lab/doc/axi/axi.md

3.3 KiB
Raw Blame History

AXI

信号

信号包含 AR读请求通道、R读响应通道、AW写请求通道、W写数据通道、B写响应通道

所有以 A 开头的信号都是包含地址信息的通道,如 AR 就是发送读地址的通道AW 就是发生写地址的通道

信号宽度

下图为 PUA CPU 的 RISC V 64 实现中的 AXI 信号宽度

信号 宽度 功能 备注
AXI_ID 4 ID 号
AXI_ADDR 32 地址
AXI_DATA 64 数据
AXI_STRB 8 字节选通位
AXI_RESP 2 操作的结果
AXI_LEN 8 传输长度(拍数)
AXI_SIZE 3 (每拍)传输大小
AXI_BURST 2 传输类型 固定为 1
AXI_LOCK 2 原子锁 固定为 0
AXI_CACHE 4 Cache 属性 固定为 0
AXI_PROT 3 保护属性 固定为 0

size 信号

axi 中的 size 决定了每一拍要取的数据长度

下图是 size 取值和传输数据大小的对应关系

AxSIZE Label Meaning
0b000 1 1 byte per transfer
0b001 2 2 bytes per transfer
0b010 4 4 bytes per transfer
0b011 8 8 bytes per transfer
0b100 16 16 bytes per transfer
0b101 32 32 bytes per transfer
0b110 64 64 bytes per transfer
0b111 128 128 bytes per transfer

对于 ICache 来说,指令长度是 32bit

  • 当处于 uncached 段时 size 应该是 b010一拍取 4 字节
  • 处于 cached 段时应该和 AXI_DATA_WID 一致,这样可以保证最大量的取数据,应该是 \rm log_2(AXI\_DATA\_WID/8)
    • 比如 AXI_DATA_WID 为 64 时,\rm log_2(64 / 8) = 3,正好对应表里的 size 值 b011
    • AXI_DATA_WID 为 32 时,\rm log_2(32 / 8) = 2,对应表中的值 b010

len 信号

用于控制传输的拍数,它的值就是需要传输的拍数减一

  • 想传输 16 拍,那么设置 len 为 15此时一共会得到\rm (len+1)\times2^{size} 个 bytes 的数据

burst 信号

用于控制传输类型

我们的实现中固定为 1为 1 时是 INCR 类型,对于这种突发类型,每次传输的地址是上一次传输地址的增量。增量值取决于事务大小。设置为 1 的行为最简单

结构

我们 CPU 的访存结构如下图所示

我们可以看到 ICache 和 DCache 都和 Cache-AXI Interface 发生了交互,最后 Cache-AXI Interface 和 AXI CrossBar 间就只有一条数据线交互了

其中 ICache 只用于取指,所以只会使用到 AXI 的 AR 和 R而 DCache 包含 load 和 store 两种操作,所以会用到所有 5 个通道

Cache-AXI Interface 的作用就是在 ICache 和 DCache 的发出的两个读请求AR中选择一个并且把读响应R正确的发送到对应的 Cache 中;而对于 AW、W、B 只需要全部和 DCache 交互就行了;其实可以简单理解成通过 Cache-AXI Interface 这个转换桥将 CPU 从哈佛架构转为了冯诺依曼架构

CrossBar

CPUtoCrossBar