docs: 增加AXI文档

This commit is contained in:
Liphen 2023-12-23 20:44:37 +08:00
parent f67f96976a
commit 61f0692e2a
5 changed files with 80 additions and 2 deletions

@ -1 +1 @@
Subproject commit 08fcb9397457a58e7463f83fa3e62742783cf136 Subproject commit c84c78ef6d672f45c5da7f08328db45ad0e4f8fb

View File

@ -26,7 +26,10 @@ class ICache(cacheConfig: CacheConfig)(implicit config: CpuConfig) extends Modul
}) })
require(isPow2(instFetchNum), "ninst must be power of 2") require(isPow2(instFetchNum), "ninst must be power of 2")
require(instFetchNum == bytesPerBank / 4, "instFetchNum must equal to instperbank") require(instFetchNum == bytesPerBank / 4, "instFetchNum must equal to instperbank")
require(bitsPerBank >= AXI_DATA_WID, "bitsPerBank must be greater than AXI_DATA_WID") require(
bitsPerBank >= AXI_DATA_WID && bitsPerBank % AXI_DATA_WID == 0,
"bitsPerBank must be greater than AXI_DATA_WID"
)
// 整个宽度为PADDR_WID的地址 // 整个宽度为PADDR_WID的地址
// ========================================================== // ==========================================================

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

75
doc/axi/axi.md Normal file
View File

@ -0,0 +1,75 @@
# 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](axi.assets/CrossBar.png)
![CPUtoCrossBar](axi.assets/CPUtoCrossBar.png)