summaryrefslogtreecommitdiff
path: root/rtl/core/cycles.sv
blob: 64d77e6f92d332661021df48a5a1212cfd1be1b0 (plain)
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
`include "core/uarch.sv"

module core_cycles
(
	input  logic    clk,
	                decode_execute,
	                decode_writeback,
	                decode_branch,
	input  ptr      decode_branch_offset,
	input  reg_num  decode_rd,
	input  ptr      fetch_insn_pc,

	output logic    stall,
	                branch,
	                writeback,
	output ptr      branch_target,
	                pc,
	                pc_visible,
	output psr_mode reg_mode
);

	enum
	{
		EXECUTE
	} cycle, next_cycle;

	assign stall = next_cycle != EXECUTE;
	assign pc_visible = pc + 2;
	assign next_cycle = EXECUTE; //TODO
	assign reg_mode = `MODE_SVC; //TODO

	always_ff @(posedge clk) begin
		cycle <= next_cycle;
		stall <= next_cycle != EXECUTE;

		if(next_cycle == EXECUTE) begin
			branch <= 0;
			writeback <= 0;
			branch_target <= 30'bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;

			if(decode_execute) begin
				branch <= decode_branch;
				writeback <= decode_writeback;
				branch_target <= pc_visible + decode_branch_offset;
			end

			pc <= fetch_insn_pc;
		end
	end

	initial begin
		cycle = EXECUTE;

		branch = 1;
		writeback = 0;
		branch_target = 30'd0;
		pc = 0;
	end

endmodule