Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/wangrunji0408/mips32-cpu
Basic multi-cycle MIPS32 CPU
https://github.com/wangrunji0408/mips32-cpu
Last synced: 4 days ago
JSON representation
Basic multi-cycle MIPS32 CPU
- Host: GitHub
- URL: https://github.com/wangrunji0408/mips32-cpu
- Owner: wangrunji0408
- Created: 2019-07-23T07:37:58.000Z (over 5 years ago)
- Default Branch: master
- Last Pushed: 2019-08-08T17:18:25.000Z (over 5 years ago)
- Last Synced: 2025-01-20T04:08:07.121Z (12 days ago)
- Language: Verilog
- Homepage:
- Size: 19.5 KB
- Stars: 7
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# MIPS32 多周期 CPU 示例代码
最简单的多周期 CPU 实现,可以仿真运行[监控程序](https://github.com/z4yx/supervisor-mips32)的基础版本。
核心部分约 400 行代码。
这里提供了两种不同风格的实现:
* 基于全局的 **控制信号**,控制信号 和 数据通路 分离。
* 基于模块化的 **中间表示**,控制和数据混在一起。前者从电路角度描述信号的选择,后者从逻辑角度描述指令接下来要做什么。体现在代码上就是,前者使用 `assign` 逐个描述输出信号的组合逻辑(从后向前),后者使用 `always @(*)` 针对每种情况描述所有输出信号(从前向后),最终由编译器完成组合逻辑的生成。
我个人更推崇使用后者,基于以下理由:
* 前者更贴近底层电路,后者更贴近高层逻辑。代码应该描述高层的逻辑,底层的电路结构交给编译器综合就好了。
* 前者具有全局性,写代码时几乎离不开数据通路图;后者具有局部性,更容易模块化调试。## 环境
使用 iverilog 编译,GTKWave 查看波形。
Linux 安装命令:
```sh
apt-get install iverilog gtkwave
```macOS 安装命令:
```sh
brew install iverilog
brew cask install gtkwave
```检查是否正确安装:
```sh
which iverilog vvp gtkwave
```## 运行测试
```sh
make build # 编译
make test # 仿真测试
```用 GTKWave 打开 `test.vcd` 查看波形
## 目录结构
```
├── defs.v 定义常数
├── cpu CPU 核心逻辑
│ ├── cpu.v 多周期 CPU 状态机
│ ├── io.v IO 控制器
│ ├── alu.v 算术逻辑单元
│ ├── id.v 译码单元
│ ├── regfile.v 寄存器堆
│ ├── cpu1.v 基于控制信号的多周期 CPU
│ └── controller.v 控制信号生成器
├── mock 模拟设备,用于测试
│ ├── ram.v 模拟 RAM
│ └── serial.v 模拟串口
├── program 测试程序
│ ├── monitor.bin 监控程序 二进制文件
│ ├── monitor.elf 监控程序 elf文件
├── test 测试(testbench)
│ └── test_cpu.v 仿真测试监控程序
```