RISC-V指令系统
一.介紹
指令系統:計算機語言中的單詞成為指令,而這個詞匯表就是指令系統。
指令集架構(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為例介紹。
| 0000000 | 10101 | 10100 | 000 | 01001 | 0110011 |
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)介紹
| 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)介紹
| 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;
| imm[12] | imm[11] | imm[10:5] | imm[4:1] | 0 |
下面以beq x5,x6,100為例
| 0000011 | 00110 | 00101 | 000 | 00100 | 1100011 |
| 0 | 0 | 000011 | 0010 | 0 |
? ? ? ?注意在使用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
| 0 | 00000000 | 0 | 0000110010 | 0 |
? ? ? ? 寫代碼時,末尾補0別忘了
解釋:將pc+4存儲到rd寄存器中,同時pc跳轉到pc+立即數位置去。
U型:格式和B型類似,20位大立即數操作
| immediate[31:12] | rd | opcode |
vfd
與J型區別在于立即數放的位置
下面以lui x1,0xf0000為例
| 11110000000000000000 | 00001 | 0110111 |
解釋:rd寄存器存儲立即數? x1=0xf0000;
常見操作及其指令
1、算術運算指令
包括addi,slti,sltiu,add,sub,slt,sltu。
slt比較指令 指令后邊加i 一般表示是指令中有立即數,而u表示有無符號。
| immediate[11:0] | rs1 | 000 | rd | 0010011 | addi(I型) | |
| immediate[11:0] | rs1 | 010 | rd | 0010011 | slti(I型) | |
| immediate[11:0] | rs1 | 011 | rd | 0010011 | sltiu(I型) | |
| 0000000 | rs2 | rs1 | 000 | rd | 0110011 | add(R型) |
| 0100000 | rs2 | rs1 | 000 | rd | 0110011 | sub(R型) |
| 0000000 | rs2 | rs1 | 010 | rd | 0110011 | slt(R型) |
| 0000000 | rs2 | rs1 | 011 | rd | 0110011 | sltu(R型) |
2、移位指令
包括slli,srli,srai,sll,srl,sra。
注意立即數移位指令中立即數(shamt)的范圍:(這里立即數是5位的立即數)具體如下表:
| 0000000 | shamt | rs1 | 001 | rd | 0010011 | slli(I型) |
| 0000000 | shamt | rs1 | 101 | rd | 0010011 | srli(I型) |
| 0100000 | shamt | rs1 | 101 | rd | 0010011 | srai(I型) |
| 0000000 | rs2 | rs1 | 001 | rd | 0110011 | sll(R型) |
| 0000000 | rs2 | rs1 | 101 | rd | 0110011 | srl(R型) |
| 0100000 | rs2 | rs1 | 101 | rd | 0110011 | sral(R型) |
注意邏輯右移和算術右移是由區別的。
邏輯右移:數據向右移立即數位,空位填0。
算術右移:數據向右移立即數位,空位填最高位(符號位)。
為了區別這兩個機器碼的第30位用來作為判斷。具體仔細觀察上表。
3、邏輯操作指令
包括xori ,ori,andi,xor,or,and。
| imm[11:0] | rs1 | 100 | rd | 0010011 | xori(I型) | |
| imm[11:0] | rs1 | 110 | rd | 0010011 | ori(I型) | |
| imm[11:0] | rs1 | 111 | rd | 0010011 | andi(I型) | |
| 0000000 | rs2 | rs1 | 100 | rd | 0110011 | xor(R型) |
| 0000000 | rs2 | rs1 | 110 | rd | 0110011 | or(R型) |
| 0000000 | rs2 | rs1 | 111 | rd | 0110011 | and(R型) |
小總結:算術運算,邏輯運算,移位運算這些基本運算指令一般都為R型或者I型指令
4、加載存儲指令
包括lb,ln,lw,lbu,lhu,sb,sh,sw。
作用就是將數據從寄存器中取出來,或者存儲到寄存器中去,不同在于每次取出多少(半字,字等)。
| imm[11:0] | rs1 | 000 | rd | 0000011 | lb(I型) | |
| imm[11:0] | rs1 | 001 | rd | 0000011 | lh(I型) | |
| imm[11:0] | rs1 | 010 | rd | 0000011 | lw(I型) | |
| imm[11:0] | rs1 | 100 | rd | 0000011 | lbu(I型) | |
| imm[11:0] | rs1 | 101 | rd | 0000011 | lhu(I型) | |
| imm[11:5] | rs2 | rs1 | 000 | imm[4:0] | 0100011 | sb(S型) |
| imm[11:5] | rs2 | rs1 | 001 | imm[4:0] | 0100011 | sh(S型) |
| imm[11:5] | rs2 | rs1 | 010 | imm[4:0] | 0100011 | sw(S型) |
5、控制轉移指令
主要是一些跳轉指令:beg,bne,blt,bge,bltu,bgeu,jalr,jal。
| imm[12] | imm[10:5] | rs2 | rs1 | 000 | imm[4:1] | imm[11] | 1100011 | beq(B型) |
| imm[12] | imm[10:5] | rs2 | rs1 | 001 | imm[4:1] | imm[11] | 1100011 | bne(B型) |
| imm[12] | imm[10:5] | rs2 | rs1 | 100 | imm[4:1] | imm[11] | 1100011 | blt(B型) |
| imm[12] | imm[10:5] | rs2 | rs1 | 101 | imm[4:1] | imm[11] | 1100011 | bge(B型) |
| imm[12] | imm[10:5] | rs2 | rs1 | 110 | imm[4:1] | imm[11] | 1100011 | bltu(B型) |
| imm[12] | imm[10:5] | rs2 | rs1 | 111 | imm[4:1] | imm[11] | 1100011 | bgeu(B型) |
| imm[11:0] | rs1 | 000 | rd | 1100011 | jalr(I型) | |||
| imm[20] | imm[10:1] | imm[11] | imm[19:12] | rd | 1100011 | jal(J型) | ||
注意上述立即數存儲方式,在上面的B型指令講解中有提到。
總結
資源里有我使用FPGA寫的一個基于RISC-V的單周期CPU。目前不具備流水線,后續準備寫一個5級流水的單周期處理器,同樣會發布到博客上。希望大家評論給出意見。
總結
以上是生活随笔為你收集整理的RISC-V指令系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: D类音频功放(CS8120例)
- 下一篇: 众多OA办公协同系统,企业应如何选择?