RISC-V处理器的设计与实现(一)—— 基本指令集

这篇具有很好参考价值的文章主要介绍了RISC-V处理器的设计与实现(一)—— 基本指令集。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

文章目录

RISC-V处理器的设计与实现(一)—— 基本指令集_Patarw_Li的博客-CSDN博客

RISC-V处理器的设计与实现(二)—— CPU框架设计_Patarw_Li的博客-CSDN博客

RISC-V处理器的设计与实现(三)—— 上板验证_Patarw_Li的博客-CSDN博客

RISC-V处理器设计(四)—— Verilog 代码设计-CSDN博客 

RISC-V处理器设计(五)—— 在 RISC-V 处理器上运行 C 程序-CSDN博客 


本人小白一枚,在学习FPGA的过程中偶然刷到了tinyriscv这个开源项目,并且自己对计算机体系结构的知识也很感兴趣,所以想参考这个开源项目做一个基于RISC-V指令集的CPU,本项目很多思路和设计都参考了tinyriscv开源项目。

本人自己做的 riscv-cpu 项目仓库(如果觉得对你有帮助请一定一定点个 star!): 

riscv-cpu: 一个基于RISC-V指令集的CPU实现(成功移植到野火征途PRO开发板)


在设计RISC-V处理器之前,我们首先要做的事就是指令集的选取,指令集是一个CPU的基石,要实现CPU 计算和控制功能,就必须定义好一系列与硬件电路相匹配的指令系统。下面是RISC-V官方给出的指令集架构:

开源cpu指令集,RISC-V处理器设计,risc-v,fpga开发,学习

因为是第一次做,所以我们选择简单一点的32位基本指令集,也就是RV32I 基本指令集(目前增加了RV32M扩展)

RV32I 基本指令集有6种格式,分别是:

目的 类型
用于寄存器-寄存器操作 R 类型指令
用于短立即数和访存 load 操作 I 型指令
用于访存 store 操作 S 型指令
用于条件跳转操作 SB 类型指令
用于长立即数 U 型指令
用于无条件跳转 UJ 型指令

开源cpu指令集,RISC-V处理器设计,risc-v,fpga开发,学习

RV32I 基本指令集有47条指令,如下图:

开源cpu指令集,RISC-V处理器设计,risc-v,fpga开发,学习

本项目目前除了 FENCE 指令其他的都已经实现,下面介绍了一下这些指令的用法,这里给大家先推荐一个好用的工具叫Ripes,可以到上面运行riscv汇编指令,并且可以把对应的指令转成二进制机器码,方便我们后面的仿真:

Releases · mortbopet/Ripes · GitHub

开源cpu指令集,RISC-V处理器设计,risc-v,fpga开发,学习

下面我们开始指令的介绍。

RV32I 基本指令集

1. LUI 

语法:lui rd, imm,作用是将立即数imm逻辑左移12位,结果写入rd寄存器(立即数是无符号数)。

我们在ripes运行如下例子来看看结果:

lui x1,1
lui x2,255

如下是运行结果,可以看到寄存器内的数值都是立即数左移12位的结果(16进制): 

开源cpu指令集,RISC-V处理器设计,risc-v,fpga开发,学习

2. AUIPC 

语法:auipc rd, imm,作用是将立即数imm逻辑左移12位,然后加上当前指令PC的值,结果写入rd寄存器(立即数是无符号数)。

我们可以通过将立即数的值设置为0来计算PC的值:

auipc x1,0
auipc x2,0
auipc x3,0
auipc x4,4

运行结果如下: 

 开源cpu指令集,RISC-V处理器设计,risc-v,fpga开发,学习

3. JAL(无条件跳转指令)

语法:jal rd, imm,作用是将PC的值加上4,结果写入rd寄存器,rd默认为x1,同时将PC的值设置为当前jal指令地址PC加上符号位拓展的imm。 

我们可以通过这个指令来跳到指定的指令执行: 

auipc x2,0
auipc x3,0
auipc x4,4
jal x1,-12

 可以看到上述指令会一直循环执行。

4. JALR(无条件跳转指令,寄存器相对寻址)

语法:jalr rd, rs1,imm,作用是将PC的值加上4,结果写入rd寄存器,rd默认为x1,同时将当前PC值设置为寄存器rs1的值加上符号位拓展的imm。

