和你一起从零开始写RISC-V处理器(1)

2023-11-03

RISC-V加法指令的实现(Ⅰ)

前言

通过verilog来搭建一个CPU的想法由来已久了,一方面是为了增加自己为数不多的项目经历,另一方面是真的想弄明白,CPU内部究竟到底是怎么运行的。

今天就正式开始了,此工程很大,更新进度取决于自身学习情况以及别的up主的更新进程;可能会很慢,也可能哪天夭折了;虽然路途很遥远,但是总要迈出第一步吧~能学多少是多少了哈哈。

本文首发于公众号:FPGA学习者,关注公众号,获取更多资料与内容。
主要参考B站:@外瑞罗格


一、RISC-V简介

简介嘛,为了节省时间,那我就不按照官方表述来介绍了;

先来看一个指令集的概念,顾名思义,是一组指令的集合,指令是处理器进行操作的最小单元。区分CPU的标准主要就是指令集架构。

指令集架构主要分为复杂指令集(CISC)和精简指令集(RISC)。

CISC Complex Instruction Set Computer
RISC Reduced Instruction Set Computer

RISC-V就是基于精简指令集的一种处理器架构,2010年发明至今已经更新到第五代,最大的特点在于开源。(当然,也有其他的开源架构,比如MIPS等)详细介绍可参阅书籍《手把手教你设计CPU——RISC-V处理器篇》,该书籍电子版获取方式在文末给出。

不说废话了,重点关注怎么能够上手实现一些基本的功能吧。

二、指令实现的前期准备

1.指令

指令包括R类、I类、S类、SB类、U类、UJ类等等,主要区别在于编码方式;RISC-V使用的都是32位指令,所以我们实现的是一个32位处理器。(多少位处理器的区别就在于指令是多少位的)。

今天先不涉及那么多,先看R类和I类指令:在这里插入图片描述对于R类指令:

(6 0)操作码:opcode
(11 7)目的寄存器
(14 12)func3
(19 15)源寄存器1
(24 20)源寄存器2
(31 24)func7

对于I类指令(即带有立即数的指令):
(6 0)操作码:opcode
(11 7)目的寄存器
(14 12)func3
(19 15)源寄存器1
(31 20)立即数

func为功能码,主要用来判断功能。

2.ADD指令和ADDI指令

在这里插入图片描述

ADDI rd rs1 imm;

ADDI指令实现立即数+rs1寄存器中的内容,存放到rd寄存器中。

ADD rd rs2 rs1;

ADD指令实现rs1寄存器中的内容+rs2寄存器中的内容,存放到rd寄存器中。 (rs:register source,源寄存器;rd:register destination,目的寄存器)。
对于I类指令的立即数,运算之前需要对其进行位扩展,按照有符号数进行扩展至32位:
在这里插入图片描述

3.三级流水线结构

三级流水线结构指只需要三个系统时钟,便可以执行完一条指令。此处采用三级流水线结构,(在我理解来,并不是所有的RISC-V架构的处理器都是三级流水线,应该是根据具体实现方式有关)。

一条指令,在处理器中主要完成以下步骤:
在这里插入图片描述
Ⅰ pc_reg模块

时序逻辑电路,根据时钟产生指令地址,送入取指模块;

Ⅱ if模块

组合逻辑电路,根据指令地址,访问外设ROM,ROM中存放相应的指令,并将指令送入到取指模块;

Ⅲ if_id模块

时序逻辑电路,主要功能就是用来打拍,打一拍输出到id译码模块,提高系统频率,防止时序违例;

Ⅳ id译码模块

组合逻辑电路,将命令进行译码,根据译码访问命令中的寄存器组,并将寄存器组的数据送入到下一个模块。

Ⅴ id_ex模块

时序逻辑电路,主要目的就是打一拍输出,防止时钟频率较高情况下的时序违例。

Ⅵ ex模块

组合逻辑电路,根据译码结果进行执行相应的操作,比如加法、减法等等。并将得到的结果回写到寄存器组中的目的寄存器进行存储。

【注】本来还应该有访存操作,只不过此处暂时没涉及到,暂不列出。

