OpenCores
URL https://opencores.org/ocsvn/riscv_vhdl/riscv_vhdl/trunk

Subversion Repositories riscv_vhdl

[/] [riscv_vhdl/] [trunk/] [debugger/] [src/] [common/] [riscv-isa.h] - Diff between revs 2 and 4

Show entire file | Details | Blame | View Log

Rev 2 Rev 4
Line 1... Line 1...
/**
/*
 * @file
 *  Copyright 2018 Sergey Khabarov, sergeykhbr@gmail.com
 * @copyright  Copyright 2016 GNSS Sensor Ltd. All right reserved.
 *
 * @author     Sergey Khabarov - sergeykhbr@gmail.com
 *  Licensed under the Apache License, Version 2.0 (the "License");
 * @brief      RISC-V ISA specified structures and constants.
 *  you may not use this file except in compliance with the License.
 
 *  You may obtain a copy of the License at
 
 *
 
 *      http://www.apache.org/licenses/LICENSE-2.0
 
 *
 
 *  Unless required by applicable law or agreed to in writing, software
 
 *  distributed under the License is distributed on an "AS IS" BASIS,
 
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
 *  See the License for the specific language governing permissions and
 
 *  limitations under the License.
 */
 */
 
 
#ifndef __DEBUGGER_RISCV_ISA_H__
#ifndef __DEBUGGER_RISCV_ISA_H__
#define __DEBUGGER_RISCV_ISA_H__
#define __DEBUGGER_RISCV_ISA_H__
 
 
#include <inttypes.h>
#include <inttypes.h>
 
 
Line 79... Line 89...
        uint32_t imm20    : 1;   // [31] 
        uint32_t imm20    : 1;   // [31] 
    } bits;
    } bits;
    uint32_t value;
    uint32_t value;
};
};
 
 
static const uint64_t EXT_SIGN_8  = 0xFFFFFFFFFFFFFF00LL;
/**
 
 * Compressed extension types:
 
 */
 
 
 
// Regsiter
 
union ISA_CR_type {
 
    struct bits_type {
 
        uint16_t opcode : 2;  // [1:0]
 
        uint16_t rs2    : 5;  // [6:2]
 
        uint16_t rdrs1  : 5;  // [11:7]
 
        uint16_t funct4 : 4;  // [15:12]
 
    } bits;
 
    uint16_t value;
 
};
 
 
 
// Immediate
 
union ISA_CI_type {
 
    struct bits_type {
 
        uint16_t opcode : 2;  // [1:0]
 
        uint16_t imm    : 5;  // [6:2]
 
        uint16_t rdrs   : 5;  // [11:7]
 
        uint16_t imm6   : 1;  // [12]
 
        uint16_t funct3 : 3;  // [15:13]
 
    } bits;
 
    struct sp_bits_type {
 
        uint16_t opcode : 2;  // [1:0]
 
        uint16_t imm5    : 1; // [2]
 
        uint16_t imm8_7  : 2; // [4:3]
 
        uint16_t imm6  : 1;   // [5]
 
        uint16_t imm4  : 1;   // [6]
 
        uint16_t sp    : 5;   // [11:7]
 
        uint16_t imm9   : 1;  // [12]
 
        uint16_t funct3 : 3;  // [15:13]
 
    } spbits;
 
    struct ldsp_bits_type {
 
        uint16_t opcode : 2;  // [1:0]
 
        uint16_t off8_6 : 3;  // [4:2]
 
        uint16_t off4_3 : 2;  // [6:5]
 
        uint16_t rd     : 5;  // [11:7]
 
        uint16_t off5   : 1;  // [12]
 
        uint16_t funct3 : 3;  // [15:13]
 
    } ldspbits;
 
    struct lwsp_bits_type {
 
        uint16_t opcode : 2;  // [1:0]
 
        uint16_t off7_6 : 2;  // [3:2]
 
        uint16_t off4_2 : 3;  // [6:4]
 
        uint16_t rd     : 5;  // [11:7]
 
        uint16_t off5   : 1;  // [12]
 
        uint16_t funct3 : 3;  // [15:13]
 
    } lwspbits;
 
    uint16_t value;
 
};
 
 
 
// Stack relative Store
 
union ISA_CSS_type {
 
    struct w_bits_type {
 
        uint16_t opcode : 2;  // [1:0]
 