功能和JAL指令一样,不过计算跳转地址的方式不一样,JAL指令跳转地址为PC+imm,而JALR指令跳转地址为寄存器rs1内容+imm: 

addi x1,x0,8
auipc x2,0
auipc x3,0
auipc x4,4
jalr x5,x1,4

因为第4条指令的地址为12,寄存器x1的内容8+立即数4等于12,所以可以看到程序跳转到第四条指令执行:

开源cpu指令集,RISC-V处理器设计,risc-v,fpga开发,学习

5. BEQ(分支跳转指令,相等时跳转)

语法:beq rs1, rs2, imm,作用是如果rs1的值等于rs2的值,则将PC设置为符号当前指令beq地址+符号位拓展的立即数imm。 

addi x1,x0,1
addi x2,x0,2
add x1,x1,x1
beq x1,x2,-4

 执行结果如下,可以看到第三条add指令执行了两次:

 开源cpu指令集,RISC-V处理器设计,risc-v,fpga开发,学习

6. BNE(分支跳转指令,不等时跳转)

语法:bne rs1, rs2, imm,作用是如果rs1的值不等于rs2的值,则将PC设置为符号当前指令bne地址+符号位拓展的立即数imm。 

addi x1,x0,1
addi x2,x0,8
add x1,x1,x1
bne x1,x2,-4

 执行结果如下,可以看到第三条add指令执行了三次:

开源cpu指令集,RISC-V处理器设计,risc-v,fpga开发,学习

7. BLT(分支跳转指令,小于时跳转)

语法:blt rs1, rs2, imm,作用是如果rs1的值小于rs2的值,则将PC设置为符号当前指令blt地址+符号位拓展的立即数imm。

addi x1,x0,1
addi x2,x0,8
add x1,x1,x1
blt x1,x2,-4

 执行结果如下,可以看到第三条add指令执行了三次:

开源cpu指令集,RISC-V处理器设计,risc-v,fpga开发,学习

8. BGE(分支跳转指令,大于等于时跳转)

语法:bge rs1, rs2, imm,作用是如果rs1的值大于或等于rs2的值,则将PC设置为符号当前指令bge地址+符号位拓展的立即数imm。

addi x1,x0,10
addi x2,x0,8
addi x1,x1,-1
bge x1,x2,-4

执行结果如下,可以看到第三条addi指令执行了三次:

开源cpu指令集,RISC-V处理器设计,risc-v,fpga开发,学习

9. BLTU(分支跳转指令,无符号数比较,小于时跳转)

语法:bltu rs1, rs2, imm,作用是如果rs1的值小于rs2的值(rs1和rs2为无符号数),则将PC设置为符号当前指令bltu地址+符号位拓展的imm。 

10. BGEU(分支跳转指令,无符号数比较,大于或等于时跳转)

语法:bgeu rs1, rs2, imm,作用是如果rs1的值大于或等于rs2的值(rs1和rs2为无符号数),则将PC设置为符号当前指令bgeu地址+符号位拓展的imm。  

BLTU、BGEU和BLT、BGE的区别在于一个是无符号数比较,一个是有符号数比较。

如下两个示例,执行结果是不一样的:

addi x1,x0,-1
addi x2,x0,8
addi x1,x1,-1
bge x1,x2,-4
addi x1,x0,-1
addi x2,x0,8
addi x1,x1,-1
bgeu x1,x2,-4

11. LB(访存指令,一字节)

语法:lb rd, imm, rs1,作用是从处读rs1加上imm的地址取一个字节的内容,并将该内容经符号位扩展后写入rd寄存器。

addi x1,x0,-1
lb x3,1,x1

执行结果如下,可以看到memory内第一个字节的数据被符号位扩展后送入寄存器x3:

开源cpu指令集,RISC-V处理器设计,risc-v,fpga开发,学习

 开源cpu指令集,RISC-V处理器设计,risc-v,fpga开发,学习

12. LH(访存指令,两字节)

语法:lh rd, imm, rs1,作用是从处读rs1加上imm的地址取两个字节的内容,并将该内容经符号位扩展后写入rd寄存器。

