吃透Chisel语言.39.Chisel实战之单周期RISC-V处理器实现(一)——需求分析和初步设计

news2024/11/25 20:37:53

Chisel实战之单周期RISC-V处理器实现(一)——需求分析和初步设计

需求分析

首先明确我们要做的是什么,这个在标题里面已经说明了,我们要做的是一个单周期RISC-V处理器

但光是个短语不足以支撑我们开展项目,我们需要对项目目标做进一步的明确,也就是需求分析。

关于指令集架构(ISA)

设计一个处理器的依据是指令系统规范,也就是ISA的规范,不严谨地来说就是该指令集架构的机器语言的规范,即计算机软件和硬件的接口。而设计处理器是在ISA规范的基础上,对微体系结构进行设计,所以经典的教材《计算机体系结构:量化研究方法》中就将计算机体系结构描述为指令集架构(ISA)和微体系结构的结合。

因此,我们第一步就是要明确,我们这个项目支持的指令系统规范是什么!

既然要做一个RISC-V处理器,那必然是要支持RISC-V指令集,我们可以在官网找到该指令集的规范文件:

Specifications - RISC-V International (riscv.org)

指令集规范中包含了非特权指令集(当前版本规范为Unprivileged Spec v. 20191213)、特权指令集(当前版本规范为Privileged Spec v. 20211203),以及一些仍然处于其他阶段的扩展规范。

我们这个项目的目标很简单,不需要支持特权指令,更不需要支持拓展指令(比如向量拓展、位操作拓展等),仅需要支持非特权指令集就行了,而且是它的一个子集

非特权指令集有以下基本子集:

基本集说明版本状态
RVWMOWMO即Weak Memory Ordering,是RISC-V的内存一致性模型2.0正式批准
RV32I最基本的RISC-V 32位整数指令集2.1正式批准
RV64I最基本的RISC-V 64位整数指令集,可以看作是RV32I到64位的拓展2.1正式批准
RV32E面向嵌入式微控制器的基本的RISC-V 32位整数指令集,可以看作是RV32I的精简1.9草案
RV128I最基本的RISC-V 128位整数指令集,可以看作是RV32I、RV64I到128位的拓展1.7草案

既然是基本子集,那就必须得有一个,我们的单周期处理器是单线程的、顺序执行的,因此不需要考虑内存一致性模型。我们作为例子也只需要实现最简单的32位版本,因此考虑将RV32I作为我们项目的基本指令集。而RV32E虽然是RV32I的精简,但仍然处于草案阶段,就也不考虑了。

注意:这里的xx位指的是地址空间的位数。

还有一些拓展指令子集:

拓展集说明版本状态
M整数乘法、除法拓展2.0正式批准
A原子指令拓展2.1正式批准
F单精度浮点数拓展2.2正式批准
D双精度浮点数拓展2.2正式批准
Q四精度浮点数拓展2.2正式批准
C压缩指令拓展2.0正式批准
Counters计数器、定时器、性能计数器拓展2.0草案
L十进制浮点数拓展0.0草案
B位操作拓展0.0草案
J对动态转译语言的支持拓展,动态转译也叫JIT,此拓展用于支持动态检查和垃圾回收0.0草案
T事务性内存操作拓展0.0草案
PPacked-SIMD指令拓展0.2草案
V向量拓展0.7草案
Zicsr控制和状态寄存器拓展2.0正式批准
Zifencei指令抓取栅栏拓展2.0正式批准
Zam非对齐原子内存操作拓展0.1草案
ZtsoRVTSO(Total Store Ordering)内存一致性模型拓展,是RVWMO的变体0.1草案

RV32I加上A拓展就可以支持操作系统了,但我们不需要,其他拓展更是不需要了。

我们可以根据需求选取需要的基本子集和拓展集,实现符合应用场景的处理器。由于我们的需求很简单,那么自然我们经过上面的分析,就可以得到结论:

我们只需要支持RV32I基本指令集!不需要其他任何拓展!

当然了RV32I中的指令我们也并非都需要,在后续的实现中我们还会进行少许的取舍。

关于微体系结构(Microarchitecture)

CPU的设计无非只有两部分,一个是数据通路,另一个就是逻辑控制,不管如何我们先确定我们在微体系结构上的需求。