        uint16_t rs2    : 5;  // [6:2]
 
        uint16_t imm7_6 : 2;  // [8:7]
 
        uint16_t imm5_2 : 4;  // [12:9]
 
        uint16_t funct3 : 3;  // [15:13]
 
    } wbits;
 
    struct d_bits_type {
 
        uint16_t opcode : 2;  // [1:0]
 
        uint16_t rs2    : 5;  // [6:2]
 
        uint16_t imm8_6 : 3;  // [9:7]
 
        uint16_t imm5_3 : 3;  // [12:10]
 
        uint16_t funct3 : 3;  // [15:13]
 
    } dbits;
 
    uint16_t value;
 
};
 
 
 
// Wide immediate
 
union ISA_CIW_type {
 
    struct bits_type {
 
        uint16_t opcode : 2;  // [1:0]
 
        uint16_t rd     : 3;  // [4:2]
 
        uint16_t imm3   : 1;  // [5]
 
        uint16_t imm2   : 1;  // [6]
 
        uint16_t imm9_6 : 4;  // [10:7]
 
        uint16_t imm5_4 : 2;  // [12:11]
 
        uint16_t funct3 : 3;  // [15:13]
 
    } bits;
 
    uint16_t value;
 
};
 
 
 
// Load
 
union ISA_CL_type {
 
    struct bits_type {
 
        uint16_t opcode : 2;  // [1:0]
 
        uint16_t rd     : 3;  // [4:2]
 
        uint16_t imm6   : 1;  // [5]
 
        uint16_t imm27  : 1;  // [6]
 
        uint16_t rs1    : 3;  // [9:7]
 
        uint16_t imm5_3 : 3;  // [12:10]
 
        uint16_t funct3 : 3;  // [15:13]
 
    } bits;
 
    uint16_t value;
 
};
 
 
 
// Store
 
union ISA_CS_type {
 
    struct bits_type {
 
        uint16_t opcode : 2;  // [1:0]
 
        uint16_t rs2    : 3;  // [4:2]
 
        uint16_t imm6   : 1;  // [5]
 
        uint16_t imm27  : 1;  // [6]
 
        uint16_t rs1    : 3;  // [9:7]
 
        uint16_t imm5_3 : 3;  // [12:10]
 
        uint16_t funct3 : 3;  // [15:13]
 
    } bits;
 
    uint16_t value;
 
};
 
 
 
// Branch
 
union ISA_CB_type {
 
    struct bits_type {
 
        uint16_t opcode : 2;  // [1:0]
 
        uint16_t off5   : 1;  // [2]
 
        uint16_t off2_1 : 2;  // [4:3]
 
        uint16_t off7_6 : 2;  // [6:5]
 
        uint16_t rs1    : 3;  // [9:7]
 
        uint16_t off4_3 : 2;  // [11:10]
 
        uint16_t off8   : 1;  // [12]
 
        uint16_t funct3 : 3;  // [15:13]
 
    } bits;
 
    struct sh_bits_type {
 
        uint16_t opcode : 2;  // [1:0]
 
        uint16_t shamt  : 5;  // [6:2]
 
        uint16_t rd     : 3;  // [9:7]
 
        uint16_t funct2 : 2;  // [11:10]
 
        uint16_t shamt5 : 1;  // [12]
 
        uint16_t funct3 : 3;  // [15:13]
 
    } shbits;
 
    uint16_t value;
 
};
 
 
 
// Jump
 
union ISA_CJ_type {
 
    struct bits_type {
 
        uint16_t opcode : 2;  // [1:0]
 
        uint16_t off5   : 1;  // [2]
 
        uint16_t off3_1 : 3;  // [5:3]
 
        uint16_t off7   : 1;  // [6]
 
        uint16_t off6   : 1;  // [7]
 
        uint16_t off10  : 1;  // [8]
 
        uint16_t off9_8 : 2;  // [10:9]
 
        uint16_t off4   : 1;  // [11]
 
        uint16_t off11  : 1;  // [12]
 
        uint16_t funct3 : 3;  // [15:13]
 
    } bits;
 
    uint16_t value;
 
};
 
 
 
 
 
static const uint64_t EXT_SIGN_5  = 0xFFFFFFFFFFFFFFF0LL;
 
static const uint64_t EXT_SIGN_6  = 0xFFFFFFFFFFFFFFE0LL;
 