addi x1,x0,0
lh x3,4,x1

执行结果如下,可以看到memory内地址4的两个字节数据被符号位拓展后送入x3:

开源cpu指令集,RISC-V处理器设计,risc-v,fpga开发,学习

开源cpu指令集,RISC-V处理器设计,risc-v,fpga开发,学习

13. LW(访存指令,四字节)

语法:lw rd, imm, rs1,作用是从处读rs1加上imm的地址取四个字节的内容,并将该内容写入rd寄存器(因为四字节位数和寄存器位数相同,所以无需符号位拓展)。

addi x1,x0,0
lw x3,4,x1

 执行结果如下,可以看到memory内地址4的四个字节数据被送入x3:

开源cpu指令集,RISC-V处理器设计,risc-v,fpga开发,学习

 开源cpu指令集,RISC-V处理器设计,risc-v,fpga开发,学习

14. LBU(访存指令,一字节,无需符号位拓展)

语法:lbu rd, imm, rs1,作用是从处读rs1加上imm的地址取一个字节的内容,并将该内容经高位补0后写入rd寄存器。

15. LHU(访存指令,两字节,无需符号位拓展)

语法:lhu rd, imm, rs1,作用是从处读rs1加上imm的地址取两个字节的内容,并将该内容经高位补0后写入rd寄存器。

16. SB(访存指令,一字节)

语法:sb rs2, imm, rs1,作用是将rs2的低八位写入rs1加上imm的地址处。

addi x1,x0,-1
sb x1,0,x0

执行结果如下: 

开源cpu指令集,RISC-V处理器设计,risc-v,fpga开发,学习

开源cpu指令集,RISC-V处理器设计,risc-v,fpga开发,学习

17. SH(访存指令,两字节)

语法:sh rs2, imm, rs1,作用是将rs2的低16位写入rs1加上imm的地址处。 

addi x1,x0,-1
sh x1,0,x0

执行结果如下: 

 开源cpu指令集,RISC-V处理器设计,risc-v,fpga开发,学习

18. SW(访存指令,四字节) 

语法:sw rs2, imm, rs1,作用是将rs2写入rs1加上imm的地址处。 

addi x1,x0,-1
sw x1,0,x0

开源cpu指令集,RISC-V处理器设计,risc-v,fpga开发,学习

19. ADDI

语法:addi rd, rs1, imm,作用是将符号扩展的立即数imm的值加上rs1的值,结果写入rd寄存器,忽略算术溢出。

addi x1,x0,-1
addi x2,x1,2

执行结果如下: 

开源cpu指令集,RISC-V处理器设计,risc-v,fpga开发,学习

20. SLTI(小于置1)

语法:slti rd, rs1, imm,作用是将符号扩展的立即数imm的值与rs1的值比较(有符号数比较),如果rs1 < imm,则向rd寄存器写1,否则写0。

addi x1,x0,-1
slti x2,x1,2

执行结果如下:  

开源cpu指令集,RISC-V处理器设计,risc-v,fpga开发,学习

21. SLTIU(小于置1,无符号比较)

语法:sltiu rd, rs1, imm,作用是将符号位拓展的立即数imm作为作为无符号数与rs1的值比较(无符号数比较),如果rs1 < imm,则向rd寄存器写1,否则写0。(一定要将上面的话理解清楚,不然设计的时候会出问题)

addi x1,x0,-1
sltiu x2,x1,2

执行结果如下,可以看到x2结果变为了0:  

开源cpu指令集,RISC-V处理器设计,risc-v,fpga开发,学习

22. XORI(异或)

语法:xori rd, rs1, imm,作用是将rs1与符号位扩展的imm按位异或,结果写入rd寄存器。

23. ORI

语法:ori rd, rs1, imm,作用是将rs1与符号位扩展的imm按位或,结果写入rd寄存器。

24. ANDI

语法:andi rd, rs1, imm,作用是将rs1与符号位扩展的imm按位与,结果写入rd寄存器。

25. SLLI(逻辑左移)

语法:slli rd, rs1, shamt,作用是将rs1左移shamt位,空出的位补0,结果写入rd寄存器。

26. SRLI(逻辑右移)

语法:srli rd, rs1, shamt,作用是将rs1右移shamt位,空出的位补0,结果写入rd寄存器。

