MIPS/README.md
2021-09-22 22:29:52 +08:00

75 lines
3.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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`指令修正
- [ ] 完善 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)` | |