如果你学习过《计算机体系结构:量化研究方法》或其他类似的教材,那肯定知道很多现代处理器中常见的技术,比如Cache、流水线、分支预测、SIMD等等,想想就让人害怕。不过好消息是我们这个项目暂时不涉及这些,不信我们先捋一捋:

  1. 内存层级方面:现代处理器都有Cache之类的东西,用来构成内存层级,然后用一些复杂的策略来保证Cache的命中率,而我们的项目中不需要内存层级,直接从内存访问指令、数据啥的就行;
  2. 指令集并行(ILP)方面:这里引入了流水线技术,紧接着为了解决数据冒险,引入了转发技术和动态调度技术(比如记分牌算法和Tomasulo算法),跟着一起出现的还有分支预测那些,另一方面引入了多发射技术,似乎越来越超纲了,但是我们不需要,我们是单周期CPU,没有流水线,而且我们一次只执行一条指令,也没有多发射,根本就没有指令集并行;
  3. 数据级并行(DLP)方面:显然我们不需要,因为我们不支持向量拓展,跳过;
  4. 线程级并行(TLP)方面:我们是单核CPU,不支持多线程,更不存在线程之间共享内存,也没有Cache啥的,因此我们同样也不需要这个,复杂的内存一致性模型完全不用考虑;

还有什么地址转换啥的,我们也不需要

捋完了可以发现,我们什么优化技术都不需要用上,简简单单就实现一个朴素的单周期RISC-V处理器就行了!

初步设计

需求分析结束之后,就可以开始我们的初步设计了!

RV32I指令集分析

通过上面的分析,我们只需要把RV32I中我们需要的指令给支持了就行了,那么我们从分析RV32I中的指令开始

RV32I指令集指令有6种类型:

在这里插入图片描述

其中:

  1. R类型即寄存器(Register)类型,有三个操作数,两个源操作数均来自寄存器(rs1和rs2),目的操作数为寄存器(rd);
  2. I类型即立即数(Immediate)类型,有三个操作数,两个源操作数分别来自立即数(imm)和寄存器(rs1),目的操作数为寄存器(rd);
  3. S类型即存储(Store)类型,有三个操作数,均为源操作数,其中寄存器rs1和立即数imm运算得到存储的地址,rs2寄存器的值为被存储的数;
  4. B类型即分支(Branch)类型,有三个操作数,均为源操作数,其中两个寄存器(rs1和rs2)的值用于比较,立即数imm的值为分支目的地址的偏移量;
  5. U类型即无符号立即数(Unsigned immediate)类型,有两个操作数,立即数imm为源操作数,rd为目的操作数,此指令用于将立即数加载到指定寄存器rd;
  6. J类型即跳转(Jump)类型,有两个操作数,立即数imm为源操作数,用于计算跳转目的地址,rd为目的操作数,用于记录跳转前指令的下一条指令的地址;

进一步地,我们分析RV32I中的所有指令,共计四十条,如下表所示:

在这里插入图片描述

指令格式是比较规整的,除了ECALLEBREAK以外,均显然符合上面的六种指令格式类型。

可以按照指令的功能对指令进行分类:

  1. 直接跳转类:包括JALJALR
  2. 条件分支类:包括BEQBNEBLTBGEBLTUBGEU
  3. 加载/存储类:包括LBLHLWLBULHUSBSHSW
  4. 算术逻辑运算和位运算类:包括所有加法、减法,按位与、或、异或,逻辑左移、逻辑右移、算术右移相关指令;
  5. 比较指令类:包括SLTISLTIUSLTSLTU
  6. 其他指令类:FENCEECALLEBREAK

再依次对这几个类指令的行为进行分析:

  1. 直接跳转类需要对PC寄存器的值进行直接修改,同时写一个寄存器;
  2. 条件分支类首先需要进行比较,然后根据比较结果选择是否修改PC寄存器;
  3. 加载/存储类需要访问数据存储,加载只读取数据,存储只写入数据;
  4. 算术逻辑运算和位运算类会对操作数进行运算,然后将结果写入目的寄存器;
  5. 比较指令类与算术逻辑运算和位运算类一致,但操作变成了比较;
  6. 其他指令中,由于不需要维护内存一致性和连续性,因此我们不需要实现FENCE,同样,由于不涉及环境调用中断和调试调试中断,所以我们暂时也不需要实现ECALLEBREAK

数据通路和控制逻辑的初步设计