27. SRAI(算术右移)

语法:srai rd, rs1, shamt,作用是将rs1右移shamt位,空出的位用rs1的最高位补充,结果写入rd寄存器。

28. ADD

语法:add rd, rs1, rs2,作用是将rs1寄存器的值加上rs2寄存器的值,然后将结果写入rd寄存器里,忽略算术溢出。

29. SUB

语法:sub rd, rs1, rs2,作用是将rs1寄存器的值减去rs2寄存器的值,然后将结果写入rd寄存器里,忽略算术溢出。

30. SLL

语法:sll rd, rs1, rs2,作用是将rs1左移rs2位(低5位有效),空出的位补0,结果写入rd寄存器。

31. SLT

语法:slt rd, rs1, rs2,作用是将rs1的值与rs2的值比较(有符号数比较),如果rs1的值更小,则向rd寄存器写1,否则写0。

32. SLTU

语法:sltu rd, rs1, rs2,作用是将rs1的值与rs2的值比较(无符号数比较),如果rs1的值更小,则向rd寄存器写1,否则写0。

33. XOR

语法:xor rd, rs1, rs2,作用是将rs1与rs2按位异或,结果写入rd寄存器。

34. SRL

语法:srl rd, rs1, rs2,作用是将rs1右移rs2位(低5位有效),空出的位补0,结果写入rd寄存器。

35. SRA

语法:sra rd, rs1, rs2,作用是将rs1右移rs2位(低5位有效),空出的位用rs1的最高位补充,结果写入rd寄存器。

36. OR

语法:or rd, rs1, rs2,作用是将rs1与rs2按位或,结果写入rd寄存器。

37. AND

语法:and rd, rs1, rs2,作用是将rs1与rs2按位与,结果写入rd寄存器。

RV32M 扩展指令集

1. MUL

语法:mul rd, rs1, rs2,作用是将rs1与rs2相乘,结果的低32位写入rd寄存器。

2. MULH

语法:mulh rd, rs1, rs2,作用是将rs1与rs2相乘,结果的高32位写入rd寄存器。

3. MULHSU

语法:mulhsu rd, rs1, rs2,作用是将rs1与rs2相乘,其中rs1为有符号数,rs2为无符号数,结果的高32位写入rd寄存器。

4. MULHU

语法:mulhu rd, rs1, rs2,作用是将rs1与rs2相乘,其中rs1、rs2均为无符号数,结果的高32位写入rd寄存器。

5. DIV

语法:div rd, rs1, rs2,作用是将rs1与rs2相除,结果的写入rd寄存器。

6. DIVU

语法:divu rd, rs1, rs2,作用是将rs1与rs2相除,其中rs1、rs2均为无符号数,结果的写入rd寄存器。

7. REM

语法:rem rd, rs1, rs2,作用是将rs1与rs2相除,结果的余数写入rd寄存器。

8. REMU

语法:remu rd, rs1, rs2,作用是将rs1与rs2相除,其中rs1、rs2均为无符号数,结果的余数写入rd寄存器。

以上就是目前所用到的指令了,之后如果添加新的指令会在这里更新。

之后我会还会出新文章更新具体设计部分的内容,大家看了如果觉得有帮助请点个小小的赞吧~

如果遇到问题也欢迎加群 892873718 交流~文章来源地址https://www.toymoban.com/news/detail-752369.html

