RISC-V指令系统
一.介紹
指令系統(tǒng):計(jì)算機(jī)語言中的單詞成為指令,而這個詞匯表就是指令系統(tǒng)。
指令集架構(gòu)(ISA)
????????x86:傳統(tǒng)pc市場的主流,善于處理大數(shù)據(jù)。
????????ARM:移動端設(shè)備(手機(jī))市場,處理快數(shù)據(jù)為主。
????????RISC-V:當(dāng)需要同時兼顧數(shù)據(jù)傳輸速度和傳輸量時,RISC-V更有優(yōu)勢。
更重要的是RISC-V是開源的。
二.計(jì)算機(jī)硬件的操作
主要包括:算術(shù)運(yùn)算、邏輯運(yùn)算、數(shù)據(jù)傳輸、移位操作、條件分支、無條件跳轉(zhuǎn)。
數(shù)據(jù)存儲模式:大端存儲,小端存儲。
大端:高位字節(jié)排放在內(nèi)存的低地址端,低位字節(jié)排放在內(nèi)存的高地址端。
小端:低位字節(jié)排放在內(nèi)存的低地址端,高位字節(jié)排放在內(nèi)存的高地址端。
設(shè)計(jì)原則:簡單源于規(guī)整、優(yōu)秀的設(shè)計(jì)需要適當(dāng)?shù)恼壑小⒏賱t更快(寄存器數(shù)量太多可能會增加時鐘周期)。
三.計(jì)算機(jī)中的指令表示
RISC-V常見指令表示:R型,I型,S型,B型,J型指令
R型:一般用于寄存器-寄存器操作。
I型:一般用于立即數(shù)訪問和load操作。
S型:用于訪存store操作。
B型:用于條件跳轉(zhuǎn)操作。
J型:用于無條件操作。
R型:一般用于寄存器-寄存器操作。
| funct7(7bit) | rs2(5bit) | rs1(5bit) | funct3(3bit) | rd(5bit) | opcode(7bit) |
funct7:操作碼字段。
funct3:操作碼字段。
rs2:第二個源操作數(shù)寄存器。
rs1:第一個源操作數(shù)寄存器。
rd:目的操作數(shù)寄存器,存放操作結(jié)果。
opcode:(操作碼)指令的基本操作。
下面以add x9,x20,x21為例介紹。
| 0000000 | 10101 | 10100 | 000 | 01001 | 0110011 |
01001:9? ? ? ? 10100:20? ? ? ? 10101:21
通過funct7,funct3,opcode來識別是一個R型加法指令
將x20寄存器中的值加上x21寄存器中的值相加的結(jié)果存放到x9寄存器中。
I型:一般用于短立即數(shù)和訪存操作
| immediate(12bit) | rs1(5bit) | funct3(3bit) | rd(5bit) | opcode(7bit) |
注意:計(jì)算機(jī)中是以補(bǔ)碼形式存儲immediate;12位立即數(shù)。立即數(shù)范圍-2^11到((2^11)-1)(-2048到2047)
下面以lb?x9,64(x22)介紹
| 000001000000 | 10110 | 000 | 01001 | 0000011 |
?000001000000 :64? ? ? ? 10110:22? ? ? ? 01001:9
解釋:將rs1地址偏移立即數(shù)位空間中的值存儲到rd所指的寄存器空間中。
S型:用于訪存store操作
| immediate[11:5](7bit) | rs2(5bit) | rs1(5bit) | funct3(3bit) | immediate[4:0](5bit) | opcode(7bit) |
個人理解這里的立即數(shù)為何這樣存儲:為了規(guī)整,將原本的rd用來存儲立即數(shù)的低5位。
下面以sb x5,40(x6)介紹
| 0000001 | 00101 | 00110 | 000 | 01000 | 0100011 |
000000101000:40? ? ? ? 00101:5? ? ? ? 00110:6
解釋:將rs2寄存器中的值存儲到rs1寄存器偏移立即數(shù)位地址中去。
B型:有條件分支
| immediate[12,[10:5]](7bit) | rs2(5bit) | rs1(5bit) | funct3(3bit) | immediate[[4:1],11](5bit) | opcode(7bit) |
注意:13位立即數(shù),末尾始終為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型指令時,代碼末尾別忘了補(bǔ)個0(或者獲取的立即數(shù)別忘了左移一位)。解釋:如果rs1和rs2寄存器中的值相等,則pc跳轉(zhuǎn)到pc+immediate位置去,這是要重建流水線的。
J型:無條件跳轉(zhuǎn)
| immediate[20,[10:1],11,[19:12]] (20bit) | rd (5bit) | opcode (7bit |
J型立即數(shù)(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 |
? ? ? ? 寫代碼時,末尾補(bǔ)0別忘了
解釋:將pc+4存儲到rd寄存器中,同時pc跳轉(zhuǎn)到pc+立即數(shù)位置去。
U型:格式和B型類似,20位大立即數(shù)操作
| immediate[31:12] | rd | opcode |
vfd
與J型區(qū)別在于立即數(shù)放的位置
下面以lui x1,0xf0000為例
| 11110000000000000000 | 00001 | 0110111 |
解釋:rd寄存器存儲立即數(shù)? x1=0xf0000;
常見操作及其指令
1、算術(shù)運(yùn)算指令
包括addi,slti,sltiu,add,sub,slt,sltu。
slt比較指令 指令后邊加i 一般表示是指令中有立即數(shù),而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。
注意立即數(shù)移位指令中立即數(shù)(shamt)的范圍:(這里立即數(shù)是5位的立即數(shù))具體如下表:
| 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型) |
注意邏輯右移和算術(shù)右移是由區(qū)別的。
邏輯右移:數(shù)據(jù)向右移立即數(shù)位,空位填0。
算術(shù)右移:數(shù)據(jù)向右移立即數(shù)位,空位填最高位(符號位)。
為了區(qū)別這兩個機(jī)器碼的第30位用來作為判斷。具體仔細(xì)觀察上表。
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型) |
小總結(jié):算術(shù)運(yùn)算,邏輯運(yùn)算,移位運(yùn)算這些基本運(yùn)算指令一般都為R型或者I型指令
4、加載存儲指令
包括lb,ln,lw,lbu,lhu,sb,sh,sw。
作用就是將數(shù)據(jù)從寄存器中取出來,或者存儲到寄存器中去,不同在于每次取出多少(半字,字等)。
| 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、控制轉(zhuǎn)移指令
主要是一些跳轉(zhuǎn)指令: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型) | ||
注意上述立即數(shù)存儲方式,在上面的B型指令講解中有提到。
總結(jié)
資源里有我使用FPGA寫的一個基于RISC-V的單周期CPU。目前不具備流水線,后續(xù)準(zhǔn)備寫一個5級流水的單周期處理器,同樣會發(fā)布到博客上。希望大家評論給出意見。
總結(jié)
以上是生活随笔為你收集整理的RISC-V指令系统的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: D类音频功放(CS8120例)
- 下一篇: 【编译原理】词法分析(正规式与自动机)