MIPS/README.md
Paul Pan 62b26e3ab2 fix trap
add testcases
2021-09-22 16:26:40 +08:00

117 lines
8.6 KiB
Markdown

Magically Improved Pipeline Stages
===
Our awesome `MIPS` CPU written in `SystemVerilog` for Loongson Cup
```
.
├── resources <-- 资源包
├── src <-- CPU设计代码
│ ├── AXI <-- AXI总线交互
│ ├── Cache <-- Cache
│ ├── Core <-- CPU核心
│ ├── 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:
- [ ] 新增指令
| Status | Instruction | Type | Tier | Comment |
| :----------------: | :-------------------------------: | :------: | :--: | :-------------------------------------- |
| :heavy_check_mark: | `I-Cache Index Invalid` | `SYS` | 2 | |
| :heavy_check_mark: | `I-Cache Hit Invalid` | `SYS` | 2 | |
| :heavy_check_mark: | `D-Cache Index Writeback Invalid` | `SYS` | 2 | :cry: |
| :heavy_check_mark: | `D-Cache Index Store Tag` | `SYS` | 2 | |
| :heavy_check_mark: | `D-Cache Hit Invalid` | `SYS` | 2 | |
| :heavy_check_mark: | `D-Cache Hit Writeback Invalid` | `SYS` | 2 | |
| :heavy_check_mark: | `PREF` | `SYS` | 1 | Treat as `NOP` |
| :heavy_check_mark: | `SYNC` | `SYS` | 1 | Treat as `NOP` (We're strongly ordered) |
| :clock3: | `WAIT` | `SYS` | 2 | |
| :heavy_check_mark: | `TEQ` | `SYS` | 2 | |
| :heavy_check_mark: | `TEQI` | `SYS` | 2 | |
| :heavy_check_mark: | `TGE` | `SYS` | 2 | |
| :heavy_check_mark: | `TGEI` | `SYS` | 2 | |
| :heavy_check_mark: | `TGEIU` | `SYS` | 2 | |
| :heavy_check_mark: | `TGEU` | `SYS` | 2 | |
| :heavy_check_mark: | `TLT` | `SYS` | 2 | |
| :heavy_check_mark: | `TLTI` | `SYS` | 2 | |
| :heavy_check_mark: | `TLTIU` | `SYS` | 2 | |
| :heavy_check_mark: | `TLTU` | `SYS` | 2 | |
| :heavy_check_mark: | `TNE` | `SYS` | 2 | |
| :heavy_check_mark: | `TNEI` | `SYS` | 2 | |
| :clock3: | `CLO` | `ARITH` | 2 | `RT == RD` |
| :clock3: | `CLZ` | `ARITH` | 2 | `RT == RD` |
| :heavy_check_mark: | `MADD` | `ARITH` | 2 | `M`阶段加一个流水级 |
| :heavy_check_mark: | `MADDU` | `ARITH` | 2 | `M`阶段加一个流水级 |
| :heavy_check_mark: | `MSUB` | `ARITH` | 2 | `M`阶段加一个流水级 |
| :heavy_check_mark: | `MSUBU` | `ARITH` | 2 | `M`阶段加一个流水级 |
| :heavy_check_mark: | `MOVN` | `ARITH` | 2 | |
| :heavy_check_mark: | `MOVZ` | `ARITH` | 2 | |
| :x: | `LL` | `MEM` | 3 | 修改内核去除相关指令 |
| :heavy_check_mark: | `LWL` | `MEM` | 1 | |
| :heavy_check_mark: | `LWR` | `MEM` | 1 | |
| :x: | `SC` | `MEM` | 3 | 修改内核去除相关指令 |
| :heavy_check_mark: | `SWL` | `MEM` | 1 | |
| :heavy_check_mark: | `SWR` | `MEM` | 1 | |
| :x: | `BEQL` | `BRANCH` | 3 | 修改编译指令 |
| :x: | `BGEZALL` | `BRANCH` | 3 | 修改编译指令 |
| :x: | `BGEZL` | `BRANCH` | 3 | 修改编译指令 |
| :x: | `BGTZL` | `BRANCH` | 3 | 修改编译指令 |
| :x: | `BLEZL` | `BRANCH` | 3 | 修改编译指令 |
| :x: | `BLTZALL` | `BRANCH` | 3 | 修改编译指令 |
| :x: | `BLTZL` | `BRANCH` | 3 | 修改编译指令 |
| :x: | `BNEL` | `BRANCH` | 3 | 修改编译指令 |
## `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)` | |
`Todo`: 涉及`I-Cache`的`CACHE`指令需要清空流水线