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 | | | :clock3: | `TEQ` | `SYS` | 2 | Work as Branch | | :clock3: | `TEQI` | `SYS` | 2 | | | :clock3: | `TGE` | `SYS` | 2 | | | :clock3: | `TGEI` | `SYS` | 2 | | | :clock3: | `TGEIU` | `SYS` | 2 | | | :clock3: | `TGEU` | `SYS` | 2 | | | :clock3: | `TLT` | `SYS` | 2 | | | :clock3: | `TLTI` | `SYS` | 2 | | | :clock3: | `TLTIU` | `SYS` | 2 | | | :clock3: | `TLTU` | `SYS` | 2 | | | :clock3: | `TNE` | `SYS` | 2 | | | :clock3: | `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`阶段加一个流水级 | | :hourglass: | `MOVN` | `ARITH` | 2 | `D`阶段阻塞 | | :hourglass: | `MOVZ` | `ARITH` | 2 | `D`阶段阻塞 | | :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`指令需要清空流水线