根据上面的分析,我们设计的CPU中应该至少需要包含以下组件:

  1. 指令内存(MemInst):接收一个32位的指令地址,读取出指令;
  2. PC寄存器(PCReg):为指令内存提供指令地址,每个时钟周期地址都会+4,当前指令为跳转时,下一条指令为跳转目的地址,当前指令为分支指令且分支成功时,下一条指令为分支目标地址;
  3. 通用寄存器堆(Registers):可读可写的寄存器,接收寄存器号,为运算单元提供操作数,接收运算结果或从数据内存读取到的值;
  4. 数据内存(MemData):根据加载/存储地址,加载或存储数据,加载或存储依赖于译码器的译码;
  5. 指令译码器(Decoder):对指令进行译码,解析得到立即数、操作码、寄存器号等信息;
  6. 运算单元(ALU):根据操作数和操作码进行运算,运算结果写到寄存器,分支指令时将比较结果发送给PC,加载存储指令时计算地址;

这些组件只描述了数据通路,要使得CPU能正常运行,还需要良好的逻辑控制

控制逻辑需要根据译码结果对数据通路进行控制,可能需要以下几个方面:

  1. ctrlJump:指令是否为跳转指令?如果是,需要给控制信号到PC,要求在下一时钟周期修改为跳转目的地址;
  2. ctrlBranch:指令是否为分支指令?如果是,根据运算单元的比较结果(分支与否),决定是否让PC在下一个时钟周期跳转的分支目标地址;
  3. ctrlRegWrite:指令是否需要写寄存器?如果是,将运算单元的结果或从数据内存中读取的值写入寄存器;
  4. ctrlLoad:指令是否为加载指令?如果是,写入寄存器的值来源应该是数据内存;
  5. ctrlStore:指令是否为存储指令?如果是,将寄存器中的值写入数据内存;
  6. ctrlALUSrc:指令的操作数2是立即数还是寄存器值?根据此选择操作数2的值;
  7. ctrlJAL:指令是否为JAL指令?如果是,操作数1的值应当为PC寄存器的值;
  8. ctrlOP:为ALU指定具体的操作,加?减?或者其他啥?

这些控制信号的生成和传输我们统一由控制器(Controller)完成。

上面的说明并不详尽,只作为初步设计,但我们也很难在开始的时候就考虑到所有细节,更多的细枝末节需要在设计、调试、修改的迭代中完善,但至少上面的内容足够我们开始实现了。

最后放上初步设计的草图:

在这里插入图片描述

再次说明,上面的设计是不完备的,比如目前还未考虑到加载/存储时是字节、半字还是字,虽然只是一个信号的问题,但足以体现还有很多不完善的地方,在实现中迭代设计是很有必要的。接下来,我们就将基于这个不完备的设计开始我们的项目开发!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/89125.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大数据学习:shell基础(3)

文章目录history命令参数说明任务一:查看历史操作记录任务二:查看最近10条历史命令任务三:查看最开始10条历史命令任务四:曾多少次使用vim编辑文本文件?任务五:执行历史第5条命令任务六:执行上一…

【深度学习】李宏毅2021/2022春深度学习课程笔记 - Recurrent Neural NetWork(RNN)

文章目录一、Slot Filling二、Recurrent Neural NetWork(RNN)三、Bidirectional RNN(双向RNN)四、Long Short Term Memory(LSTM)五、Learning Target六、RNN 很难 Train七、Helpful Techniques7.1 LSTM7.2 …

CSDN竞赛14期·12月11日考试

CSDN竞赛14期12月11日考试 1、题目名称:字符串全排列 // 请关闭中文输入法,用英文的字母和标点符号。 // 如果你想运行系统测试用例,请点击【执行代码】按钮,如果你想提交作答结果,请点击【提交】按钮, //…

半入耳式蓝牙耳机哪款音质好?音质好的半入耳式蓝牙耳机推荐

对于喜欢听歌的朋友来讲,你只佛会关注到蓝牙耳机的佩戴舒适度,音质清晰这种情况,入耳式的带有耳塞,往往更加佩戴有更好的密闭性,半入耳的不完全进入耳道,佩戴更加舒适,下面整理了几款音质不错的…

[附源码]Python计算机毕业设计非处方药的查询与推荐系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…

Prometheus+Grafana监控一网打尽

PrometheusGrafana监控一、Prometheus介绍二、监控组件node-exportermysqld-exportercadvisorprometheus三、Grafana 展示平台docker启动配置Data sources导入Dashboard模板Linux主机监控Mysql监控Nginx监控Redis监控PostgreSQL监控Kafka监控ElasticSearch监控一、Prometheus介…

这四类项目经理一定带不好项目

