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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
|
`ifndef CORE_UARCH_SV
`define CORE_UARCH_SV
// Decodifica como andeq r0, r0, r0
`define NOP 32'd0
typedef logic[3:0] reg_num;
typedef logic[15:0] reg_list;
typedef logic[31:0] word;
typedef logic[29:0] ptr;
`define R14 4'b1110
`define R15 4'b1111
/* Se necesitan 30 GPRs. De A2.3:
*
* The ARM processor has a total of 37 registers:
*
* Thirty-one general-purpose registers, including a program counter. These
* registers are 32 bits wide and are described in General-purpose registers on
* page A2-6.
*/
typedef logic[4:0] reg_index;
typedef logic[3:0] alu_op;
// Coincide con campo respectivo de instrucciones de procesamiento de datos
`define ALU_AND 4'b0000
`define ALU_EOR 4'b0001
`define ALU_SUB 4'b0010
`define ALU_RSB 4'b0011
`define ALU_ADD 4'b0100
`define ALU_ADC 4'b0101
`define ALU_SBC 4'b0110
`define ALU_RSC 4'b0111
`define ALU_TST 4'b1000
`define ALU_TEQ 4'b1001
`define ALU_CMP 4'b1010
`define ALU_CMN 4'b1011
`define ALU_ORR 4'b1100
`define ALU_MOV 4'b1101
`define ALU_BIC 4'b1110
`define ALU_MVN 4'b1111
typedef struct packed
{
logic n, z, c, v;
} psr_flags;
typedef logic[4:0] psr_mode;
`define MODE_USR 5'b10000
`define MODE_FIQ 5'b10001
`define MODE_IRQ 5'b10010
`define MODE_SVC 5'b10011
`define MODE_ABT 5'b10111
`define MODE_UND 5'b11011
`define MODE_SYS 5'b11111
typedef struct packed
{
logic execute,
undefined,
conditional,
writeback,
update_flags;
} datapath_decode;
typedef struct packed
{
alu_op op;
reg_num rn,
rd;
logic uses_rn;
} data_decode;
typedef struct packed
{
logic branch;
ptr offset;
} branch_decode;
typedef struct packed
{
reg_num r,
r_shift;
logic shift_by_reg,
is_imm,
shr,
ror,
put_carry,
sign_extend;
logic[11:0] imm;
logic[5:0] shift_imm;
} snd_decode;
typedef enum
{
LDST_WORD,
LDST_BYTE,
LDST_HALF
} ldst_size;
typedef struct packed
{
reg_num rn,
rd;
logic enable,
load,
increment,
writeback,
sign_extend,
pre_indexed,
unprivileged,
user_regs;
ldst_size size;
/* P. 482: "If no bits are set, the result is UNPREDICTABLE."
* Esto permite diferenciar entre ldst múltiple y simple.
*/
reg_list regs;
} ldst_decode;
typedef enum
{
ISSUE,
RD_INDIRECT_SHIFT,
WITH_SHIFT,
TRANSFER,
BASE_WRITEBACK,
EXCEPTION
} ctrl_cycle;
typedef struct packed
{
logic shr,
ror,
put_carry,
sign_extend;
} shifter_control;
`endif
|