75 lines
3.4 KiB
Markdown
75 lines
3.4 KiB
Markdown
Magically Improved Pipeline Stages
|
||
===
|
||
|
||
Our awesome `MIPS` CPU written in `SystemVerilog` for Loongson Cup
|
||
|
||
```
|
||
.
|
||
├── model <-- IP行为模型
|
||
├── resources <-- 资源包
|
||
├── src <-- CPU设计代码
|
||
│ ├── AXI <-- AXI总线交互
|
||
│ ├── Cache <-- Cache
|
||
│ ├── Core <-- CPU核心
|
||
│ ├── Gadgets <-- 小部件
|
||
│ ├── CP0 <-- CP0协处理器
|
||
│ ├── include <-- 头文件
|
||
│ ├── IP <-- 用到的IP
|
||
│ └── MMU <-- 地址转换单元
|
||
└── tools <-- 控制信号生成器
|
||
```
|
||
|
||
## Progress
|
||
|
||
- [x] 特权模式
|
||
- [x] `CP0`寄存器`Status.UM` :heavy_check_mark:
|
||
- [x] 访存异常(考虑`in_kernel`状态切换带来的冒险) :heavy_check_mark:
|
||
- [x] 特权指令异常 :heavy_check_mark:
|
||
- [ ] 浮点运算单元
|
||
- [ ] ~~做一个真的`FPU`~~ :x:
|
||
- [ ] 浮点运算指令报`Coprocessor Unusable`,同时`CP0`中新增`Cause.CE` :clock3:
|
||
- [x] 新增指令
|
||
- [ ] `Cache`指令修正
|
||
- [x] 完善 Test Cases
|
||
- [ ] 重新阻止流水线结构 (`TLB`转换)
|
||
|
||
## `Cache`指令
|
||
|
||
预计实现以下`7`条操作
|
||
|
||
```verilog
|
||
32'b101111?????00000???????????????? // I-Cache Index Invalid
|
||
32'b101111?????01000???????????????? // I-Cache Index Store Tag
|
||
32'b101111?????10000???????????????? // I-Cache Hit Invalid
|
||
32'b101111?????00001???????????????? // D-Cache Index Writeback Invalid
|
||
32'b101111?????01001???????????????? // D-Cache Index Store Tag
|
||
32'b101111?????10001???????????????? // D-Cache Hit Invalid
|
||
32'b101111?????10101???????????????? // D-Cache Hit Writeback Invalid
|
||
```
|
||
|
||
其中,`Index Store Tag`中使用到了`TagLo`和`TagHi`寄存器。考虑到地址最多`32`位,故不实现`TagHi`寄存器(恒`0`);同时,由于`TagLo`和`TagHi`寄存器定义与具体处理器实现相关,在应用上用于将`Cache`的`Tag`清零(可以魔改内核),故也不实现`TagLo`寄存器(恒`0`)。所以`Index Store Tag`指令在实现上变为不写回的`Index Invalid`
|
||
|
||
对于上述操作,具体实现:
|
||
|
||
```
|
||
Cache -> VIPT
|
||
Index Invalid : VA -> Index -> (Write Back) -> Write Zero
|
||
Index Store Tag : VA -> Index -> Write Zero
|
||
Hit Invalid : VA -> Lookup -> Hit? -> Write Zero
|
||
Hit Writeback Invalid : VA -> Lookup -> Hit? -> (Write Back) -> Write Zero
|
||
```
|
||
|
||
控制信号:
|
||
|
||
| `CacheOp[2]` | `CacheOp[1]` | `CacheOp[0]` | Name |
|
||
| :------------------------: | :---------------------: | :----------------------------: | :---: |
|
||
| 0 | 0 | 0 | `NOP` |
|
||
| 0 | 0 | 1 | |
|
||
| 0 | 1 | ? | |
|
||
| 1 | 0 | 0 | |
|
||
| 1 | 0 | 1 | |
|
||
| 1 | 1 | 0 | |
|
||
| 1 | 1 | 1 | |
|
||
| `I-Cache(0) or D-Cache(1)` | `Lookup(0) or Index(1)` | `WriteBack(0) or WriteOnly(1)` | |
|
||
|