对于ROM外设,一般情况下,ROM内每个内存空间大小为8bit,主要用来存放各种指令,四个内存才可以存放一个完整的指令。不过后续实现的时候直接使用了32位的ROM简化设计。

综上所述,一条指令的执行过程有:取指、译码、执行、访存、回写。此处分三级流水线执行(也有五级流水线,典型的有MIPS架构处理器,关于MIPS架构处理器编写,可参考《自己动手写CPU》,获取方法同样在文末给出)。

取指阶段:从指令寄存器读出指令,同时确定下一条指令地址。

译码阶段:对指令进行译码,从通用寄存器中读出要使用的寄存器的值,如果指令中含有立即数,那么还需要将立即数进行符号位扩展,如果是转移指令,并且满足转移条件,那么给出转移目标,作为新的指令地址。

执行阶段:按照译码给出的操作数、运算类型,进行运算,给出运算结果。

访存阶段:如果是Load/Store指令,那么在此阶段会访存数据寄存器,反之,只是将执行阶段的结果向下传递到回写阶段,同时,在此阶段还要判断是否有异常需要处理,如果有,那么会清除流水线,然后转移到异常处理例程入口地址处继续执行。

回写阶段:将运算结果保存到目标寄存器。

流水线到底怎么个流水法?
在这里插入图片描述
执行第一条指令需要三个周期,执行第二条指令也需要三个周期,但是两条指令加起来只需要四个周期,因为执行完第一个指令的前一个步骤后,下一条指令可以立马接上,再次执行该步骤。

当然也可以按照每次只能单独执行一条指令设计,这样就不是流水线了,使用流水线可以增加运行效率,使系统速度提升;

4.一个需要注意的点

RISC-V的寄存器数组中,x0寄存器的值恒为32’d0;且不可修改。因为可以使用ADDI和ADD指令配合寄存器x0来实现NOP指令和MOV指令。
在这里插入图片描述
NOP指令:当前无操作,软件延时或者冲刷流水线;
MOV指令:通过加0的方式实现MOV指令。

5.再来一个需要注意的点

指令相关性冲突,如图所示
在这里插入图片描述
第一条指令,回写的目的寄存器为x7,但是第二条指令将其作为其中一个源寄存器,如果等待第一条指令的走完第三个周期去回写x7,那么第二条指令的第二个周期取到的x7的数值就是没有变化之前的数值,这显然不是我们想要的;

使用时序逻辑回写入寄存器组中比当前访问源寄存器的时刻慢了一个周期,所以在寄存器数组中,若收到的回写地址和当前正在读取的地址是同一个地址,则需要使用组合逻辑直接将该需要回写的数值赋给当前正在读出的数值。同时再将该数值使用时序逻辑写入寄存器组中。

(关于这一点,后续会结合程序进行说明)

6.环境搭建

目前需要的环境比较简单了,主要有:ModelSim用于仿真,notepad++用于程序编写;还有Quartus II软件,都是使用学习FPGA使用到的最基本的软件,这里就不放安装包了。

总结

接下来涉及到具体编码实现与测试,主要是实现以下几个模块:
在这里插入图片描述
八个模块,时序逻辑模块主要是进行打拍,组合逻辑模块进行相应的操作和运算。具体实现与测试过程,下期揭晓,敬请期待。

关注《FPGA学习者》后台回复【RISC】即可获取《手把手教你设计CPU——RISC-V处理器篇》pdf和RISC-V指令中文手册pdf。后台回复【MIPS】《自己动手写CPU》pdf。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

