180 lines
6.1 KiB
Plaintext
180 lines
6.1 KiB
Plaintext
// Copyright (c) 2013-2019 Bluespec, Inc. All Rights Reserved
|
|
|
|
// ================================================================
|
|
// This is an 'include' file, not a separate BSV package
|
|
//
|
|
// Contains RISC-V ISA defs for the 'C' ("compressed") extension
|
|
// i.e., 16-bit instructions
|
|
//
|
|
// ================================================================
|
|
// Instruction field encodings
|
|
|
|
typedef Bit #(16) Instr_C;
|
|
|
|
Bit #(2) opcode_C0 = 2'b00;
|
|
Bit #(2) opcode_C1 = 2'b01;
|
|
Bit #(2) opcode_C2 = 2'b10;
|
|
|
|
Bit #(3) funct3_C_LWSP = 3'b_010;
|
|
Bit #(3) funct3_C_LDSP = 3'b_011; // RV64 and RV128
|
|
Bit #(3) funct3_C_LQSP = 3'b_001; // RV128
|
|
Bit #(3) funct3_C_FLWSP = 3'b_011; // RV32FC
|
|
Bit #(3) funct3_C_FLDSP = 3'b_001; // RV32DC, RV64DC
|
|
|
|
Bit #(3) funct3_C_SWSP = 3'b_110;
|
|
|
|
Bit #(3) funct3_C_SQSP = 3'b_101; // RV128
|
|
Bit #(3) funct3_C_FSDSP = 3'b_101; // RV32DC, RV64DC
|
|
|
|
Bit #(3) funct3_C_SDSP = 3'b_111; // RV64 and RV128
|
|
Bit #(3) funct3_C_FSWSP = 3'b_111; // RV32FC
|
|
|
|
Bit #(3) funct3_C_LQ = 3'b_001; // RV128
|
|
Bit #(3) funct3_C_FLD = 3'b_001; // RV32DC, RV64DC
|
|
|
|
Bit #(3) funct3_C_LW = 3'b_010;
|
|
|
|
Bit #(3) funct3_C_LD = 3'b_011; // RV64 and RV128
|
|
Bit #(3) funct3_C_FLW = 3'b_011; // RV32FC
|
|
|
|
Bit #(3) funct3_C_FSD = 3'b_101; // RV32DC, RV64DC
|
|
Bit #(3) funct3_C_SQ = 3'b_101; // RV128
|
|
|
|
Bit #(3) funct3_C_SW = 3'b_110;
|
|
|
|
Bit #(3) funct3_C_SD = 3'b_111; // RV64 and RV128
|
|
Bit #(3) funct3_C_FSW = 3'b_111; // RV32FC
|
|
|
|
Bit #(3) funct3_C_JAL = 3'b_001; // RV32
|
|
Bit #(3) funct3_C_J = 3'b_101;
|
|
Bit #(3) funct3_C_BEQZ = 3'b_110;
|
|
Bit #(3) funct3_C_BNEZ = 3'b_111;
|
|
|
|
Bit #(4) funct4_C_JR = 4'b_1000;
|
|
Bit #(4) funct4_C_JALR = 4'b_1001;
|
|
|
|
Bit #(3) funct3_C_LI = 3'b_010;
|
|
Bit #(3) funct3_C_LUI = 3'b_011; // RV64 and RV128
|
|
|
|
Bit #(3) funct3_C_NOP = 3'b_000;
|
|
Bit #(3) funct3_C_ADDI = 3'b_000;
|
|
Bit #(3) funct3_C_ADDIW = 3'b_001;
|
|
Bit #(3) funct3_C_ADDI16SP = 3'b_011;
|
|
Bit #(3) funct3_C_ADDI4SPN = 3'b_000;
|
|
Bit #(3) funct3_C_SLLI = 3'b_000;
|
|
|
|
Bit #(3) funct3_C_SRLI = 3'b_100;
|
|
Bit #(2) funct2_C_SRLI = 2'b_00;
|
|
|
|
Bit #(3) funct3_C_SRAI = 3'b_100;
|
|
Bit #(2) funct2_C_SRAI = 2'b_01;
|
|
|
|
Bit #(3) funct3_C_ANDI = 3'b_100;
|
|
Bit #(2) funct2_C_ANDI = 2'b_10;
|
|
|
|
Bit #(4) funct4_C_MV = 4'b_1000;
|
|
Bit #(4) funct4_C_ADD = 4'b_1001;
|
|
|
|
Bit #(6) funct6_C_AND = 6'b_100_0_11;
|
|
Bit #(2) funct2_C_AND = 2'b_11;
|
|
|
|
Bit #(6) funct6_C_OR = 6'b_100_0_11;
|
|
Bit #(2) funct2_C_OR = 2'b_10;
|
|
|
|
Bit #(6) funct6_C_XOR = 6'b_100_0_11;
|
|
Bit #(2) funct2_C_XOR = 2'b_01;
|
|
|
|
Bit #(6) funct6_C_SUB = 6'b_100_0_11;
|
|
Bit #(2) funct2_C_SUB = 2'b_00;
|
|
|
|
Bit #(6) funct6_C_ADDW = 6'b_100_1_11;
|
|
Bit #(2) funct2_C_ADDW = 2'b_01;
|
|
|
|
Bit #(6) funct6_C_SUBW = 6'b_100_1_11;
|
|
Bit #(2) funct2_C_SUBW = 2'b_00;
|
|
|
|
Bit #(4) funct4_C_EBREAK = 4'b_1001;
|
|
|
|
// ================================================================
|
|
// Functions to extract instruction fields from 'C' (compressed) instructions
|
|
|
|
function Tuple4 #(Bit #(4), RegName, RegName, Bit #(2)) fv_ifields_CR_type (Instr_C instr);
|
|
let funct4 = instr [15:12];
|
|
let rd_rs1 = instr [11: 7];
|
|
let rs2 = instr [ 6: 2];
|
|
let op = instr [ 1: 0];
|
|
return tuple4 (funct4, rd_rs1, rs2, op);
|
|
endfunction
|
|
|
|
function Tuple5 #(Bit #(3), Bit #(1), Bit #(5), Bit #(5), Bit #(2)) fv_ifields_CI_type (Instr_C instr);
|
|
let funct3 = instr [15:13];
|
|
let imm_at_12 = instr [12:12];
|
|
let rd_rs1 = instr [11: 7];
|
|
let imm_at_6_2 = instr [ 6: 2];
|
|
let op = instr [ 1: 0];
|
|
return tuple5 (funct3, imm_at_12, rd_rs1, imm_at_6_2, op);
|
|
endfunction
|
|
|
|
function Tuple4 #(Bit #(3), Bit #(6), RegName, Bit #(2)) fv_ifields_CSS_type (Instr_C instr);
|
|
let funct3 = instr [15:13];
|
|
let imm_at_12_7 = instr [12: 7];
|
|
let rs2 = instr [ 6: 2];
|
|
let op = instr [ 1: 0];
|
|
return tuple4 (funct3, imm_at_12_7, rs2, op);
|
|
endfunction
|
|
|
|
function Tuple4 #(Bit #(3), Bit #(8), RegName, Bit #(2)) fv_ifields_CIW_type (Instr_C instr);
|
|
let funct3 = instr [15:13];
|
|
let imm_at_12_5 = instr [12: 5];
|
|
let rd = {2'b01, instr [4:2]};
|
|
let op = instr [ 1: 0];
|
|
return tuple4 (funct3, imm_at_12_5, rd, op);
|
|
endfunction
|
|
|
|
function Tuple6 #(Bit #(3), Bit #(3), RegName, Bit #(2), RegName, Bit #(2)) fv_ifields_CL_type (Instr_C instr);
|
|
let funct3 = instr [15:13];
|
|
let imm_at_12_10 = instr [12:10];
|
|
let rs1 = {2'b01, instr [9:7]};
|
|
let imm_at_6_5 = instr [ 6: 5];
|
|
let rd = {2'b01, instr [4:2]};
|
|
let op = instr [ 1: 0];
|
|
return tuple6 (funct3, imm_at_12_10, rs1, imm_at_6_5, rd, op);
|
|
endfunction
|
|
|
|
function Tuple6 #(Bit #(3), Bit #(3), RegName, Bit #(2), RegName, Bit #(2)) fv_ifields_CS_type (Instr_C instr);
|
|
let funct3 = instr [15:13];
|
|
let imm_at_12_10 = instr [12:10];
|
|
let rs1 = {2'b01, instr [9:7]};
|
|
let imm_at_6_5 = instr [ 6: 5];
|
|
let rs2 = {2'b01, instr [4:2]};
|
|
let op = instr [ 1: 0];
|
|
return tuple6 (funct3, imm_at_12_10, rs1, imm_at_6_5, rs2, op);
|
|
endfunction
|
|
|
|
function Tuple5 #(Bit #(6), RegName, Bit #(2), RegName, Bit #(2)) fv_ifields_CA_type (Instr_C instr);
|
|
let funct6 = instr [15:10];
|
|
let rd_rs1 = {2'b01, instr [9:7]};
|
|
let funct2 = instr [ 6: 5];
|
|
let rs2 = {2'b01, instr [4:2]};
|
|
let op = instr [ 1: 0];
|
|
return tuple5 (funct6, rd_rs1, funct2, rs2, op);
|
|
endfunction
|
|
|
|
function Tuple5 #(Bit #(3), Bit #(3), RegName, Bit #(5), Bit #(2)) fv_ifields_CB_type (Instr_C instr);
|
|
let funct3 = instr [15:13];
|
|
let imm_at_12_10 = instr [12:10];
|
|
let rs1 = {2'b01, instr [9:7]};
|
|
let imm_at_6_2 = instr [ 6: 2];
|
|
let op = instr [ 1: 0];
|
|
return tuple5 (funct3, imm_at_12_10, rs1, imm_at_6_2, op);
|
|
endfunction
|
|
|
|
function Tuple3 #(Bit #(3), Bit #(11), Bit #(2)) fv_ifields_CJ_type (Instr_C instr);
|
|
let funct3 = instr [15:13];
|
|
let imm_at_12_2 = instr [12: 2];
|
|
let op = instr [ 1: 0];
|
|
return tuple3 (funct3, imm_at_12_2, op);
|
|
endfunction
|
|
|
|
// ================================================================
|