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
|