手把手教你设计CPU(蜂鸟书)读书笔记

写在最前

这本书讲的是如何用verilog,以riscv为指令集,设计一款CPU。也就是书中说的蜂鸟E200。之前没有看过类似的书,对CPU的工作流程也不熟悉。这本书以verilog为载体,介绍了CPU的基本原理,对于第一次接触CPU内部眼里的菜鸟来说,简直不要太神奇。而且本书开源代码,只要有一块fpga,你也能够自己做出一块CPU来。

第一章~第四章

这是本书的第一部分,主要是一些介绍。诸如RISCV之前的一些架构,以及RV指令集的特性。第三章介绍不同的RV版本,第四章介绍本书的E200的特性。

第五章 E200设计总览

讲了一些很有用的基础知识

  1. 架构指的是指令集架构,微架构是根据架构设计的硬件布局
  2. 处理器或者CPU往往是一个完整的SOC,和处理器核或者core是处理器的运算核心。

E200的设计哲学

  1. 模块化和可重用性
  2. 面积最小化
  3. 结构简单化
  4. 性能不追求极端,够用即可

E200的代码风格

  1. 使用标准DFF模块例化生成寄存器
  2. 使用assign语句代替ifelse和case
    • 不能传播不定态
    • 面积大
  3. 代码即注释
  4. 禁止使用CLOCK和RESET

第六章 流水线

五级流水线:取指,译码,执行,访存,写回

流水线也不是必须的,有的处理器用的是状态机。并且流水线的深度不同的处理器也有不同的设置。

流水线的冲突

  1. 数据冲突

    • WAR,先读后写
    • WAW,先写后写
    • RAW,先写后读

    这是三种数据依赖性,其中WAW,WAR可以通过寄存器重命名的方式去除依赖,而RAW是真数据相关,就是它必须要读已经写了的这个数据。如果发生这种情况,就要等待写完才可以。有一些解决方法, 比如找个东西记录这种相关性。

E200的流水线

在这里插入图片描述

  1. IFU取指
  2. EXU用来译码和执行
  3. LSU用来访存
  4. WB用来写回

第七章 取指

概述

  1. 对于非分支跳转指令,就连续不断地进行取指即可,就算是不是对齐的32位指令,最好也能够每个周期都能够读一条指令
  2. 对于分支跳转指令,能够快速判断是否需要跳转。如果需要跳转,就从新的PC取出指令。
  3. 从ITCM或者ICACHE中取指令,E200用的是ITCM,很快。
  4. 非对齐的指令,对于顺序执行的,只需要缓存下来,等下次取指拼接到一起就可以了,不耽误时间。但是对于跳转的那种,就用多bank,并行一次取俩,也可以在一个周期内完成。

分支

  1. 无条件直接跳转,比如jal x5,offset。这种,立即数就能跳
  2. 无条件简洁跳转,不是立即数了,需要从寄存器读跳转的地址
  3. 带条件直接跳
  4. 带条件间接跳,这个RV里没有

为了提升性能,就要进行分支预测。首先要预测方向,也就是到底跳不跳,还有就是预测地址。

预测方向就有各种方法,比如静态预测和动态预测。

预测地址是除了直接跳转,间接跳转是需要读寄存器的,很耗费时间。就用比如保存之前的分支语句,如果匹配,就直接跳到那个地址之类的方法。

RV对于取指的简化

  1. 规整的编码指令格式
  2. 指令长度指示码放于低位
  3. 简单的分支跳转指令
  4. 没有分支延迟槽指令。分支延迟槽是在分支后面放一些不受分支影响的指令,默认现在的分支预测精度已经很高,为了减少硬件成本。
  5. 提供明确的静态分支预测依据
  6. 提供明确的RAS依据,这个是预测跳转地址的一个方法

IFU的实现

在这里插入图片描述

  1. 首先从ITCM取指,然后放到IR和PC里,IR是指令寄存器。同时用minidecode进行初步地译码来判断当前指令是普通指令还是分支跳转,然后生成用BPU来做分支预测,生成下一个PC
  2. 如果取指令的地址不在ITCM里,就会通过BIU访问外部存储。