和你一起从零开始写RISC-V处理器(1) 的相关文章

  • ORcad Capture CIS元件库管理

    当电子元器件数量多到一定程度的时候 所有器件都集中在一个library里杂乱无章 使用起来相当不方便 时间长了也很容易把相似的器件封装混淆 如何规范化整理 就成了一个让人头疼的问题 还有就是贴片时硬件工程师都要面对一个整理BOM的问题 小公
  • 【数字IC】从零开始的Verilog SPI设计

    从零开始的Verilog SPI协议设计 一 写在前面 1 1 协议标准 1 2 数字IC组件代码 1 3 设计要求 1 4 其他协议解读 1 4 1 UART协议 1 4 2 SPI协议 1 4 3 I2C协议 1 4 4 AXI协议 二
  • 基于FPGA的AHT10传感器温湿度读取

    文章目录 一 系统框架 二 i2c接口 三 i2c控制模块 状态机设计 状态转移图 START INIT CHECK INIT IDLE TRIGGER WAIT READ 代码 四 数据处理模块 串口 代码 五 仿真 testbench设
  • ALLEGRO等长时如何将PIN DELAY和VIA长度计算在内

    在PCB设计中 对于时序要求严格的线路 Via和IC pin delay的长度必须得到重视 通过下面的操作 可将Via和Pin delay加入到线路长度的计算中 1st 计算Pin delay 打开Constraint Manager 选择
  • 硬件工程师-三极管

    目录 一 机械开关 二 三极管的种类 三 NPN型三极管 N型三极管 四 PNP型三极管 编辑 五 三极管公式 NPN型三极管 PNP型三极管 六 NPN管的继续讲解 三极管的导通电压 PNP管也是一样 三极管的三种状态 判断三极管是放大还
  • 如何使用 LLVM/Clang 编译为 RISC-V 目标?

    我想将一个简单的程序 int main return 0 编译到RISC V处理器 LLVM Clang 版本是 9 0 我想用这样的 RISC V 模拟器运行编译后的程序https github com riscv riscv tools
  • 如何用GDB调试交叉编译的QEMU程序?

    我在使用 GDB 调试 QEMU 中运行的简单程序时遇到问题 GDB似乎无法找到我在程序中的位置 因为它总是显示 作为我当前的位置 并且它永远不会达到我设置的任何断点 在一个终端中 我运行 QEMU cat add c int main i
  • 计算机组成与设计:硬件/软件接口,第三章详细梳理,附思维导图

    文章目录 三 计算机的运算 章节导图 一 整数的表示 无符号整数 原码 反码 原码是带符号整数的表示方法
  • 【FMC141】基于VITA57.4标准的4通道2.8GSPS 16位DA播放子卡(2片DAC39J84)

    FMC141是一款基于VITA57 4标准的4通道2 8GSPS 2 5GSPS 1 6GSPS采样率16位DA播放FMC子卡 该板卡为FMC 标准 符合VITA57 4与VITA57 1规范 16通道的JESD204B接口通过FMC 连接
  • 波端口的使用

    波导端口代表了计算域的一种特殊边界条件 它既可以激发能量 也可以吸收能量 这种端口模拟了连接到该结构的无限长波导 波导模式从结构向边界平面传播 从而以非常低的反射水平离开计算域 当端口中的波导模式与结构内部波导的模式完全匹配时 可以实现非常
  • 硬核 | 从零制作一个激光雷达需要多久?

    编辑 ADS智库 点击下方 卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 点击进入 自动驾驶之心 硬件交流 技术交流群 本文只做学术分享 如有侵权 联系删文 激光雷达 LiDAR 是激光探测及测距系统的简称 目前广泛应用在无
  • 硬件基础-电容

    电容 本质 电容两端电压不能激变 所以可以起到稳定电压作用 充放电 电容量的大小 想使电容容量大 使用介电常数高的介质 增大极板间的面积 减小极板间的距离 品牌 国外 村田 muRata 松下 PANASONIC 三星 SAMSUNG 太诱
  • 基于FPGA的简易BPSK和QPSK

    1 框图 2 顶层 3 m generator M序列的生成 输出速率为500Kbps 4 S2P是串并转换模块 将1bit的m序列转换到50M时钟下的2bit M序列数据 就有4个象限 5 my pll是生成256M的时钟作为载波 因为s
  • Vivado ILA的debug信息保存与读取

    保存 write hw ila data D Project FPGA ILA Debug Data 202401041115 ila upload hw ila data hw ila 1 读取 display hw ila data r
  • 48V转12V的DC-DC稳压电路推荐

    项目或学习过程中好用且稳定的DC DC的电路将是一个成功硬件项目的基础 主芯片 MP9486 MP9486A 是一款高压降压型开关稳压器 可输 出高达 1A 的持续电流至负载 它集成了一个高 压高端 MOSFET 提供 3 5A 的典型峰值
  • 在 C 中实现 SB 型 riscv 指令

    我遇到了一些问题 我尝试将 32 位二进制解码为 RISCV 架构集中的 SB 类型指令 我已经移动了操作码 imm rs1 rs2 和 rd 值 但未能获得正确的 IMM 值 例如对于以下 32 位二进制 1111111000000111
  • TRICONEX MA2211-100 芯片上相互连接

    TRICONEX MA2211 100 芯片上相互连接 TRICONEX MA2211 100 所有相同的组件 io的电源 处理器 和内存将需要 但是 你可以看到所有这些带存储器和处理器的OO板 针不能嵌入到一个小的单片机上 现在是 普拉克
  • 为什么 RV64 为 32 位操作而不是 64 位操作引入新的操作码

    在浏览 RISC V 规范时 我注意到 64 位版本与 32 位版本的不同之处在于 它 将寄存器扩展至 64 位 更改了指令以作用于整个 64 位范围 添加了执行 32 位操作的新指令 这使得 RV32 代码与 RV64 不兼容 但是 如果
  • RISC V手册混淆:指令格式VS立即数格式

    我有一些与 RISC V 手册相关的问题 它有不同类型的指令编码 如R型 I型 就像MIPS编码一样 R type 31 25 24 20 19 15 14 12 11 7 6 0 funct7 rs2 rs1 funct3 rd opco
  • RISC-V 调用约定的 ABI 寄存器名称

    我对 RISC V ABI 寄存器名称感到困惑 例如 第 85 页的 RISC V 指令集手册 第一卷 用户级 ISA 版本 2 0 中的表 18 2 指定堆栈指针sp正在注册x14 然而 指令 addi sp zero 0 由 riscv

