RSIC-V 流水线

pc(program counter 存储当前指令)—> instuction RAM(指令内存) —> reg0~31(32个寄存器) —> ALU(逻辑数学运算单元) —> data RAM(数据内存)

上述数据流转流程被称为 instuction pipeline

Instruction set

RSIC-V 不管是32位cpu还是64位cpu,指令长度固定为32位。

opcode: 区分6种不同类型的指令

rd: destination reg目标寄存器,711共5bit,可以表示reg031,S-type和SB-type为操作型指令,不需要目标寄存器

rs1: source reg 源寄存器1,1519共5bit,可以表示reg031,存储源操作数

rs2: source reg 源寄存器2,2024共5bit,可以表示reg031,存储源操作数

funct3: 3bit操作码

funct7: 7bit操作码

imm: 立即数

常用指令

  • add x1, x0, 0 高级语言释义:x1 = x0 + 0, 其中x0寄存器为只读且值为0,该指令常用于x1寄存器初始化为0

  • sub rd,rs1,rs2 高级语言释义:rd = rs1 - rs2

  • mul rd,rs1,rs2 高级语言释义:rd = rs1 * rs2

  • div rd,rs1,rs2 高级语言释义:rd = rs1 / rs2

  • rem rd,rs1,rs2 高级语言释义:rd = rs1 % rs2

  • and rd,rs1,rs2 高级语言释义:rd = rs1 & rs2

  • or rd,rs1,rs2 高级语言释义:rd = rs1 | rs2

  • xor rd,rs1,rs2 高级语言释义:rd = rs1 ^ rs2

  • sll rd,rs1,rs2 高级语言释义:rd = rs1 << rs2

  • srl rd,rs1,rs2 高级语言释义:rd = rs1 >> rs2

  • slt rd,rs1,rs2 高级语言释义:rd = (rs1 < rs2)?1:0 (rs1 rs2为有符号数)

  • sltu rd,rs1,rs2 高级语言释义:rd = (rs1 < rs2)?1:0 (rs1 rs2为无符号数)

  • beq rs1,rs2,lable:若rs1的值等于rs2的值,程序跳转到lable处继续执行

  • bne rs1,rs2,lable:若rs1的值不等于rs2的值,程序跳转到lable处继续执行

  • blt rs1,rs2,lable:若rs1的值小于rs2的值,程序跳转到lable处继续执行 (bltu无符号)

  • bge rs1,rs2,lable:若rs1的值大于等于rs2的值,程序跳转到lable处继续执行 (bgeu无符号)

  • j label:程序直接跳转到lable处继续执行

  • jal rd,label:用于调用函数,把下一条指令的地址保存在rd中(通常用x1),然后跳转到label处继续执行

  • jalr rd,offset(rs):可用于函数返回,把下一条指令的地址存到rd中,然后跳转到rs+offset地址处的指令继续执行。若rd=x0就是单纯的跳转

TODO 未完待续。。。