static const uint64_t EXT_SIGN_8  = 0xFFFFFFFFFFFFFF80LL;
 
static const uint64_t EXT_SIGN_9  = 0xFFFFFFFFFFFFFF00LL;
 
static const uint64_t EXT_SIGN_11 = 0xFFFFFFFFFFFFF800LL;
static const uint64_t EXT_SIGN_12 = 0xFFFFFFFFFFFFF000LL;
static const uint64_t EXT_SIGN_12 = 0xFFFFFFFFFFFFF000LL;
static const uint64_t EXT_SIGN_16 = 0xFFFFFFFFFFFF0000LL;
static const uint64_t EXT_SIGN_16 = 0xFFFFFFFFFFFF0000LL;
static const uint64_t EXT_SIGN_32 = 0xFFFFFFFF00000000LL;
static const uint64_t EXT_SIGN_32 = 0xFFFFFFFF00000000LL;
 
 
static const char *const IREGS_NAMES[] = {
static const char *const IREGS_NAMES[] = {
Line 128... Line 297...
  "fs8", "fs9", "fs10", "fs11", "ft8", "ft9", "ft10", "ft11"
  "fs8", "fs9", "fs10", "fs11", "ft8", "ft9", "ft10", "ft11"
};
};
 
 
enum ERegNames {
enum ERegNames {
    Reg_Zero,
    Reg_Zero,
    Reg_ra,// = 1;       // [1] Return address
    Reg_ra,       // [1] Return address
    Reg_sp,// = 2;       // [2] Stack pointer
    Reg_sp,       // [2] Stack pointer
    Reg_gp,// = 3;       // [3] Global pointer
    Reg_gp,       // [3] Global pointer
    Reg_tp,// = 4;       // [4] Thread pointer
    Reg_tp,       // [4] Thread pointer
    Reg_t0,// = 5;       // [5] Temporaries 0 s3
    Reg_t0,       // [5] Temporaries 0 s3
    Reg_t1,// = 6;       // [6] Temporaries 1 s4
    Reg_t1,       // [6] Temporaries 1 s4
    Reg_t2,// = 7;       // [7] Temporaries 2 s5
    Reg_t2,       // [7] Temporaries 2 s5
    Reg_s0,// = 8;       // [8] s0/fp Saved register/frame pointer
    Reg_s0,       // [8] s0/fp Saved register/frame pointer
    Reg_s1,// = 9;       // [9] Saved register 1
    Reg_s1,       // [9] Saved register 1
    Reg_a0,// = 10;       // [10] Function argumentes 0
    Reg_a0,       // [10] Function argumentes 0
    Reg_a1,// = 11;       // [11] Function argumentes 1
    Reg_a1,       // [11] Function argumentes 1
    Reg_a2,// = 12;       // [12] Function argumentes 2
    Reg_a2,       // [12] Function argumentes 2
    Reg_a3,// = 13;       // [13] Function argumentes 3
    Reg_a3,       // [13] Function argumentes 3
    Reg_a4,// = 14;       // [14] Function argumentes 4
    Reg_a4,       // [14] Function argumentes 4
    Reg_a5,// = 15;       // [15] Function argumentes 5
    Reg_a5,       // [15] Function argumentes 5
    Reg_a6,// = 16;       // [16] Function argumentes 6
    Reg_a6,       // [16] Function argumentes 6
    Reg_a7,// = 17;       // [17] Function argumentes 7
    Reg_a7,       // [17] Function argumentes 7
    Reg_s2,// = 18;       // [18] Saved register 2
    Reg_s2,       // [18] Saved register 2
    Reg_s3,// = 19;       // [19] Saved register 3
    Reg_s3,       // [19] Saved register 3
    Reg_s4,// = 20;       // [20] Saved register 4
    Reg_s4,       // [20] Saved register 4
    Reg_s5,// = 21;       // [21] Saved register 5
    Reg_s5,       // [21] Saved register 5
    Reg_s6,// = 22;       // [22] Saved register 6
    Reg_s6,       // [22] Saved register 6
    Reg_s7,// = 23;       // [23] Saved register 7
    Reg_s7,       // [23] Saved register 7
    Reg_s8,// = 24;       // [24] Saved register 8
    Reg_s8,       // [24] Saved register 8
    Reg_s9,// = 25;       // [25] Saved register 9
    Reg_s9,       // [25] Saved register 9
    Reg_s10,// = 26;      // [26] Saved register 10
    Reg_s10,      // [26] Saved register 10
    Reg_s11,// = 27;      // [27] Saved register 11
    Reg_s11,      // [27] Saved register 11
    Reg_t3,// = 28;       // [28] 
    Reg_t3,       // [28]
    Reg_t4,// = 29;       // [29] 
    Reg_t4,       // [29]
    Reg_t5,// = 30;       // [30] 
    Reg_t5,       // [30]
    Reg_t6,// = 31;      // [31] 
    Reg_t6,       // [31]
    Reg_Total
    Reg_Total
};
};
 
 
 
 
union csr_mstatus_type {
union csr_mstatus_type {
    struct bits_type {
    struct bits_type {
        uint64_t UIE    : 1;    // [0]: User level interrupts ena for current priv. mode
        uint64_t UIE    : 1;    // [0]: User level interrupts ena for current
        uint64_t SIE    : 1;    // [1]: Super-User level interrupts ena for current priv. mode
                                //      priv. mode
        uint64_t HIE    : 1;    // [2]: Hypervisor level interrupts ena for current priv. mode
        uint64_t SIE    : 1;    // [1]: Super-User level interrupts ena for
        uint64_t MIE    : 1;    // [3]: Machine level interrupts ena for current priv. mode
                                //      current priv. mode
        uint64_t UPIE   : 1;    // [4]: User level interrupts ena previous value (before interrupt)
        uint64_t HIE    : 1;    // [2]: Hypervisor level interrupts ena for
        uint64_t SPIE   : 1;    // [5]: Super-User level interrupts ena previous value (before interrupt)
                                //      current priv. mode
        uint64_t HPIE   : 1;    // [6]: Hypervisor level interrupts ena previous value (before interrupt)
        uint64_t MIE    : 1;    // [3]: Machine level interrupts ena for
        uint64_t MPIE   : 1;    // [7]: Machine level interrupts ena previous value (before interrupt)
                                //      current priv. mode
        uint64_t SPP    : 1;    // [8]: One bit wide. Supper-user previously priviledged level
        uint64_t UPIE   : 1;    // [4]: User level interrupts ena previous
        uint64_t HPP    : 2;    // [10:9]: the Hypervisor previous privilege mode
                                //      value (before interrupt)
        uint64_t MPP    : 2;    // [12:11]: the Machine previous privilege mode
        uint64_t SPIE   : 1;    // [5]: Super-User level interrupts ena
 
