riscv-formal-nmigen/rvfi/cores/minerva/isa.py

216 lines
6.0 KiB
Python

from .csr import *
class Opcode:
LUI = 0b01101
AUIPC = 0b00101
JAL = 0b11011
JALR = 0b11001
BRANCH = 0b11000
LOAD = 0b00000
STORE = 0b01000
OP_IMM_32 = 0b00100
OP_32 = 0b01100
MISC_MEM = 0b00011
SYSTEM = 0b11100
class Funct3:
BEQ = B = ADD = FENCE = PRIV = MUL = 0b000
BNE = H = SLL = FENCEI = CSRRW = MULH = 0b001
_ = W = SLT = _ = CSRRS = MULHSU = 0b010
_ = _ = SLTU = _ = CSRRC = MULHU = 0b011
BLT = BU = XOR = _ = _ = DIV = 0b100
BGE = HU = SR = _ = CSRRWI = DIVU = 0b101
BLTU = _ = OR = _ = CSRRSI = REM = 0b110
BGEU = _ = AND = _ = CSRRCI = REMU = 0b111
class Funct7:
SRL = ADD = 0b0000000
MULDIV = 0b0000001
SRA = SUB = 0b0100000
class Funct12:
ECALL = 0b000000000000
EBREAK = 0b000000000001
MRET = 0b001100000010
WFI = 0b000100000101
class CSRIndex:
MVENDORID = 0xF11
MARCHID = 0xF12
MIMPID = 0xF13
MHARTID = 0xF14
MSTATUS = 0x300
MISA = 0x301
MEDELEG = 0x302
MIDELEG = 0x303
MIE = 0x304
MTVEC = 0x305
MCOUTEREN = 0x306
MSCRATCH = 0x340
MEPC = 0x341
MCAUSE = 0x342
MTVAL = 0x343
MIP = 0x344
# µarch specific
IRQ_MASK = 0x330
IRQ_PENDING = 0x360
# trigger module
TSELECT = 0x7a0
TDATA1 = 0x7a1
TDATA2 = 0x7a2
TDATA3 = 0x7a3
TINFO = 0x7a4
MCONTEXT = 0x7a8
# debug module
DCSR = 0x7b0
DPC = 0x7b1
class Cause:
FETCH_MISALIGNED = 0
FETCH_ACCESS_FAULT = 1
ILLEGAL_INSTRUCTION = 2
BREAKPOINT = 3
LOAD_MISALIGNED = 4
LOAD_ACCESS_FAULT = 5
STORE_MISALIGNED = 6
STORE_ACCESS_FAULT = 7
ECALL_FROM_U = 8
ECALL_FROM_S = 9
ECALL_FROM_M = 11
FETCH_PAGE_FAULT = 12
LOAD_PAGE_FAULT = 13
STORE_PAGE_FAULT = 15
# interrupts
U_SOFTWARE_INTERRUPT = 0
S_SOFTWARE_INTERRUPT = 1
M_SOFTWARE_INTERRUPT = 3
U_TIMER_INTERRUPT = 4
S_TIMER_INTERRUPT = 5
M_TIMER_INTERRUPT = 7
U_EXTERNAL_INTERRUPT = 8
S_EXTERNAL_INTERRUPT = 9
M_EXTERNAL_INTERRUPT = 11
# CSR layouts
flat_layout = [
("value", 32, CSRAccess.RW),
]
misa_layout = [
("extensions", 26, CSRAccess.RW),
("zero", 4, CSRAccess.RO),
("mxl", 2, CSRAccess.RW),
]
mstatus_layout = [
("uie", 1, CSRAccess.RO), # User Interrupt Enable
("sie", 1, CSRAccess.RO), # Supervisor Interrupt Enable
("zero0", 1, CSRAccess.RO),
("mie", 1, CSRAccess.RW), # Machine Interrupt Enable
("upie", 1, CSRAccess.RO), # User Previous Interrupt Enable
("spie", 1, CSRAccess.RO), # Supervisor Previous Interrupt Enable
("zero1", 1, CSRAccess.RO),
("mpie", 1, CSRAccess.RW), # Machine Previous Interrupt Enable
("spp", 1, CSRAccess.RO), # Supervisor Previous Privilege
("zero2", 2, CSRAccess.RO),
("mpp", 2, CSRAccess.RW), # Machine Previous Privilege
("fs", 2, CSRAccess.RO), # FPU Status
("xs", 2, CSRAccess.RO), # user-mode eXtensions Status
("mprv", 1, CSRAccess.RO), # Modify PRiVilege
("sum", 1, CSRAccess.RO), # Supervisor User Memory access
("mxr", 1, CSRAccess.RO), # Make eXecutable Readable
("tvm", 1, CSRAccess.RO), # Trap Virtual Memory
("tw", 1, CSRAccess.RO), # Timeout Wait
("tsr", 1, CSRAccess.RO), # Trap SRET
("zero3", 8, CSRAccess.RO),
("sd", 1, CSRAccess.RO), # State Dirty (set if XS or FS are set to dirty)
]
mtvec_layout = [
("mode", 2, CSRAccess.RW),
("base", 30, CSRAccess.RW),
]
mepc_layout = [
("zero", 2, CSRAccess.RO), # 16-bit instructions are not supported
("base", 30, CSRAccess.RW),
]
mip_layout = [
("usip", 1, CSRAccess.RO),
("ssip", 1, CSRAccess.RO),
("zero0", 1, CSRAccess.RO),
("msip", 1, CSRAccess.RW),
("utip", 1, CSRAccess.RO),
("stip", 1, CSRAccess.RO),
("zero1", 1, CSRAccess.RO),
("mtip", 1, CSRAccess.RW),
("ueip", 1, CSRAccess.RO),
("seip", 1, CSRAccess.RO),
("zero2", 1, CSRAccess.RO),
("meip", 1, CSRAccess.RW),
("zero3", 20, CSRAccess.RO),
]
mie_layout = [
("usie", 1, CSRAccess.RO),
("ssie", 1, CSRAccess.RO),
("zero0", 1, CSRAccess.RO),
("msie", 1, CSRAccess.RW),
("utie", 1, CSRAccess.RO),
("stie", 1, CSRAccess.RO),
("zero1", 1, CSRAccess.RO),
("mtie", 1, CSRAccess.RW),
("ueie", 1, CSRAccess.RO),
("seie", 1, CSRAccess.RO),
("zero2", 1, CSRAccess.RO),
("meie", 1, CSRAccess.RW),
("zero3", 20, CSRAccess.RO),
]
mcause_layout = [
("ecode", 31, CSRAccess.RW),
("interrupt", 1, CSRAccess.RW),
]
dcsr_layout = [
("prv", 2, CSRAccess.RW), # Privilege level before Debug Mode was entered
("step", 1, CSRAccess.RW), # Execute a single instruction and re-enter Debug Mode
("nmip", 1, CSRAccess.RO), # A non-maskable interrupt is pending
("mprven", 1, CSRAccess.RW), # Use mstatus.mprv in Debug Mode
("zero0", 1, CSRAccess.RO),
("cause", 3, CSRAccess.RO), # Explains why Debug Mode was entered
("stoptime", 1, CSRAccess.RW), # Stop timer increment during Debug Mode
("stopcount", 1, CSRAccess.RW), # Stop counter increment during Debug Mode
("stepie", 1, CSRAccess.RW), # Enable interrupts during single stepping
("ebreaku", 1, CSRAccess.RW), # EBREAKs in U-mode enter Debug Mode
("ebreaks", 1, CSRAccess.RW), # EBREAKs in S-mode enter Debug Mode
("zero1", 1, CSRAccess.RO),
("ebreakm", 1, CSRAccess.RW), # EBREAKs in M-mode enter Debug Mode
("zero2", 12, CSRAccess.RO),
("xdebugver", 4, CSRAccess.RO), # External Debug specification version
]
tdata1_layout = [
("data", 27, CSRAccess.RW),
("dmode", 1, CSRAccess.RW),
("type", 4, CSRAccess.RW),
]