项目经理就一定可以带好项目嘛?,当然不一定 失败的项目不少,除去一些本身就很坑的项目,大多项目失败,都和项目经理的个性有关。 也总结了2组极端特质: 第一,烂好人VS劳模型 第二,马…

[ vulhub漏洞复现篇 ] struts2远程代码执行漏洞s2-059(CVE-2019-0230)

🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…

JavaEE-多线程初阶3

✏️作者:银河罐头 📋系列专栏:JavaEE 🌲“种一棵树最好的时间是十年前,其次是现在” 目录volatile关键字wait 和 notify多线程案例单例模式饿汉模式懒汉模式volatile关键字 volatile : 易变的,易失的 vo…

关于实体类中VO、DTO、Entity的区别

关于实体类中VO、DTO、Entity的区别 1、entity 里的每一个字段,与数据库相对应, 2、vo 里的每一个字段,是和你前台 html 页面相对应, 3、dto 这是用来转换从 entity 到 vo,或者从 vo 到 entity 的中间的东西 。(DTO中拥…

leetcode: 1091. 二进制矩阵中的最短路径

1091. 二进制矩阵中的最短路径 来源:力扣(LeetCode) 链接: https://leetcode.cn/problems/shortest-path-in-binary-matrix/description/ 给你一个 n x n 的二进制矩阵 grid 中,返回矩阵中最短 畅通路径 的长度。如果不存在这样的路径,返回 -1 。 二进制矩阵中的 畅通…

刚刚接触编程,纠结应该先学Python还是Java?看完心里就有数了。

准备学习编程前,你一定会打开电脑搜索一下“先学Python还是先学Java?”扑面而来的是海量回答。 如果你问一名Java程序员,肯定会建议你先学Java,因为他们认为Python像个乳臭未干的黄毛小子。但如果你问Python程序员,可…

MacOS Ventura 13.1 (22C65) 正式版带 OC 0.8.7 and winPE 双分区原版黑苹果镜像

12 月 14 日,苹果向 Mac 电脑用户推送了 macOS 13.1 更新(内部版本号:22C65),本次更新距离上次发布隔了 34 天。本次更新引入了无边记应用,旨在让用户在空白的白板式画布上进行素描、绘画和写作&#xff0c…

[附源码]Nodejs计算机毕业设计基于Web的在线音乐网站Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置: Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分…

能力评估网站

开发工具(eclipse/idea/vscode等): 数据库(sqlite/mysql/sqlserver等): 功能模块(请用文字描述,至少200字): (1)高校学生评估系统用户页面设计 前台页面主要是为用户设计,经过对用户和评估系统分析,目前主要…

足球视频位置与平面坐标的转换

依赖: C# OpenCVSharp WPF Numpy 目的:解决足球场上,人物投影到二维平面的位置坐标 图A / B/ C 一、基础概念 1.1标准球场的定义: 参考:https://zh.m.wikipedia.org/zh/%E8%B6%B3%E7%90%83%E5%A0%B4图 D 1.2 配准…

m软件接收机中同步技术以及LMS-RLS自适应均衡技术的matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 自适应均衡属于自适应信号处理的应用范畴,各种各样的自适应均衡算法如迫零(ZF)算法、最小均方(LMS)算法、递归最小二乘(RLS)算法、变换域均衡算法、Bussgang算法、高阶或循环统计量算…

使用CreateJS实现一个【拯救球员】小游戏,快@你的小伙伴一起来玩儿吧

拯救球员游戏需求👇核心玩法👇👇界面原型👇👇成品演示👇游戏开发1.游戏素材准备2.代码实现1.创建index.html页面2.首页转场动画实现3.添加分数倒计时4.卡片排序展示5.游戏结束世界杯开赛前夕,球…

拷贝构造,赋值运算符重载(六千字长文详解!)

c之类和对象详解 拷贝构造,赋值运算符重载 文章目录c之类和对象详解 拷贝构造,赋值运算符重载拷贝构造拷贝构造特征拷贝构造的注意赋值运算符重载运算符重载赋值重载赋值运算符的写法注意赋值重载的默认性赋值重载和拷贝赋值的区别在哪里?拷贝…

Ubuntu问题汇总

1.sudo ifconfig 找不到命令 ubuntu找不到ifconfig_猿 白的博客-CSDN博客_ubuntu ifconfig命令找不到 没有找到ifconfig的命令,需要进行安装,按照提示中的命令安装相关的工具包 sudo apt install net-tools 2.ip查找 3.重启服务器后,nvid…