PicoRV32 支持RISCV基本指令集外,还支持压缩指令(C扩展),乘法指令(M扩展)。
PicoRV32对指令解码时候,读取一条32bit指令,首先判断指令的最低2bit是否是2'b11,如果2'b11则是一条32bit指令,否则是一条16bit指令(C扩展)。
针对RISCV 基础指令集,opcode占指令的低7位,低7位中最低两位用于区分16位和32位指令,则只有5bit用于区分指令类型,我翻开手册整理指令如下
opcode[6:2] | opcode[1:0] | 指令 | 说明 |
5'b00000 | 2'b11 | LB,LBU,LH,LHU,LW | 加载指令 |
5'b00001 | 2'b11 | FLW,FLD,FLQ | RV32F/D/Q扩展,加载指令 |
5'b00010 | 2'b11 | 未查到 | |
5'b00011 | 2'b11 | FENCE | |
5'b00100 | 2'b11 | ADDI,SLTI,SLTIU,XORI, ORI,ANDI,SLLI,SRLI,SRAI | 立即数指令 |
5'b00101 | 2'b11 | AUIPC | |
5'b00110 | 2'b11 | RV64指令 | |
5'b00111 | 2'b11 | 48位指令集 | |
5'b01000 | 2'b11 | SB,SH,SW | 存储指令 |
5'b01001 | 2'b11 | RV32F/D/Q加载指令 | |
5'b01010 | 2'b11 | 未查到 | |
5'b01011 | 2'b11 | RV32A/RV64A 原子指令 | |
5'b01100 | 2'b11 | ADD,SUB,SLL,SLT,SLTU, XOR,SRL,SRA,OR,AND, | 寄存器指令/乘法指令8条 |
5'b01101 | 2'b11 | LUI | |
5'b01110 | 2'b11 | RV64I/RV64M指令 | |
5'b01111 | 2'b11 | 表示此指令为64位指令 | |
5'b10000 | 2'b11 | RV32F/D/Q扩展 | |
5'b10001 | 2'b11 | RV32F/D/Q扩展 | |
5'b10010 | 2'b11 | RV32F/D/Q扩展 | |
5'b10011 | 2'b11 | RV32F/D/Q扩展 | |
5'b10100 | 2'b11 | RV32F/D/Q扩展 | |
5'b10101 | 2'b11 | 未查到 | |
5'b10110 | 2'b11 | 未查到 | |
5'b10111 | 2'b11 | 48位指令集 | |
5'b11000 | 2'b11 | BEQ,BNE,BLT,BGE,BLTU, BGEU | |
5'b11001 | 2'b11 | JALR | |
5'b11010 | 2'b11 | 未查到 | |
5'b11011 | 2'b11 | JAL | |
5'b11100 | 2'b11 | ECALL,EBREAK,CSRxxx | |
5'b11101 | 2'b11 | 未查到 | |
5'b11110 | 2'b11 | 未查到 | |
5'b11111 | 2'b11 | 保留 | |
根据上表PicoRV32支持指令
opcode[6:2] | 指令 | ||
5'b00000 | LB,LBU,LH,LHU,LW | ||
5'b00011 | FENCE | ||
5'b00100 | ADDI,SLTI,SLTIU,XOR, ORI,ANDI,SLLI,SRLI,SRAI | ||
5'b00101 | AUIPC | ||
5'b01000 | SB,SH,SW | ||
5'b01100 | ADD,SUB,SLL,SLT,SLTU,XOR, SRL,SRA,OR,AND, | ||
5'b01101 | LUI | ||
5'b11000 | BEQ,BNE,BLT,BGE,BLTU,BGEU | ||
5'b11001 | JALR | ||
5'b11011 | JAL | ||
5'b11100 | ECALL,EBREAK |