summaryrefslogtreecommitdiff
path: root/rtl/core/control/mux.sv
blob: 58d21979d04fa9ae8143c48d63d5aea547edcb14 (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
`include "core/uarch.sv"

module core_control_mux
(
	input  logic       clk,

	input  word        rd_value_a,
	                   rd_value_b,

	input  ctrl_cycle  cycle,
	input  logic       data_snd_is_imm,
	input  logic[5:0]  data_shift_imm,
	input  logic[11:0] data_imm,
	input  ptr         pc,
	input  word        saved_base,
	                   mem_offset,

	output word        alu_a,
	                   alu_b,
	output logic[7:0]  shifter_shift
);

	always_comb begin
		unique case(cycle)
			RD_INDIRECT_SHIFT: shifter_shift = rd_value_b[7:0];
			default:           shifter_shift = {2'b00, data_shift_imm};
		endcase

		unique case(cycle)
			TRANSFER:  alu_a = saved_base;
			EXCEPTION: alu_a = {pc, 2'b00};
			default:   alu_a = rd_value_a;
		endcase

		unique case(cycle)
			RD_INDIRECT_SHIFT, WITH_SHIFT:
				alu_b = saved_base;

			TRANSFER:
				alu_b = mem_offset;

			default:
				if(data_snd_is_imm)
					alu_b = {{20{1'b0}}, data_imm};
				else
					alu_b = rd_value_b;
		endcase
	end

endmodule