打印
[RISC-V MCU 应用开发]

从零开始设计RISC-V处理器——指令系统

[复制链接]
3316|88
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本人本科生一枚,之前学习了计算机体系结构(RISC-V版)这本书,对CPU的设计产生了浓厚的兴趣,于是决定在寒假期间,自己动手设计一个基于RISC-V指令集的CPU,顺便写一些**,记录自己的学习成果,如果**中有不合理之处,希望大家能批评指正。

今天是第一天,首先进行指令的选取。


使用特权

评论回复

相关帖子

沙发
9dome猫|  楼主 | 2022-5-28 16:09 | 只看该作者
原文链接:https://blog.csdn.net/qq_45677520/article/details/122309083

使用特权

评论回复
板凳
9dome猫|  楼主 | 2022-5-28 16:11 | 只看该作者
如下表所示,计划实现以下37条指令。

使用特权

评论回复
地板
9dome猫|  楼主 | 2022-5-28 16:11 | 只看该作者
对指令的理解:
1.LUI:将20位立即数的值左移12位(低12位补零)成为一个32位数,将其写回rd。这一指令主要是为了在寄存器中存入比较大的立即数,比如,要想在寄存器X1中存入一个数,可以用addi指令实现(addi x1,x0,100),但这个数的范围有限(-2048~2047),因为addi指令的立即数部分只有12位,能表示最大的无符号数位0xfff(十进制4095),对应的有符号数的范围则为-2048到2047。当立即数超出这个范围,则需要用lui指令。

使用特权

评论回复
5
9dome猫|  楼主 | 2022-5-28 16:12 | 只看该作者
如lui x1,0xffff ,二进制指令:00001111111111111111000010110111

汇编器执行结果如下:

使用特权

评论回复
6
9dome猫|  楼主 | 2022-5-28 16:14 | 只看该作者
2.AUIPC:将20位立即数的值左移12位(低12位补零)成为一个32位数,再加上该指令的pc值,再将结果写回rd。这条指令与lui类似,可能是为了实现PC在较大范围内跳转(仅仅是猜测,因为这条指令我还没有接触过)。

使用特权

评论回复
7
9dome猫|  楼主 | 2022-5-28 16:15 | 只看该作者
如auipc x2,0xfff,二进制指令:00000000111111111111000100010111

当前PC为4,汇编器执行结果如下:

使用特权

评论回复
8
9dome猫|  楼主 | 2022-5-28 16:49 | 只看该作者
3.JAL:PC+4 的结果送 rd 但不送入PC,然后计算下条指令地
址。转移地址采用相对寻址,基准地址为当前指令地址
(即 PC),偏移量为立即数 imm20 经符扩展后的值的 2 倍。
在实际的汇编程序编写中,跳转的目标往往使用汇编程序中的 label,汇编器会自动根据 label 所在的地址计算出相对的偏移量赋予指令编码。

使用特权

评论回复
9
9dome猫|  楼主 | 2022-5-28 16:50 | 只看该作者
如:
jal x3,label1 二进制:00000000100000000000000111101111
addi x4,x0,4
label1:
addi x5,x0,5
当前PC为 8,跳过给X4赋值这条指令,并且将12赋给X3寄存器,汇编器执行结果如下:

使用特权

评论回复
10
9dome猫|  楼主 | 2022-5-28 16:50 | 只看该作者

使用特权

评论回复
11
9dome猫|  楼主 | 2022-5-28 16:51 | 只看该作者
(补充:仔细分析上面jal指令的二进制会发现,立即数部分是4,4*2=8,PC+8=12,跳过中间的一条指令,这样看起来似乎没什么问题。

但是再看jal的立即数部分,总共是20位,拼接起来是[20:1],这里为什么不是[19:0]?

观察其他的指令格式,如果立即数是12位,那么会表示为[11:0],但JAL,BEQ,BNE,BLT,BGE,BLTU,BGEU却例外。

使用特权

评论回复
12
9dome猫|  楼主 | 2022-5-28 16:52 | 只看该作者
于是引发了以下思考(个人观点,未经查证,以后深入学习之后再回来补充):假设立即数其实是21位的,即[20:0],只不过始终保持最低位为0,所以在指令中仅仅体现[20:1],这样一来,21位的立即数一定是2的倍数,将立即数乘以2之后,一定是4的倍数,这样就可以保证跳转后的PC一定是4的倍数。所以,对于一个label,假设当前指令为第0行,label为第几行,立即数[20:1]则为多少,这样,立即数最低位补0再乘以2,与当前PC相加,则为正确的跳转地址。

使用特权

评论回复
13
9dome猫|  楼主 | 2022-5-28 16:52 | 只看该作者
以上的假设便能够合理地解释立即数为[20:1]的原因。

使用特权

评论回复
14
9dome猫|  楼主 | 2022-5-28 16:53 | 只看该作者
基于以上假设再来看上面jal指令的二进制,发现并不是这样,在以上的假设中,立即数应该是2,但汇编器转化出来的立即数是4,所以要么是我的假设出了问题,要么是汇编器出了问题。

使用特权

评论回复
15
9dome猫|  楼主 | 2022-5-28 16:53 | 只看该作者
在这里我更愿意相信我的假设,也许并不一定正确,但这看起来似乎更合理。以上仅为个人拙见,日后深入学习后可能才会发现其中的奥妙。)

使用特权

评论回复
16
9dome猫|  楼主 | 2022-5-28 16:54 | 只看该作者
4.JALR:jalr 指令使用 12 位立即数(有符号数)作为偏移量,与操作数寄存器 rs1中的值相加,然后将结果的最低有效位置0。jalr指令将其下一条指令的 PC(即当前指令PC+4)的值写入其结果寄存器 rd。

使用特权

评论回复
17
9dome猫|  楼主 | 2022-5-28 16:55 | 只看该作者
如:
addi x4,x0,4
jalr x8,x4,8 二进制:00000000100000100000111111100111
addi x5,x0,5
addi x6,x0,6
addi x7,x0,7
jalr指令所在的PC为4,4+8=12,则跳向PC=12的指令,同时将8存入X8寄存器。

使用特权

评论回复
18
9dome猫|  楼主 | 2022-5-28 16:56 | 只看该作者
汇编器执行结果如下:

使用特权

评论回复
19
9dome猫|  楼主 | 2022-5-28 16:56 | 只看该作者
5.BEQ:beq指令只有在操作数寄存器rs1中的数值与操作数寄存器rs2的数值相等时,才会跳转,跳转地址为offset的有符号扩展和最低位补0(即乘以2)的偏移量加上BEQ指令的地址。

使用特权

评论回复
20
9dome猫|  楼主 | 2022-5-28 16:57 | 只看该作者
如:
addi x1,x0,1
label1:
add x1,x1,x1
addi x2,x0,2
beq x1,x2,label1 二进制:11111110001000001000110011100011

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

134

主题

1421

帖子

2

粉丝