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
|
`include "core/psr.sv"
`include "core/uarch.sv"
module arm810
(
input logic clk,
output ptr bus_addr,
output logic bus_start,
bus_write,
input logic bus_ready,
input word bus_data_rd,
output word bus_data_wr
);
logic stall, prefetch_flush;
word insn;
ptr fetch_insn_pc, pc, pc_visible;
psr_flags flags;
assign flags = 4'b1010; //TODO
core_fetch #(.PREFETCH_ORDER(2)) fetch
(
.flush(explicit_branch | wr_pc),
.target(wr_pc ? wr_value[29:0] : branch_target),
.addr(bus_addr),
.fetched(bus_ready),
.fetch_data(bus_data_rd),
.fetch(bus_start),
.insn_pc(fetch_insn_pc),
.*
);
logic decode_execute, decode_undefined, decode_writeback, decode_branch;
ptr decode_branch_offset;
reg_num decode_rd;
core_decode decode
(
.execute(decode_execute),
.undefined(decode_undefined),
.writeback(decode_writeback),
.rd(decode_rd),
.branch(decode_branch),
.branch_offset(decode_branch_offset),
.*
);
reg_num rd;
logic explicit_branch, writeback;
ptr branch_target;
psr_mode reg_mode;
core_cycles cycles
(
.branch(explicit_branch),
.*
);
logic wr_pc;
word wr_value;
core_regs regs
(
.rd_r_a(0), //TODO
.rd_r_b(0), //TODO
.rd_value_a(), //TODO
.rd_value_b(), //TODO
.rd_mode(reg_mode),
.wr_mode(reg_mode),
.wr_r(rd),
.wr_enable(writeback),
.branch(wr_pc),
.*
);
endmodule
|