-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathdecode.v
More file actions
194 lines (181 loc) · 4.92 KB
/
decode.v
File metadata and controls
194 lines (181 loc) · 4.92 KB
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
//Takes input from fetch and parses it and assigns appropriate register values
module decode(instruction, clk, opcode, rs, rt, rd, immediate, shamt, funct, regDest, branch, memRead, memToReg, aluOP, memWrite, aluSrc, regWrite, endProgram, read_data_1, read_data_2,stage);
input [31:0]instruction;
input clk;
input [2:0]stage;
output reg[5:0]opcode;
output reg[4:0]rs;
output reg[4:0]rt;
output reg[4:0]rd;
output reg[31:0]immediate;
output reg [4:0]shamt;
output reg [5:0]funct;
//Control Outputs
output reg regDest;
output reg branch;
output reg memRead;
output reg memToReg;
output reg [1:0]aluOP;
output reg memWrite;
output reg aluSrc;
output reg regWrite;
output reg endProgram;
reg [31:0]register[31:0];
//Reg File
output reg [31:0]read_data_1;
output reg [31:0]read_data_2;
reg [4:0]write_reg;
reg [31:0]write_data;
//flags and temp variables
integer flagR=0; //1 if 'R' Type instructiom 0 if 'I' type instruction
initial begin
rd = 5'b0;
immediate = 31'b0;
shamt = 5'b0;
funct = 6'b0;
regDest = 0;
branch = 0;
memRead = 0;
memToReg = 0;
aluOP = 2'b00;
memWrite = 0;
aluSrc = 0;
regWrite = 0;
endProgram = 0;
end
always @(posedge clk)
begin
if(stage == 1) begin
rd = 5'b0;
immediate = 32'b0;
shamt = 5'b0;
funct = 6'b0;
regDest = 0;
branch = 0;
memRead = 0;
memToReg = 0;
aluOP = 2'b00;
memWrite = 0;
aluSrc = 0;
regWrite = 0;
//Parsing the input
$readmemb("registers.dat", register);
opcode = instruction[31:26];
if(opcode == 6'b000000)
begin
flagR = 1;
rs = instruction[25:21];
rt = instruction[20:16];
rd = instruction[15:11];
shamt = instruction[10:6];
funct = instruction[5:0];
end
else
begin
flagR = 0;
rs = instruction[25:21];
rt = instruction[20:16];
if(instruction[15]==1)
begin
immediate = 32'b11111111111111110000000000000000;
end
immediate = immediate + instruction[15:0];
end
//Passing parsed input into CONTROL
//R-Type instruction
if(opcode == 6'b000000)
begin
regDest = 1;
memToReg = 0;
aluOP = 2'b00;
regWrite = 1;
end
//Store
else if(opcode == 6'b101011)
begin
aluOP = 2'b11;
memWrite = 1;
aluSrc = 1;
regWrite = 0;
end
//Load
else if(opcode == 6'b100011)
begin
memRead = 1;
memToReg = 1;
aluOP = 2'b11;
aluSrc = 1;
regWrite = 1;
end
//BEQ
else if(opcode == 6'b000100)
begin
branch = 1;
aluOP = 2'b01;
aluSrc = 0;
end
//BNE
else if(opcode == 6'b000101)
begin
branch = 1;
aluOP = 2'b01;
aluSrc = 0;
end
//ADDI
else if(opcode == 6'b001000)
begin
regWrite = 1;
aluOP = 2'b11;
aluSrc = 1;
end
//END
else if(opcode == 6'b111111)
begin
endProgram = 1;
end
//Takes in register addresses and outputs the values in the register to pass it to ALU
//Input for reg file read_reg1, read_reg2, write_data and control signal RegDest and outputs are read_data_1 and read_data_2
if(regDest == 1)
begin
write_reg = rd;
end
else if(regDest == 0)
begin
write_reg = rt;
end
read_data_1 = register[rs];
read_data_2 = register[rt];
//$display("%b", instruction);
//$display("%b, %b, %b, %b, %b, %b, %b", opcode, rs, rt, rd, shamt, funct, immediate);
//$display("%b, %b, %b, %b, %b, %b, %b, %b, %b", regDest, branch, memRead, memToReg, aluOP, memWrite, aluSrc, regWrite, endProgram);
//$display("%b, %b", read_data_1, read_data_2);
//stage2=0;
//stage3=1;
end
end
endmodule
// //Testbench to check
// module dc_tb;
// reg [31:0]instruction;
// wire [5:0]opcode;
// wire [4:0]rs;
// wire [4:0]rt;
// wire [4:0]rd;
// wire [31:0]immediate;
// wire [4:0]shamt;
// wire [5:0]funct;
// wire regDest;
// wire branch;
// wire memRead;
// wire memToReg;
// wire [1:0]aluOP;
// wire memWrite;
// wire aluSrc;
// wire regWrite;
// wire [31:0]read_data_1;
// wire [31:0]read_data_2;
// decode uut(instruction, clk, opcode, rs, rt, rd, immediate, shamt, funct, regDest, branch, memRead, memToReg, aluOP, memWrite, aluSrc, regWrite, endProgram, read_data_1, read_data_2);
// initial begin
// instruction = 32'b10001110000100100000000000000000;
// end
// endmodule