第八章 执行

在这里插入图片描述

  1. 根据IR中的指令,译码和派遣
  2. 读寄存器,RD-Regfile
  3. 维护数据的相关性,OITF
  4. 给各种运算单元执行,ALU,长指令,LSU,EAI等
  5. 交付指令
  6. 写回寄存器,WB-Regfile
  • 系统中有一些特殊的寄存器,叫CSR寄存器,为了存储系统的一些状态。
  • 实际的派遣是ALU进行的

流水线冲突,长指令和OITF

  1. 资源冲突:就是运算单元的冲突,就等待
  2. 数据冲突:正在派遣的指令和尚未执行完成的长指令存在RAW和WAW依赖。

为了检测出这种数据依赖,E200实现了一个OITF模块。其中存储的是已经派遣但是还未写回的长指令信息。然后每次在进行指令派遣的时候,就把本指令的操作数和长指令的向比较,如果有相同的,就说明有相关性,就等待。

ALU+浮点单元

做各种计算

第九章 交付

我理解的交付就是这条指令能够执行,而不是执行完成。

首先ALU会计算是否需要跳转,计算出来之后就发给交付模块。如果交付模块发现结果和预测结果一样,就不会冲刷流水线,否则就冲刷流水线。

第十章 写回

两个仲裁

  1. 最终写回仲裁:长指令比单指令有更高优先级。如果没有长指令写回,单指令可以比更早位置的长指令写回。
  2. 长指令写回仲裁:根据OITF判断长指令的先后关系,严格控制长指令的写回顺序

第十一章 存储器架构

在这里插入图片描述

AGU address generation unit

是ALU的一部分,用于产生访存地址。

LSU ITCM DTCM

A字扩展指令

这里是用于多核操作的原子指令,包括互斥操作等的实现。

第十二章 BIU Bus Interface Unit

E200提出了自己的总线协议ICB

实现了一从多主和多主一从以及多主多从的总线连接方式。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-spFHBnCB-1591688314612)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200609151117973.png)]

第十三章 中断和异常

广义上的异常包含了狭义的中断和异常。异常主要包括

  1. 同步异常:由于执行程序指令或者试图执行程序指令而造成的异常。这个原因能够被精确定位到某一个指令,而且无论运行多少次,都能够被精确地复现
  2. 异步异常:最常见的异步异常就是外部中断,称之为精确异步异常。还有非精确异步异常。

异常处理机制

  1. 停止执行当前指令,转而从CSR寄存器mtvec定义的PC地址开始执行
  2. 更新其他几个寄存器:异常原因,异常PC,异常值,状态
  3. 退出异常
    • 从mepc定义的pc开始执行
    • 更新CSR寄存器mstatus

RV架构中断定义

  1. 外部中断:来自处理器核外部的中断,还有一个中断控制器PLIC,用来仲裁外部中断
  2. 计时器中断:mtime,mtimecmp
  3. 软件中断:软件自己往msip寄存器里写1触发中断
  4. 调试中断

一般外部中断优先级最高,软件中断次之,计时器中断再次。

在这里插入图片描述

其他章

