Git Product home page Git Product logo

codsinglecyclecpu's Introduction

RISC-V 单周期CPU设计及其优化——未完工

本教程旨在实现一个最简单的RISC-V架构单周期CPU,除CPU核心外,仅包含指令存储器和数据存储器。本单周期CPU基本实现了RISC-V 规定的RV32I基础指令集。

在此之前,你需要掌握的:

  1. 熟悉单周期CPU的基本模块(model)和数据通路(datapath)
  2. 基本掌握了Verilog语言的编写
  3. 掌握modelsim或者vivado软件的编译、仿真、波形查看

RISC-V 单周期CPU总体设计方案

对于刚入门硬件电路编写的同学,需要明白硬件电路编写与软件编程的差异性:

  • 硬件电路不像软件,可以边写边加边改,硬件电路需要先设计好电路图,有总体方案后才能下手编写HDL。由于硬件电路环环相扣,修改一部分很容易“牵一发而动全身”,工作量巨大且十分考验程序员的细心程度(比如对于模块某一端口的更改需要检查所有与该模块相连的其他模块)。所以建议先设计总体方案,再下手编写
  • 硬件电路的debug比软件更加困难,也更难以发现潜在的错误。硬件的debug主要靠编写测试平台程序(testbench),依靠输出的波形判断功能。

基于以上,对我们的单周期CPU做一个总体设计方案是十分必要的

译码核心·控制信号的产生

单周期CPU的工作主要就是由五个模块构成:取指、译码、运算、访存、写回。其中译码阶段是我们设计CPU的重中之重,因为译码阶段是产生控制信号的关键,而对于控制信号的理解关乎到整个CPU设计。

我们查看RV32指令集,指令集中的指令主要分为以下几类:

1.运算类:寄存器与寄存器、寄存器与立即数的运算,运算的结果写回寄存器

2.加载类:通过(寄存器+立即数)的方式指定地址,从指定地址加载值写回寄存器

3.存储类:通过(寄存器+立即数)的方式指定地址,将寄存器的值写入地址对应内存

4.分支类:通过两个寄存器的值判读分支条件,条件成立时将立即数作为偏移地址进行跳转

5.跳转类:跳转地址由立即数+PC或者寄存器+PC决定,将PC+4写回另一个寄存器

由此可以归结出我们的控制信号:

  • 控制ALU的第二个操作数是立即数还是寄存器(ALUsrc)
  • 是否写回寄存器(RegWrite)
  • 是否读取地址 (MemRead)
  • 是否分支 (Branch)
  • 是否跳转 (Jump)
  • 是否写入内存 (MemWrite)
  • 判断ALU的操作是什么(加、减移位)(PreALUop)
  • 判断写入寄存器的值是什么 (WriteBackSel)

ALU核心·进一步细化ALU的操作

前面谈到,我们已经有了控制信号判断ALU的操作。但是这个控制信号是不够的。一方面,ALU的操作众多,如果把这些操作都包含进来会让控制信号位数过长,没有必要;另一方面,控制信号位数过短也会造成无法判断ALU的详细操作。所以我们需要进一步细化ALU的操作:

实际上,只有R-TYPE和I-TYPE会有比较复杂的计算操作,而对于地址计算和分支判断,无非只有以下几种

  • 加法——地址运算
  • 比较——分支判断

所以PreALUop实际上只需要2位,用于区分R-Type、I-Type、地址运算和分支判断即可。

更详尽的ALU判断只需要附上funct3和funct7,就可以进行详细的判断。

PC计算·复杂的分支和跳转指令

由于分支指令和跳转指令的加入,下一条PC不一定是简单的PC+4。我们需要讨论PC改变的几种情况:

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.