                                //      previous value (before interrupt)
 
        uint64_t HPIE   : 1;    // [6]: Hypervisor level interrupts ena
 
                                //      previous value (before interrupt)
 
        uint64_t MPIE   : 1;    // [7]: Machine level interrupts ena previous
 
                                //      value (before interrupt)
 
        uint64_t SPP    : 1;    // [8]: One bit wide. Supper-user previously
 
                                //      priviledged level
 
        uint64_t HPP    : 2;    // [10:9]: the Hypervisor previous priv mode
 
        uint64_t MPP    : 2;    // [12:11]: the Machine previous priv mode
        uint64_t FS     : 2;    // [14:13]: RW: FPU context status
        uint64_t FS     : 2;    // [14:13]: RW: FPU context status
        uint64_t XS     : 2;    // [16:15]: RW: extension context status
        uint64_t XS     : 2;    // [16:15]: RW: extension context status
        uint64_t MPRV   : 1;    // [17] Memory privilege bit
        uint64_t MPRV   : 1;    // [17] Memory privilege bit
        uint64_t PUM    : 1;    // [18]
        uint64_t PUM    : 1;    // [18]
        uint64_t MXR    : 1;    // [19]
        uint64_t MXR    : 1;    // [19]
        uint64_t rsrv1  : 4;    // [23:20]
        uint64_t rsrv1  : 4;    // [23:20]
        uint64_t VM     : 5;    // [28:24] Virtualization management field (WARL)
        uint64_t VM     : 5;    // [28:24] Virtualization management field
        uint64_t rsrv2  : 64-30;// [62:29]
        uint64_t rsv2 : 64-30;  // [62:29]
        uint64_t SD     : 1;    // RO: [63] Bit summarizes FS/XS bits
        uint64_t SD     : 1;    // RO: [63] Bit summarizes FS/XS bits
    } bits;
    } bits;
    uint64_t value;
    uint64_t value;
};
};
 
 
Line 285... Line 463...
/** Machine interrupt pending */
/** Machine interrupt pending */
static const uint16_t CSR_mip           = 0x344;
static const uint16_t CSR_mip           = 0x344;
/// @}
/// @}
 
 
/** Exceptions */
/** Exceptions */
enum EExeption {
enum ESignals {
    // Instruction address misaligned
    // Instruction address misaligned
    EXCEPTION_InstrMisalign   = 0,
    EXCEPTION_InstrMisalign,
    // Instruction access fault
    // Instruction access fault
    EXCEPTION_InstrFault      = 1,
    EXCEPTION_InstrFault,
    // Illegal instruction
    // Illegal instruction
    EXCEPTION_InstrIllegal    = 2,
    EXCEPTION_InstrIllegal,
    // Breakpoint
    // Breakpoint
    EXCEPTION_Breakpoint      = 3,
    EXCEPTION_Breakpoint,
    // Load address misaligned
    // Load address misaligned
    EXCEPTION_LoadMisalign    = 4,
    EXCEPTION_LoadMisalign,
    // Load access fault
    // Load access fault
    EXCEPTION_LoadFault       = 5,
    EXCEPTION_LoadFault,
    //Store/AMO address misaligned
    //Store/AMO address misaligned
    EXCEPTION_StoreMisalign   = 6,
    EXCEPTION_StoreMisalign,
    // Store/AMO access fault
    // Store/AMO access fault
    EXCEPTION_StoreFault      = 7,
    EXCEPTION_StoreFault,
    // Environment call from U-mode
    // Environment call from U-mode
    EXCEPTION_CallFromUmode   = 8,
    EXCEPTION_CallFromUmode,
    // Environment call from S-mode
    // Environment call from S-mode
    EXCEPTION_CallFromSmode   = 9,
    EXCEPTION_CallFromSmode,
    // Environment call from H-mode
    // Environment call from H-mode
    EXCEPTION_CallFromHmode   = 10,
    EXCEPTION_CallFromHmode,
    // Environment call from M-mode
    // Environment call from M-mode
    EXCEPTION_CallFromMmode   = 11
    EXCEPTION_CallFromMmode,
};
 
 
 
enum EInterrupt {
 
