vriscv/src/cpu/rv32cpu.h

195 lines
2.2 KiB
C
Raw Normal View History

#ifndef RV32CPU_H
#define RV32CPU_H
#include <stdint.h>
/*
* This is a structure encoding for the registers of
* the rv32 cpu.
* It allows access of register x0 using :
* structname.x0, structname.zero, structname.x[0]
* This way, access can be really flexible
*/
typedef struct RV32_CPU_REGS
{
union
{
struct
{
union
{
uint32_t x0;
uint32_t zero;
};
union
{
uint32_t x1;
uint32_t ra;
};
union
{
uint32_t x2;
uint32_t sp;
};
union
{
uint32_t x3;
uint32_t gp;
};
union
{
uint32_t x4;
uint32_t tp;
};
union
{
uint32_t x5;
uint32_t t0;
};
union
{
uint32_t x6;
uint32_t t1;
};
union
{
uint32_t x7;
uint32_t t2;
};
union
{
uint32_t x8;
uint32_t s0;
};
union
{
uint32_t x9;
uint32_t s1;
};
union
{
uint32_t x10;
uint32_t a0;
};
union
{
uint32_t x11;
uint32_t a1;
};
union
{
uint32_t x12;
uint32_t a2;
};
union
{
uint32_t x13;
uint32_t a3;
};
union
{
uint32_t x14;
uint32_t a4;
};
union
{
uint32_t x15;
uint32_t a5;
};
union
{
uint32_t x16;
uint32_t a6;
};
union
{
uint32_t x17;
uint32_t a7;
};
union
{
uint32_t x18;
uint32_t s2;
};
union
{
uint32_t x19;
uint32_t s3;
};
union
{
uint32_t x20;
uint32_t s4;
};
union
{
uint32_t x21;
uint32_t s5;
};
union
{
uint32_t x22;
uint32_t s6;
};
union
{
uint32_t x23;
uint32_t s7;
};
union
{
uint32_t x24;
uint32_t s8;
};
union
{
uint32_t x25;
uint32_t s9;
};
union
{
uint32_t x26;
uint32_t s10;
};
union
{
uint32_t x27;
uint32_t s11;
};
union
{
uint32_t x28;
uint32_t t3;
};
union
{
uint32_t x29;
uint32_t t4;
};
union
{
uint32_t x30;
uint32_t t5;
};
union
{
uint32_t x31;
uint32_t t6;
};
};
uint32_t x[32];
};
} rv32_cpu_regs_t;
typedef struct RV32_CPU
{
rv32_cpu_regs_t regs;
uint32_t pc;
} rv32_cpu_t;
extern rv32_cpu_t* cpu0;
void cpu_init();
void cpu_loop(rv32_cpu_t* cpu);
#endif