一.介绍

指令系统:计算机语言中的单词成为指令,而这个词汇表就是指令系统。

指令集架构(ISA)

        x86:传统pc市场的主流,善于处理大数据。

        ARM:移动端设备(手机)市场,处理快数据为主。

        RISC-V:当需要同时兼顾数据传输速度和传输量时,RISC-V更有优势。

更重要的是RISC-V是开源的。

二.计算机硬件的操作

主要包括:算术运算、逻辑运算、数据传输、移位操作、条件分支、无条件跳转。

数据存储模式:大端存储,小端存储。

大端:高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。

小端:低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。

设计原则:简单源于规整、优秀的设计需要适当的折中、更少则更快(寄存器数量太多可能会增加时钟周期)。


三.计算机中的指令表示

RISC-V常见指令表示:R型,I型,S型,B型,J型指令

R型:一般用于寄存器-寄存器操作。

I型:一般用于立即数访问和load操作。

S型:用于访存store操作。

B型:用于条件跳转操作。

J型:用于无条件操作。


R型:一般用于寄存器-寄存器操作。

funct7(7bit)rs2(5bit)rs1(5bit)funct3(3bit)rd(5bit)opcode(7bit)

funct7:操作码字段。

funct3:操作码字段。

rs2:第二个源操作数寄存器。

rs1:第一个源操作数寄存器。

rd:目的操作数寄存器,存放操作结果。

opcode:(操作码)指令的基本操作。

下面以add x9,x20,x21为例介绍。

00000001010110100000010010110011

01001:9        10100:20        10101:21

通过funct7,funct3,opcode来识别是一个R型加法指令

将x20寄存器中的值加上x21寄存器中的值相加的结果存放到x9寄存器中。


I型:一般用于短立即数和访存操作

immediate(12bit)rs1(5bit)funct3(3bit)rd(5bit)opcode(7bit)

注意:计算机中是以补码形式存储immediate;12位立即数。立即数范围-2^11到((2^11)-1)(-2048到2047)

下面以lb x9,64(x22)介绍

lb x9,64(x22)

000001000000

10110

000

01001

0000011

 000001000000 :64        10110:22        01001:9

解释:将rs1地址偏移立即数位空间中的值存储到rd所指的寄存器空间中。


S型:用于访存store操作

immediate[11:5](7bit)rs2(5bit)rs1(5bit)funct3(3bit)immediate[4:0](5bit)opcode(7bit)

个人理解这里的立即数为何这样存储:为了规整,将原本的rd用来存储立即数的低5位。

下面以sb x5,40(x6)介绍

sb x5,40(x6)

0000001

00101

00110

000

01000

0100011

000000101000:40        00101:5        00110:6

解释:将rs2寄存器中的值存储到rs1寄存器偏移立即数位地址中去。


B型:有条件分支

immediate[12,[10:5]](7bit)rs2(5bit)rs1(5bit)funct3(3bit)immediate[[4:1],11](5bit)opcode(7bit)

注意:13位立即数,末尾始终为0;

B型立即数格式(末尾时钟为零)
imm[12]imm[11]imm[10:5]imm[4:1]0

下面以beq x5,x6,100为例

beq x5,x6,100

0000011

00110

00101

000

00100

1100011

代码中整理出的立即数
0000001100100

       注意在使用b型指令时,代码末尾别忘了补个0(或者获取的立即数别忘了左移一位)。解释:如果rs1和rs2寄存器中的值相等,则pc跳转到pc+immediate位置去,这是要重建流水线的。


J型:无条件跳转

immediate[20,[10:1],11,[19:12]]

(20bit)

rd

(5bit)

opcode