    // User software interrupt
    // User software interrupt
    INTERRUPT_USoftware      = 0,
    INTERRUPT_USoftware,
    // Superuser software interrupt
    // Superuser software interrupt
    INTERRUPT_SSoftware      = 1,
    INTERRUPT_SSoftware,
    // Hypervisor software itnerrupt
    // Hypervisor software itnerrupt
    INTERRUPT_HSoftware      = 2,
    INTERRUPT_HSoftware,
    // Machine software interrupt
    // Machine software interrupt
    INTERRUPT_MSoftware      = 3,
    INTERRUPT_MSoftware,
    // User timer interrupt
    // User timer interrupt
    INTERRUPT_UTimer         = 4,
    INTERRUPT_UTimer,
    // Superuser timer interrupt
    // Superuser timer interrupt
    INTERRUPT_STimer         = 5,
    INTERRUPT_STimer,
    // Hypervisor timer interrupt
    // Hypervisor timer interrupt
    INTERRUPT_HTimer         = 6,
    INTERRUPT_HTimer,
    // Machine timer interrupt
    // Machine timer interrupt
    INTERRUPT_MTimer         = 7,
    INTERRUPT_MTimer,
    // User external interrupt
    // User external interrupt
    INTERRUPT_UExternal      = 8,
    INTERRUPT_UExternal,
    // Superuser external interrupt
    // Superuser external interrupt
    INTERRUPT_SExternal      = 9,
    INTERRUPT_SExternal,
    // Hypervisor external interrupt
    // Hypervisor external interrupt
    INTERRUPT_HExternal      = 10,
    INTERRUPT_HExternal,
    // Machine external interrupt (from PLIC)
    // Machine external interrupt (from PLIC)
    INTERRUPT_MExternal      = 11,
    INTERRUPT_MExternal,
 
 
 
    SIGNAL_HardReset,
 
    SIGNAL_Total
};
};
 
 
}  // namespace debugger
}  // namespace debugger
 
 
#endif  // __DEBUGGER_RISCV_ISA_H__
#endif  // __DEBUGGER_RISCV_ISA_H__

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.