基于RISC-V指令集的CPU设计和FPGA实现(二)

本文详细介绍了RISC-V指令集的结构和各类指令,包括R、I、S、B、U、J型指令,解析了各字段的含义和使用场景,并通过实例说明了指令的应用。此外,还提到了立即数扩展和寄存器x0的特性,以及在CPU设计中考虑指令集的特点。

RISC-V 指令集分析

其实接下来的指令介绍我刚开始不太确定要不要写,因为对于 CPU 设计和实现而言略有拖沓,但是熟练掌握指令格式还是对写 CPU 有帮助的。接下来的部分假如学过 RISC-V 指令集的可以跳过,并且也只是简单介绍下指令的特点和作用,并不会细讲,建议拿 RISC-V 指令集尝试实现一下 C 语言程序。(或者体会我们将一百多行 C 编译出来的机器码和汇编码做手动解释的痛苦,不过我当时是用 Java 程序自动完成的,得亏 RISC-V 指令集还算工整😛)

RISC-V指令为32位等长指令(不考虑其他短指令),其指令分为 R、I、S、B(SB)、U、J(UJ)型,结构较为工整。

 

 

  • rs1 操作寄存器 1,一般是从中取出数据

  • rs2 操作寄存器 2,一般是从中取出数据

  • opecode 指令代码,用来代表是哪种指令(一般是大的类型,如 R、I、S、B、U、J型)

  • funct7funct3 主要用来表明指令的具体功能(一般是小的类型,如有无符号)

  • rd 目的寄存器,一般是要写入的寄存器

  • imm 立即数,后面的类似数组的调用即为类似数组的调用 : ),不过要注意的是有一部分类型(B,J型指令的立即数空了一位)

 

 

分析各个指令(详见RISC-V的指令说明书),易知 opecode 能够分辨指令的类型和部分同类型指令,同类型指令主要靠 funct3funct7 分辨其操作不同。比如对于有符号操作和无符号操作,其差别仅为 funct7 的一位区别。

但是在实际写代码的时候是否要用这些特点就不好说了,一方面是用了之后可读性下降,而且判断不全面也会出现指令误判的可能,另一方面是用了是否能提升性能有待商榷,毕竟Vivado的综合能力还是蛮强的。

注意:

  • 对于立即数扩展,还需要注意

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值