-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathemu.h
More file actions
100 lines (86 loc) · 2.33 KB
/
emu.h
File metadata and controls
100 lines (86 loc) · 2.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
/* <fangzhilinwold@foxmail.com>
* ted's toy rv32 emu
*/
#ifndef EMU_H
#define EMU_H
#include<stdio.h>
#include<stdint.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>
#include<string.h>
// NOTE: There is no space between name and parenthesis.
#define Assert(cond, format, ...) \
do{ \
if(!(cond)) { \
fprintf(stderr, format "\n", ##__VA_ARGS__); \
assert(cond); \
} \
}while(0)
#define MSIZE 600000
#define MCYCLE 6001
typedef struct machine_status_t {
uint32_t PC, REG[16], REG_discard; // REG[0]===0
uint8_t MEM[MSIZE];
bool isRunning;
} machine_status_t;
typedef union{
struct{
uint32_t opcode : 7;
uint32_t rd : 5;
uint32_t func3 : 3;
uint32_t rs1 : 5;
uint32_t rs2 : 5;
uint32_t func7 : 7;
}R;
struct{
uint32_t opcode : 7;
uint32_t rd : 5;
uint32_t func3 : 3;
uint32_t rs1 : 5;
int32_t imm11_0 :12; // sign-extended
}I; // J
struct{
uint32_t opcode : 7;
uint32_t imm4_0 : 5; // zero-extended
uint32_t func3 : 3;
uint32_t rs1 : 5;
uint32_t rs2 : 5;
int32_t imm11_5 : 7; // sign-extended
}S;
struct{
uint32_t opcode : 7;
uint32_t rd : 5;
uint32_t imm31_12 :20; // zero-extended
}U;
struct{
uint32_t opcode : 7;
uint32_t imm4_1_11 : 5; // zero-extended
uint32_t func3 : 3;
uint32_t rs1 : 5;
uint32_t rs2 : 5;
uint32_t imm12_10_5 : 7; // zero-extended
}B;
uint32_t bytes;
} inst_t;
enum inst_list_t{
// RV32I
i_lui, i_auipc,
i_jal,
i_jalr,
i_beq, i_bne, i_blt, i_bge, i_bltu, i_bgeu,
i_lb, i_lh, i_lw, i_lbu, i_lhu,
i_sb, i_sh, i_sw,
i_addi, i_slti, i_sltiu, i_xori, i_ori, i_andi,
i_slli, i_srli, i_srai,
i_add, i_sub, i_sll, i_slt, i_sltu, i_xor, i_srl, i_sra, i_or, i_and,
i_fence, i_fence_i,
i_ecall, i_ebreak,
// RV32 CSR
i_csrrw, i_csrrs, i_csrrc,
i_csrrwi, i_csrrsi, i_csrrci,
INST_NUM
};
typedef void (*inst_exe_t)(machine_status_t*, inst_t);
extern inst_exe_t inst_exe_arr[INST_NUM]; // so all can use, define in runcode.c
#endif // emu.h