随机推荐

  • 计算机基础知识及其能力调查问卷,大学新生计算机能力调查和分析.doc

    大学新生计算机能力调查和分析 大学新生计算机能力调查和分析 摘 要 本文在分析我院来自不同地区大学新生计算机能力存在较大差异的基础上 介绍了新生计算机能力调查问卷的设计方法 对我院2008级新生的调查结果作了具体分析 并提出了相应教改措施
  • 数据结构与算法分析 C语言描述(原书第2版)电子书pdf下载

    数据结构与算法分析 C语言描述 原书第2版 下载链接 https pan baidu com s 1VrsrvtCujFHbseuJjXJACA 提取码获取方式 关注下面微信公众号 回复关键字 1136
  • TypeScript入门-9.函数箭头表达式

    箭头表达式是function 匿名函数的简写 旨在解决javascript的this指向问题 写函数的时候也更简洁 函数一个参数的时候小括号可以不 写 写在一行后面的大括号可以不写 return也可以不写 如果写了大括号就必须加上retur
  • 【华为OD机试真题2023 JS】寻找核酸检测点

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 寻找核酸检测点 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 张三要去外地出差 需要做核酸 需要在指定时间点前做完核酸 请帮他找到满足条件的核酸检测点 1 给出
  • jenkinsci/blueocean:latest

    Jenkins maven配置 MVN3 mvn clean package Dmaven test skip true Dmaven javadoc skip true Javadoc 用于描述类或者方法的作用 Javadock可以写在类
  • 嵌入式Qt开发—Excel表格数据导出

    有一个嵌入式Excel表格数据导出的需求 应用软件运行于嵌入式Linux平台上 在设备运行过程中 存储了许多数据 这些数据想以表格的形式导出 考虑到Windows平台的普遍性 需要将数据以excel表格形式导出 故选择了一个开源库 QtXl
  • IJCAI 2023 直播预告

    点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入 哔哩哔哩直播通道 扫码关注AI TIME哔哩哔哩官方账号预约直播 15 00 15 20 廖馨婷 基于双曲空间探索的非独立同分布联邦学习 15 20 15 40 吴南楠 面向不平
  • 【Java并发编程的艺术】Java并发容器和框架:Java中的阻塞队列

    1 什么是阻塞队列 阻塞队列常用于生产者和消费者的场景 生产者是向队列里添加元素的线程 消费者是 从队列里取元素的线程 阻塞队列就是生产者用来存放元素 消费者用来获取元素的容器 阻塞队列 BlockingQueue 是一个支持两个附加操作的
  • jQuery 入门教程(27): jQuery UI Button示例(二)

    本例为使用jQuery的一个实用的例子 显示媒体播放器的控制条 其中按钮的图标使用jQuery库自带的CSS定义的一些图标 比如ui icon seek end等 1 2
  • awk 入门 —— 强大的文本分析工具

    awk 是用于 Unix 和类 Unix 系统的强大文本解析工具 但是由于它有可编程函数 因此你可以用它来执行常规解析任务 因此它也被视为一种编程语言 你可能不会使用 awk 开发下一个 GUI 应用 并且它可能不会代替你的默认脚本语言 但
  • 【转载】sp_spaceused2,看库里全部表占用的物理空间

    我常用sp spaceused来查看表所占的空间大小 可是一次只能看一个对象的 今天有空写了个sp spaceused2 可以同时看全部表的空间大小 use master go EXEC sp addmessage msgnum 55000
  • 企业在数字化转型,数据化运营上遇到了哪些困境,如何解决?

    公司决策者意识到成功的数字体验越来越重要 调查受访者表示 这种成功的衡量标准是 用户体验和满意度提高 53 市场敏捷性提高 49 收入和盈利能力增加 49 员工生产力提高 49 以及更快的上市时间 48 然而 数字战略的失败原因是由于系统各
  • ios中模拟手势单击或是双击

    1 拓展UITouch类和UIEvent类 通过category 具体见附件TouchSynthesis h和TouchSynthesis m 2 在需要的类中 定义UITouch和UIEvent类的对象 UITouch touch UIT
  • 交换机连接不同网段的主机为何ping不通

    大家都知道 如果一交换机连接的主机在同一网段 则各主机可以互相通信 可为什么连接不同网段的主机就ping不通了呢 我想很多人都有这样的想法 交换机不是基于帧的源MAC地址进行学习 目标MAC地址进行转发吗 也就是说 当第一次通信时 即交换机
  • adb如何启动

    adb 怎么启动应用 来源于 解晴新生 Android的应用分为两种 一种是常用的有界面的App 另一种是自动化测试中的无界面Instrumentation 两种应用都可以使用adb am 命令启动它 工具 原料 adb App启动方法 步
  • C++ 纵横字谜的答案(详解)

    输入一个r行c列 1 r c 10 的网格 黑格用 表示 每个白格都填有一个字母 如果一个白格的左边相邻位置或者上边相邻位置没有白格 可能是黑格 也可能出了网格边界 则称这个白格是一个起始格 首先把所有起始格按照从上到下 从左到右的顺序编号
  • LaTeX新人教程,30分钟从完全陌生到基本入门

    对于真心渴望迅速上手LaTeX的人 前言部分可以跳过不看 本教程面向对LaTeX完全无认知无基础的新人 旨在让新人能够用最简单快捷的方式 轻松入门 能够迅速使用LaTeX完成基本的文本编辑 这个教材最终能够达到的水平是能够使用LaTeX写一
  • echarts饼图显示百分比_复合饼图和双层饼图的制作方法

    Excel数据分析中 我们经常会用到饼状图 今天我们来分享一下复合饼图和双层饼图的制作方法 01 复合饼图复合饼图 从主饼图提取部分数值 并将其组合到另一个饼图中 复合饼图主要有两个作用 1 提高小百分比数据的可读性 在Excel中插入饼图
  • RabbitMQ五种消息模式

    1 简单模式 工作的流程 当生产者生产消息后 将消息发往队列 当队列中有消息时 消费者会实时的监听队列中的消息 如果有消息则会执行消息 2 工作模式 默认的传统队列是为均摊消费 存在不公平性 如果每个消费者速度不一样的情况下 均摊消费是不公
  • 和你一起从零开始写RISC-V处理器(1)

    RISC V加法指令的实现 文章目录 RISC V加法指令的实现 前言 一 RISC V简介 二 指令实现的前期准备 1 指令 2 ADD指令和ADDI指令 3 三级流水线结构 4 一个需要注意的点 5 再来一个需要注意的点 6 环境搭建