3bc1177933b0fbae7432fbaad3228ec24c4a964e
[riscv-isa-sim.git] / riscv / processor.h
1 #ifndef _RISCV_PROCESSOR_H
2 #define _RISCV_PROCESSOR_H
3
4 #include "decode.h"
5 #include <cstring>
6 #include "trap.h"
7
8 #define MAX_UTS 2048
9
10 class processor_t;
11 class mmu_t;
12 typedef reg_t (*insn_func_t)(processor_t*, insn_t, reg_t);
13 class sim_t;
14
15 // this class represents one processor in a RISC-V machine.
16 class processor_t
17 {
18 public:
19 processor_t(sim_t* _sim, mmu_t* _mmu, uint32_t _id);
20 ~processor_t();
21
22 void step(size_t n, bool noisy); // run for n cycles
23 void deliver_ipi(); // register an interprocessor interrupt
24
25 private:
26 sim_t& sim;
27 mmu_t& mmu; // main memory is always accessed via the mmu
28
29 // user-visible architected state
30 reg_t XPR[NXPR];
31 freg_t FPR[NFPR];
32 reg_t pc;
33 uint32_t fsr;
34
35 // counters
36 reg_t cycle;
37
38 // privileged control registers
39 reg_t epc;
40 reg_t badvaddr;
41 reg_t cause;
42 reg_t evec;
43 reg_t pcr_k0;
44 reg_t pcr_k1;
45 uint32_t id;
46 uint32_t sr; // only modify the status register using set_sr()
47 uint32_t count;
48 uint32_t compare;
49
50 // # of bits in an XPR (32 or 64). (redundant with sr)
51 int xprlen;
52
53 // is this processor running? (deliver_ipi() sets this)
54 bool run;
55
56 // functions
57 void reset(); // resets architected state; halts processor if it was running
58 void take_interrupt(); // take a trap if any interrupts are pending
59 void set_sr(uint32_t val); // set the status register
60 void set_fsr(uint32_t val); // set the floating-point status register
61 void take_trap(trap_t t, bool noisy); // take an exception
62 void disasm(insn_t insn, reg_t pc); // disassemble and print an instruction
63
64 // vector stuff
65 void vcfg();
66 void setvl(int vlapp);
67
68 reg_t vecbanks;
69 uint32_t vecbanks_count;
70
71 bool utmode;
72 uint32_t utidx;
73 int vlmax;
74 int vl;
75 int nxfpr_bank;
76 int nxpr_use;
77 int nfpr_use;
78 processor_t* uts[MAX_UTS];
79
80 // this constructor is used for each of the uts
81 processor_t(sim_t* _sim, mmu_t* _mmu, uint32_t _id, uint32_t _utidx);
82
83 friend class sim_t;
84 friend class mmu_t;
85
86 #include "dispatch.h"
87 };
88
89 #endif