forked from CompArchFA16/Lab3
-
Notifications
You must be signed in to change notification settings - Fork 1
/
control_unit.v
132 lines (129 loc) · 4.17 KB
/
control_unit.v
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
`include "opcodes.v"
`include "alu/alu_commands.v"
module control_unit (
output reg regWrite_ID,
output reg memToReg_ID,
output reg memWrite_ID,
output reg branch_ID,
output reg [2:0] aluControl_ID,
output reg aluSrc_ID,
output reg regDst_ID,
input [5:0] op,
input [5:0] funct
);
always @(op or funct) begin
case (op)
6'b0: begin
case (funct)
`CMD_add: begin
// IF: From memory at address PC, write to IR. Update PC.
// ID: From rs in Regfile, load to register A; from rt in RegFile, load to reg B.
// EX: A+B is written to Result register
// MEM:
// WB: Result is written to rd in RegFile
regWrite_ID <= 1;
memToReg_ID <= 0;
memWrite_ID <= 0;
branch_ID <= 0;
aluControl_ID <= `ALU_CMD_ADD;
aluSrc_ID <= 0;
regDst_ID <= 1;
end
`CMD_sub: begin
regWrite_ID <= 1;
memToReg_ID <= 0;
memWrite_ID <= 0;
branch_ID <= 0;
aluControl_ID <= `ALU_CMD_SUB;
aluSrc_ID <= 0;
regDst_ID <= 1;
end
`CMD_slt: begin
// IF: From memory at address PC, write to IR. Update PC.
// ID: From rs in Regfile, load to register A, from rt in RegFile, write to reg B
// EX: If (A<B) Set result set to 1. If not, set to 0.
// MEM:
// WB: Result is written to rd in RegFile
regWrite_ID <= 1;
memToReg_ID <= 0;
memWrite_ID <= 0;
branch_ID <= 0;
aluControl_ID <= `ALU_CMD_SLT;
aluSrc_ID <= 0;
regDst_ID <= 1;
end
default: begin
regWrite_ID <= 0;
memToReg_ID <= 0;
memWrite_ID <= 0;
branch_ID <= 0;
aluControl_ID <= `ALU_CMD_ADD;
aluSrc_ID <= 0;
regDst_ID <= 0;
end
endcase
end
`CMD_lw: begin
// IF: From memory at address PC, write to IR. Update PC.
// ID: From rs in Regfile, load to register A
// EX: A + sign extended imm is written to Result register
// MEM: Result (address) in Mem is written to DataReg
// WB: Write DataReg to rt address in RegFile.
regWrite_ID <= 1;
memToReg_ID <= 1;
memWrite_ID <= 0;
branch_ID <= 0;
aluControl_ID <= `ALU_CMD_ADD;
aluSrc_ID <= 1;
regDst_ID <= 0;
end
`CMD_sw: begin
// IF: From memory at address PC, write to IR. Update PC.
// ID: From rs in Regfile, load to register A. from rt in RegFile write to reg B
// EX: A + sign extended imm is written to Result register
// MEM: Write B to the Result address in Mem
// WB:
regWrite_ID <= 0;
memToReg_ID <= 0;
memWrite_ID <= 1;
branch_ID <= 0;
aluControl_ID <= `ALU_CMD_ADD;
aluSrc_ID <= 1;
regDst_ID <= 0;
end
`CMD_bne: begin
// IF: From memory at address PC, write to IR. Update PC.
// ID: From rs in Regfile, load to register A, from rt in RegFile, write to reg B
// Also, PC +sign extended imm is written to Res register
// EX: If (A!==B) PC = Res
// MEM:
// WB:
regWrite_ID <= 0;
memToReg_ID <= 0;
memWrite_ID <= 0;
branch_ID <= 1; //And ZeroM wire must be set to 1 (A-B should not output 0 - meaning they are not equal).
aluControl_ID <= `ALU_CMD_SUB;
aluSrc_ID <= 0;
regDst_ID <= 0;
end
`CMD_xori: begin
regWrite_ID <= 1;
memToReg_ID <= 0;
memWrite_ID <= 0;
branch_ID <= 0;
aluControl_ID <= `ALU_CMD_XOR;
aluSrc_ID <= 1;
regDst_ID <= 0;
end
default: begin
regWrite_ID <= 0;
memToReg_ID <= 0;
memWrite_ID <= 0;
branch_ID <= 0;
aluControl_ID <= `ALU_CMD_ADD;
aluSrc_ID <= 0;
regDst_ID <= 0;
end
endcase
end
endmodule