到了这里,关于RISC-V处理器的设计与实现(一)—— 基本指令集的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • RISC-V在快速发展的处理器生态系统中找到立足点

    RISC-V在快速发展的处理器生态系统中找到立足点

    原文:RISC-V Finds Its Foothold in a Rapidly Evolving Processor Ecosystem 作者:Agam Shah 转载自:https://thenewstack.io/risc-v-finds-its-foothold-in-a-rapidly-evolving-processor-ecosystem/ 以下是正文 But the open source processor architecture will need to find more support from the software dev community before it can rival x86 and ARM archit

    2024年02月13日
    浏览(13)
  • 基于mips指令集的处理器设计与实现

    基于mips指令集的处理器设计与实现

    1.mips指令集格式 2.mips寄存器特点 1.ALU模块 2.General_Register模块(通用寄存器) 3.instruction_cache模块(指令cache) 4.program_counter模块(程序计数器) 5.control模块(控制译码) MIPS是(Microcomputer without interlocked pipeline stages)的缩写,含义是无互锁流水级微处理器。MIPS 是最早的,最成功的RISC处

    2024年02月06日
    浏览(9)
  • MIPS指令集处理器设计(支持64条汇编指令)

    MIPS指令集处理器设计(支持64条汇编指令)

    一、题目背景和意义 二、国内外研究现状 (略) (1) .mips 基础 指令集格式 总结 MIPS是(Microcomputer without interlocked pipeline stages)[10]的缩写,含义是无互锁流水级微处理器。MIPS 是最早、最成功的RISC处理器之一[11],源于Stanford 大学的John Hennessy 教授的研究成果。(Hennessy 于1984年在

    2024年02月07日
    浏览(14)
  • ARM微处理器的指令集概述

    ARM微处理器的指令集概述

    ARM处理器是基于精简指令集计算机(RISC)原理设计的 ,指令集和相关译码机制较为简单。ARM微处理器的指令集是加载(Load)/存储(Store)型的,也即指令集仅能处理寄存器中的数据,而且处理结果都要放回寄存器中,而对系统存储器的访问则需要通过专门的加载/存储指令来

    2024年02月02日
    浏览(44)
  • ARM处理器架构的Thumb指令集中关于IT指令的使用

    在ARMv6T2以及ARMv7架构扩展了Thumb指令集,其中加入了 IT 指令,进一步增强了代码的紧凑性。 Thumb中有一个比较有意思的指令—— IT ,这条指令用于根据指定的条件来执行后面相继的四条指令。当然,Thumb-2中大部分算术逻辑指令都含有带条件执行的特征,不过Thumb-2是32位的。

    2024年02月07日
    浏览(13)
  • Tensorflow(libtensorflow)报指令集与处理器不兼容

    最近连续在多个项目上接收到Tensorflow与环境不兼容问题的报告。 在一个新部署或者升级的环境上,服务尝试启动; 正常执行过程中,服务加载模型,标准错误中输出一行错误信息后服务停止。 错误信息: tensorflow/core/platform/cpu_feature_guard.cc:36] The TensorFlow library was compiled to

    2024年02月04日
    浏览(10)
  • RISC-V:实现ADDI指令

    RISC-V:实现ADDI指令

            实验整体框架已给出,任务主要包括: 数据窗口的添加(可选,我添加了) 立即数生成错误修改(老师主动设置错误,修改见代码) 三端口寄存器模块的添加(这与此前的三端口略有不同,注意重点查看RegisterFile模块的实现) 代码中我加了数据观察窗口 所以验

    2023年04月08日
    浏览(13)
  • 『模型部署』神经网络模型部署[运行时|指令执行|处理器架构|TensorRT]

    『模型部署』神经网络模型部署[运行时|指令执行|处理器架构|TensorRT]

    『模型部署』神经网络模型部署[运行时|指令执行|处理器架构|TensorRT] 辅助文档-本教程配套代码,以及更多范例和文档 :https://github.com/NVIDIA/trt-samples-for-hackathon-cn/tree/master/cookbook Polygraphy:深度学习推理原型设计和调试工具包 介绍个工具Torch.Profiler,使用它来确定你的性能瓶颈

    2024年02月11日
    浏览(31)
  • 【基于FPGA的芯片设计】RISC-V的20条指令CPU设计

    【基于FPGA的芯片设计】RISC-V的20条指令CPU设计

    实验板卡 :xc7a100tlc sg324-2L,共20个开关 实验要求:          

    2024年02月16日
    浏览(15)
  • 19|RISC-V指令精讲(四):跳转指令实现与调试

    19|RISC-V指令精讲(四):跳转指令实现与调试

    你好,我是LMOS。 前面我们学习了无条件跳转指令,但是在一些代码实现里,我们必须根据条件的判断状态进行跳转。比如高级语言中的if-else 语句,这是一个典型程序流程控制语句,它能根据条件状态执行不同的代码。这种语句落到指令集层,就需要有根据条件状态进行跳转

    2024年01月22日
    浏览(13)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包