Code Monkey home page Code Monkey logo

simplecpu's Introduction

SimpleCPU

概述

本仓库于2024.8进行了重置,将工程从MIPS版本调整为LoongArch版本,并命名为YK_Core。关于原MIPS版本内容,请查看nscscc2023-MIPS分支

本工程使用Verilog语言描述了一个七级流水线CPU,七个流水级分别为IFIPreDIDEXEPreMEMMEMWB,各个流水级的功能请参见源代码与相关文档。CPU基于LoongArch指令集,支持运算、访存、分支跳转等四十余条用户态指令,具体支持的指令参见这里。该工程还支持串口,通过UART协议与外界进行通信。其他技术要求,可以参见龙芯杯大赛技术方案。

❗ 流失级划分仅供参考!

分这么多流水级只是作者想写一个超过五级的流水线,本作品中流水级划分并不一定合理,并没有带来多少主频上的收益。

工程使用的综合工具为Vivado 2019.2,尽管如此,仍然可以使用低版本Vivado工具,通过新建一个工程并添加Verilog源代码的方式进行综合。

作品在MMU的设计上参考了2022年龙芯杯大赛作品中的RAM_Serial_ctrl模块,该作品是一个基于MIPS32的五级流水线CPU,由xiazhuo完成。

TODO List

  • 六级流水线设计,完成20条用户态指令
  • 阻塞(或唤醒)模块设计与实现
  • 旁路模块设计与实现
  • 通过《CPU设计实战》exp7(commit:v1.0
  • 通过《CPU设计实战》exp8、9(commit:v2.0v2.1
  • 添加用户态指令,支持40+条
  • 通过《CPU设计实战》exp10(commit:v3.0
  • 通过《CPU设计实战》exp11(commit:v4.0
  • 根据NSCSCC大赛要求,添加更多指令
  • 根据大赛要求,添加串口通信功能,添加MMU模块
  • 拆分MEM流水级,改成七级流水线(commit:v5.0
  • 调试使通过三级功能测试与性能测试(commit:v6.0
  • 补充设计文档、总体架构图等内容

系统结构

系统的总体架构如下所示。详细设计参见模块设计说明文档

project

‼️ 注意:如果使用超过五级的流水线结构,将无法在没有旁路与阻塞模块的情况下通过《CPU设计实战》的exp7

项目结构

├── docs
│   ├── 指令控制信号.xlsx
│   ├── LoongArch指令码一览.pdf
│   ├── 交叉编译                  # 提供Linux下交叉编译工具链
│   └── 官方文档
├── project                      # NSCSCC提供的vivado工程模板
│   ├── asm
│   ├── thinpad_top.srcs
│   │   ├── constrs_1            # 引脚约束文件
│   │   ├── sim_1                # testbench,本地跑NSCSCC测试用
│   │   └── sources_1
│   │       ├── ip               # 工程所使用的IP核
│   │       ├── myCPU            # 存放CPU源代码🍎
│   │       └── new
│   │           ├── SEG7_LUT.v
│   │           ├── async.v
│   │           ├── thinpad_top.v
│   │           └── vga.v
│   └── thinpad_top.xpr         # Vivado工程文件
├── test                        # 《CPU设计实战》labs
|   ├── README.md
|   ├── func
|   ├── gettrace
|   ├── module_verify           # 测试TLB&Cache
|   ├── myCPU                   # 本地测试时用。存放CPU源代码🍎
|   └── soc_verify              # 指令集测试
|       ├── soc_axi
|       ├── soc_bram            # Block RAM接口下测试
|       ├── soc_dram            # Distributed RAM接口下测试
|       └── soc_hs_bram
└── README.md

Getting Started

如果你想参与龙芯杯大赛个人赛,这里是一个可行的步骤:

  • 完成前置知识的学习:数字逻辑设计、Verilog语言、计算机组成原理
  • 根据《CPU设计实战》,设计并完成一个五级流水线CPU

做单周期与多周期CPU纯在浪费时间

  • 通过《CPU设计实战》中的lab,对五级流水线CPU进行debug
  • 适配NSCSCC大赛的模板,完成:串口添加、地址映射、RAM结构冒险、进一步添加用户态指令
  • 本地仿真,对照三级功能测试与性能测试,进行debug

在上述过程中,你可以参考本项目的源代码。

至此,你已经完成了NSCSCC的基本要求,现在你可以添加一些进阶内容。

  • 动态分支预测、流水级拆分、i-cache添加、特权态指令、虚拟内存......

Tips

注意,完成《CPU设计实战》中的相关实验后,CPU核心是无法直接嵌入到NSCSCC提供的模板中的,仍然需要完成一系列工作,这里给出一些提示。

  1. 在《CPU设计实战》中,Inst RAMData RAM实际上是分开的,不需要考虑结构冒险。然而在NSCSCC中,Base RAMExt RAM均可被读、写、执行,同时两个RAM均只有一个读端口。因此在IFID两个流水级在同一拍访问同个RAM时,会发生结构冒险。(参见:哈佛架构与冯诺依曼架构
  2. 需要进行的主要任务:1.编写一个MMU,与之前写好的处理器核(本工程中命名为YK_Core)一起,组成myCPU_top模块;该MMU负责地址映射,并处理串口输入输出,同时检测是否发生RAM的结构冒险。2.将RAM的处理逻辑改为异步,否则容易出现timing loop问题。
  3. 本工程中test目录下的代码并不是最新代码,而是在前期使用CPU_CDE环境进行开发与测试时的代码。只能保证通过《CPU设计实战》exp11,其中仍然存在若干没有被检测出的bug,这些bug可以参见project目录下后的后续commit。最新代码同样在project目录下。
  4. 本工程使用的IP核有FIFO Generator,其配置为:Common Clock Builitin FIFO实现,读模式为First Word Fall Through,对于数据读写端口,宽度为8位(串口宽度),深度为512,其他配置保持默认。

推荐书籍

《计算机组成与设计:硬件/软件接口》DavidA.Patterson、John L.Hennessy著,康继昌、王党辉等译

《CPU设计实战 LoongArch版》汪文祥、邢金璋著

《超标量处理器设计》姚永斌著

simplecpu's People

Contributors

ykykzq avatar

Stargazers

 avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.