(7bit

J型立即数(20位)

immediate[20] immediate[19:12] immediate[11] immediate[10:1] 0

下面以jal x1,100为例

jal x1,100

00000110010000000000

00001

1101111

代码中立即数
000000000000001100100

        写代码时,末尾补0别忘了

解释:将pc+4存储到rd寄存器中,同时pc跳转到pc+立即数位置去。


U型:格式和B型类似,20位大立即数操作

immediate[31:12]rdopcode

vfd

与J型区别在于立即数放的位置

下面以lui x1,0xf0000为例

lui x1,0xf0000

11110000000000000000

00001

0110111

解释:rd寄存器存储立即数  x1=0xf0000;


常见操作及其指令

1、算术运算指令

包括addi,slti,sltiu,add,sub,slt,sltu。

slt比较指令 指令后边加i 一般表示是指令中有立即数,而u表示有无符号。

immediate[11:0]rs1000rd0010011addi(I型)
immediate[11:0]rs1010rd0010011slti(I型)
immediate[11:0]rs1011rd0010011sltiu(I型)
0000000rs2rs1000rd0110011add(R型)
0100000rs2rs1000rd0110011sub(R型)
0000000rs2rs1010rd0110011slt(R型)
0000000rs2rs1011rd0110011sltu(R型)

2、移位指令

包括slli,srli,srai,sll,srl,sra。

注意立即数移位指令中立即数(shamt)的范围:(这里立即数是5位的立即数)具体如下表:

0000000shamtrs1001rd0010011slli(I型)
0000000shamtrs1101rd0010011srli(I型)
0100000shamtrs1101rd0010011srai(I型)
0000000rs2rs1001rd0110011sll(R型)
0000000rs2rs1101rd0110011srl(R型)
0100000rs2rs1101rd0110011sral(R型)

注意逻辑右移和算术右移是由区别的。

逻辑右移:数据向右移立即数位,空位填0。

算术右移:数据向右移立即数位,空位填最高位(符号位)。

为了区别这两个机器码的第30位用来作为判断。具体仔细观察上表。

3、逻辑操作指令

包括xori ,ori,andi,xor,or,and。

imm[11:0]rs1100rd0010011xori(I型)
imm[11:0]rs1110rd0010011ori(I型)
imm[11:0]rs1111rd0010011andi(I型)
0000000rs2rs1100rd0110011xor(R型)
0000000rs2rs1110rd0110011or(R型)
0000000rs2rs1111rd0110011and(R型)

小总结:算术运算,逻辑运算,移位运算这些基本运算指令一般都为R型或者I型指令

4、加载存储指令

包括lb,ln,lw,lbu,lhu,sb,sh,sw。

作用就是将数据从寄存器中取出来,或者存储到寄存器中去,不同在于每次取出多少(半字,字等)。

imm[11:0]rs1000rd0000011lb(I型)
imm[11:0]rs1001rd0000011lh(I型)
imm[11:0]rs1010rd0000011lw(I型)
imm[11:0]rs1100rd0000011lbu(I型)
imm[11:0]rs1101rd0000011lhu(I型)
imm[11:5]rs2rs1000imm[4:0]0100011sb(S型)
imm[11:5]rs2rs1001imm[4:0]0100011sh(S型)
imm[11:5]rs2rs1010imm[4:0]0100011sw(S型)

5、控制转移指令

主要是一些跳转指令:beg,bne,blt,bge,bltu,bgeu,jalr,jal。

imm[12]imm[10:5]rs2rs1000imm[4:1]imm[11]1100011beq(B型)
imm[12]imm[10:5]rs2rs1001imm[4:1]imm[11]1100011bne(B型)
imm[12]imm[10:5]rs2rs1100imm[4:1]imm[11]1100011blt(B型)
imm[12]imm[10:5]rs2rs1101imm[4:1]imm[11]1100011bge(B型)
imm[12]imm[10:5]rs2rs1110imm[4:1]imm[11]1100011bltu(B型)
imm[12]imm[10:5]rs2rs1111imm[4:1]imm[11]1100011bgeu(B型)
imm[11:0]rs1000rd1100011jalr(I型)
imm[20]imm[10:1]imm[11]imm[19:12]rd1100011jal(J型)

注意上述立即数存储方式,在上面的B型指令讲解中有提到。

总结

资源里有我使用FPGA写的一个基于RISC-V的单周期CPU。目前不具备流水线,后续准备写一个5级流水的单周期处理器,同样会发布到博客上。希望大家评论给出意见。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