第十四章是讲如何调试,十五章讲低功耗的各方面优化,十六章讲RV能够进行协处理器扩展。第三部分主要讲如何在实际平台上实现E200。附录讲了RV的指令集等其他RV基础知识。在此不多赘述。

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 很高兴听到您对RISC-V处理器设计感兴趣。以下是一些基本步骤,可以帮助您开始设计自己的RISC-V处理器: 1. 确定处理器的需求和规格:在设计处理器之前,您需要确定处理器的需求和规格。这包括处理器的性能、功耗、指令集等方面。 2. 学习RISC-V指令集架构:RISC-V是一种开放的指令集架构,您需要学习它的指令集和编码方式。您可以在RISC-V官方网站上找到相关的文档和程。 3. 设计处理器的微架构:微架构是处理器的实现细节,包括指令流水线、寄存器文件、ALU等。您需要设计一个合适的微架构来实现RISC-V指令集。 4. 编写Verilog代码:Verilog是一种硬件描述语言,您需要使用Verilog编写处理器的代码。您可以使用Verilog模拟器来验证您的代码是否正确。 5. 进行综合和布局布线:综合是将Verilog代码转换为门级电路的过程,布局布线是将门级电路布置在芯片上的过程。您可以使用EDA工具来完成这些步骤。 6. 进行仿真和验证:最后,您需要对处理器进行仿真和验证,以确保它能够正确地执行RISC-V指令集。 希望这些步骤可以帮助您开始设计自己的RISC-V处理器。祝您好运! ### 回答2: 随着计算机技术的不断发展,处理器作为计算机的中央处理单元,一直处于不断更新和迭代的状态。在这个过程中,越来越多的人开始将目光投向自己动手设计处理器的领域,以提高对计算机结构的理解和掌握能力。而RISC-V处理器则成为了越来越受欢迎的处理器设计体系结构之一。下面,我们就来手把手设计RISC-V处理器。 首先,需要了解RISC-V处理器的体系结构和指令集,掌握其特点,以便更好地进行设计RISC-V架构采用精简指令集(Reduced Instruction Set Computing,RISC)的思想,指令集清晰简单,易于扩展和实现,同时提供了不同的指令长度和地址宽度,满足多种应用场景的需求。 其次,需要明确设计RISC-V处理器的目的和需求。例如,设计一款高性能处理器,需要考虑运算速度、处理带宽、低功耗等方面的需求,而设计一款嵌入式处理器,则需要考虑尺寸、功耗、集成度等方面的需求。在确定需求后,可以选择适合的设计方法和实现方式。 接着,需要进行设计和仿真。采用硬件描述语言(如Verilog或VHDL)进行设计,利用仿真软件进行仿真调试,逐步完善处理器的各项功能。需要注意的是,设计时需要清晰明确每一阶段的功能和相应的接口,保证设计的可扩展性。 最后,进行硬件实现和验证。将设计好的RTL电路转换为FPGA或ASIC中的物理实现,进行性能测试和功能验证,发布仿真测试结果和设计文档,确保设计能够满足预期的性能和功能要求,并能够进一步优化和升级。 在以上步骤中,需要掌握的知识包括计算机体系结构、数字电路设计、硬件描述语言的使用等。需要长期的学习和实践,才能够熟练掌握处理器设计的各个环节,并能够设计出具备高性能、低功耗、灵活可扩展等特点的处理器。 ### 回答3: RISC-V是一个由加州大学伯克利分校推出的开源指令集架构,它的设计理念是简化指令集,更加注重可扩展性、可定制性和易于实现。设计RISC-V处理器需要了解计算机体系结构以及数字电路原理,下面将手把手设计CPU。 第一步,需要确定处理器的架构。RISC-V处理器一般采用五级流水线结构,包括取指、译码、执行、访存和写回。在这个流水线结构中,每个阶段都有对应的功能,可以保证指令的按序执行。 第二步,需要确定指令集架构。RISC-V有基础指令集和标准扩展指令集,需要根据使用需求选择相应的扩展指令集并实现相应的操作。 第三步,需要进行处理器的逻辑设计。包括指令寄存器(IR)、程序计数器(PC)、指令存储器(IM)、寄存器堆、ALU(算数逻辑单元)、数据存储器(DM)等,这些模块通过总线相互连接构成处理器的基本结构。 第四步,需要进行数字电路的设计处理器逻辑的实现需要用到器件和电路,需要根据设计的结构和功能实现相应的数字电路。 第五步,进行验证和调试。在设计完成后,需要进行仿真验证和调试工作,以保证设计的正确性和稳定性。 总的来说,设计RISC-V处理器需要掌握计算机体系结构、数字电路原理和基础编程知识,需要进行详细、全面的规划和设计设计过程中需要不断地验证和调整,确保设计的正确性和稳定性,最终完成一个高质量且符合需求的处理器设计

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值