File tree Expand file tree Collapse file tree 7 files changed +88
-74
lines changed Expand file tree Collapse file tree 7 files changed +88
-74
lines changed Original file line number Diff line number Diff line change @@ -3,6 +3,7 @@ module EXE_Stage_reg
3
3
(
4
4
clk,
5
5
rst,
6
+ stall,
6
7
PC_in,
7
8
WB_En_in,
8
9
MEM_R_En_in,
@@ -22,10 +23,11 @@ module EXE_Stage_reg
22
23
Immediate,
23
24
ALU_result
24
25
);
25
-
26
+
26
27
// input and output ports
27
28
input clk;
28
29
input rst;
30
+ input stall;
29
31
input WB_En_in;
30
32
input MEM_R_En_in;
31
33
input MEM_W_En_in;
@@ -44,7 +46,7 @@ module EXE_Stage_reg
44
46
output [31 :0 ] PC;
45
47
output [31 :0 ] Immediate;
46
48
output [31 :0 ] ALU_result;
47
-
49
+
48
50
// registers
49
51
reg WB_En;
50
52
reg MEM_R_En;
@@ -55,7 +57,7 @@ module EXE_Stage_reg
55
57
reg [31 :0 ] PC;
56
58
reg [31 :0 ] Immediate;
57
59
reg [31 :0 ] ALU_result;
58
-
60
+
59
61
// build module
60
62
always @(posedge clk)
61
63
begin
@@ -73,16 +75,18 @@ module EXE_Stage_reg
73
75
end
74
76
else
75
77
begin
76
- dest <= dest_in;
77
- PC <= PC_in;
78
- WB_En <= WB_En_in;
79
- MEM_R_En <= MEM_R_En_in;
80
- MEM_W_En <= MEM_W_En_in;
81
- Is_Imm <= Is_Imm_in;
82
- readdata <= readdata_in;
83
- Immediate <= Immediate_in;
84
- ALU_result <= ALU_result_in;
78
+ if (~ stall) begin
79
+ dest <= dest_in;
80
+ PC <= PC_in;
81
+ WB_En <= WB_En_in;
82
+ MEM_R_En <= MEM_R_En_in;
83
+ MEM_W_En <= MEM_W_En_in;
84
+ Is_Imm <= Is_Imm_in;
85
+ readdata <= readdata_in;
86
+ Immediate <= Immediate_in;
87
+ ALU_result <= ALU_result_in;
88
+ end
85
89
end
86
90
end
87
-
91
+
88
92
endmodule
Original file line number Diff line number Diff line change @@ -21,12 +21,10 @@ module ForwardUnit
21
21
shouldForward1,
22
22
shouldForward2,
23
23
);
24
-
24
+
25
25
// define input and output ports
26
26
input WB_En1;
27
27
input WB_En2;
28
- // input Is_Imm1;
29
- // input Is_Imm2;
30
28
input Is_Imm;
31
29
input mem_W_En;
32
30
input [1 :0 ] BR_Type;
@@ -54,7 +52,7 @@ module ForwardUnit
54
52
reg [31 :0 ] srcOut2;
55
53
reg [31 :0 ] memOut;
56
54
57
- // define branch types
55
+ // define branch types
58
56
parameter NO_BRANCH_Code = 2'b0 ;
59
57
parameter BEZ_Code = 2'b01 ;
60
58
parameter BNE_Code = 2'b10 ;
@@ -90,7 +88,7 @@ module ForwardUnit
90
88
begin
91
89
srcOut2 <= aluResult2;
92
90
end
93
-
91
+
94
92
if (shouldForwardMemFromExe)
95
93
memOut <= aluResult1;
96
94
else
@@ -100,4 +98,3 @@ module ForwardUnit
100
98
memOut <= readdata2;
101
99
end
102
100
endmodule
103
-
Original file line number Diff line number Diff line change @@ -36,7 +36,7 @@ module ID_Stage_reg
36
36
EXE_Cmd,
37
37
PC
38
38
);
39
-
39
+
40
40
// input and output ports
41
41
input clk;
42
42
input rst;
@@ -72,7 +72,7 @@ module ID_Stage_reg
72
72
output [31 :0 ] data1;
73
73
output [31 :0 ] data2;
74
74
output [31 :0 ] PC;
75
-
75
+
76
76
// registers
77
77
reg [1 :0 ] BR_Type;
78
78
reg [3 :0 ] EXE_Cmd;
@@ -89,13 +89,13 @@ module ID_Stage_reg
89
89
reg MEM_R_En;
90
90
reg MEM_W_En;
91
91
reg [31 :0 ] PC;
92
-
92
+
93
93
// build module
94
-
94
+
95
95
// pass instruction decode outputs
96
96
always @(posedge clk)
97
97
begin
98
- if (rst | branch_taken | stall )
98
+ if (rst | branch_taken)
99
99
begin
100
100
dest <= 5'b0 ;
101
101
readdata1 <= 32'b0 ;
@@ -116,23 +116,26 @@ module ID_Stage_reg
116
116
end
117
117
else
118
118
begin
119
- dest <= dest_in;
120
- readdata1 <= readdata1_in;
121
- readdata2 <= readdata2_in;
122
- Is_Imm <= Is_Imm_in;
123
- Immediate <= Immediate_in;
124
- data1 <= data1_in;
125
- data2 <= data2_in;
126
- WB_En <= WB_En_in;
127
- MEM_R_En <= MEM_R_En_in;
128
- MEM_W_En <= MEM_W_En_in;
129
- BR_Type <= BR_Type_in;
130
- EXE_Cmd <= EXE_Cmd_in;
131
- PC <= PC_in;
132
- src1 <= src1_in;
133
- src2 <= src2_in;
134
- dest <= dest_in;
119
+ if (~ stall)
120
+ begin
121
+ dest <= dest_in;
122
+ readdata1 <= readdata1_in;
123
+ readdata2 <= readdata2_in;
124
+ Is_Imm <= Is_Imm_in;
125
+ Immediate <= Immediate_in;
126
+ data1 <= data1_in;
127
+ data2 <= data2_in;
128
+ WB_En <= WB_En_in;
129
+ MEM_R_En <= MEM_R_En_in;
130
+ MEM_W_En <= MEM_W_En_in;
131
+ BR_Type <= BR_Type_in;
132
+ EXE_Cmd <= EXE_Cmd_in;
133
+ PC <= PC_in;
134
+ src1 <= src1_in;
135
+ src2 <= src2_in;
136
+ dest <= dest_in;
137
+ end
135
138
end
136
139
end
137
-
140
+
138
141
endmodule
Original file line number Diff line number Diff line change @@ -3,6 +3,7 @@ module MEM_Stage_reg
3
3
(
4
4
clk,
5
5
rst,
6
+ stall,
6
7
PC_in,
7
8
PC,
8
9
WB_En_in,
@@ -18,10 +19,11 @@ module MEM_Stage_reg
18
19
ALU_result,
19
20
Mem_Data
20
21
);
21
-
22
+
22
23
// input and output ports
23
24
input clk;
24
25
input rst;
26
+ input stall;
25
27
input WB_En_in;
26
28
input MEM_R_En_in;
27
29
input Is_Imm_in;
@@ -36,7 +38,7 @@ module MEM_Stage_reg
36
38
output [31 :0 ] PC;
37
39
output [31 :0 ] ALU_result;
38
40
output [31 :0 ] Mem_Data;
39
-
41
+
40
42
// registers
41
43
reg WB_En;
42
44
reg MEM_R_En;
@@ -45,7 +47,7 @@ module MEM_Stage_reg
45
47
reg [31 :0 ] PC;
46
48
reg [31 :0 ] ALU_result;
47
49
reg [31 :0 ] Mem_Data;
48
-
50
+
49
51
// build module
50
52
always @(posedge clk)
51
53
begin
@@ -61,14 +63,16 @@ module MEM_Stage_reg
61
63
end
62
64
else
63
65
begin
64
- WB_En <= WB_En_in;
65
- MEM_R_En <= MEM_R_En_in;
66
- Is_Imm <= Is_Imm_in;
67
- dest <= dest_in;
68
- PC <= PC_in;
69
- ALU_result <= ALU_result_in;
70
- Mem_Data <= Mem_Data_in;
66
+ if (~ stall) begin
67
+ WB_En <= WB_En_in;
68
+ MEM_R_En <= MEM_R_En_in;
69
+ Is_Imm <= Is_Imm_in;
70
+ dest <= dest_in;
71
+ PC <= PC_in;
72
+ ALU_result <= ALU_result_in;
73
+ Mem_Data <= Mem_Data_in;
74
+ end
71
75
end
72
76
end
73
-
77
+
74
78
endmodule
Original file line number Diff line number Diff line change @@ -13,13 +13,13 @@ module MIPS
13
13
);
14
14
15
15
// input and outputs
16
- input clk;
17
- input rst;
18
- input Sel;
19
- output SRAMWEn;
20
- output SRAMOE;
16
+ input clk;
17
+ input rst;
18
+ input Sel;
19
+ output SRAMWEn;
20
+ output SRAMOE;
21
21
output [17 :0 ] SRAMaddress;
22
- output [5 :0 ] Instruction;
22
+ output [5 :0 ] Instruction;
23
23
inout [15 :0 ] SRAMdata;
24
24
25
25
// wires
@@ -237,6 +237,7 @@ module MIPS
237
237
(
238
238
.clk(clk),
239
239
.rst(rst),
240
+ .stall(Stall),
240
241
.PC_in(PC2),
241
242
.PC(PC3),
242
243
.WB_En_in(WB_En22),
@@ -278,6 +279,7 @@ module MIPS
278
279
(
279
280
.clk(clk),
280
281
.rst(rst),
282
+ .stall(Stall),
281
283
.PC_in(PC3),
282
284
.PC(PC4),
283
285
.WB_En_in(WB_En32),
Original file line number Diff line number Diff line change @@ -34,7 +34,7 @@ module SRAM_CTR
34
34
localparam READ_2 = 2 ;
35
35
localparam WRITE_1 = 3 ;
36
36
localparam WAIT = 4 ;
37
-
37
+
38
38
// wire and registers
39
39
reg SRAMWEn;
40
40
reg SRAMOE;
@@ -47,11 +47,11 @@ module SRAM_CTR
47
47
reg [2 :0 ] nextState;
48
48
reg [15 :0 ] readData_L;
49
49
reg [15 :0 ] readData_H;
50
-
50
+
51
51
// build module
52
52
assign SRAM_NOT_READY = | counter | InnerStall;
53
53
assign readData = { readData_H, readData_L };
54
-
54
+
55
55
always @(posedge clk) begin
56
56
if (rst)
57
57
begin
@@ -85,7 +85,7 @@ module SRAM_CTR
85
85
end
86
86
end
87
87
end
88
-
88
+
89
89
// controller
90
90
always @( posedge clk )
91
91
begin
@@ -94,7 +94,7 @@ module SRAM_CTR
94
94
else
95
95
presentState <= nextState;
96
96
end
97
-
97
+
98
98
always @(* ) begin
99
99
case (presentState)
100
100
INIT:
@@ -135,11 +135,10 @@ module SRAM_CTR
135
135
end
136
136
endcase
137
137
end
138
-
138
+
139
139
reg [15 :0 ] data_to_sram;
140
140
always @( * )
141
141
begin
142
- data_to_sram = 0 ;
143
142
case ( presentState )
144
143
INIT:
145
144
begin
@@ -150,6 +149,7 @@ module SRAM_CTR
150
149
InnerStall = 1'b1 ;
151
150
SRAMWEn = 1'b1 ;
152
151
SRAMOE = 1'b0 ;
152
+ data_to_sram = 0 ;
153
153
end
154
154
else
155
155
begin
@@ -165,6 +165,7 @@ module SRAM_CTR
165
165
InnerStall = 1'b0 ;
166
166
SRAMWEn = 1'b1 ;
167
167
SRAMOE = 1'b1 ;
168
+ data_to_sram = 0 ;
168
169
end
169
170
end
170
171
end
@@ -174,13 +175,15 @@ module SRAM_CTR
174
175
InnerStall = 1'b0 ;
175
176
SRAMWEn = 1'b1 ;
176
177
SRAMOE = 1'b0 ;
178
+ data_to_sram = 0 ;
177
179
end
178
180
READ_2:
179
181
begin
180
182
SRAMaddress = { 1'b0 , address, 1'b1 };
181
183
InnerStall = 1'b0 ;
182
184
SRAMWEn = 1'b1 ;
183
185
SRAMOE = 1'b1 ;
186
+ data_to_sram = 0 ;
184
187
end
185
188
WRITE_1:
186
189
begin
@@ -196,11 +199,11 @@ module SRAM_CTR
196
199
InnerStall = 1'b0 ;
197
200
SRAMWEn = 1'b1 ;
198
201
SRAMOE = 1'b1 ;
202
+ data_to_sram = 0 ;
199
203
end
200
204
endcase
201
205
end
202
-
203
- assign SRAMdata = ((presentState == WRITE_1) || ((presentState == INIT) && (MEM_W_EN == 1 ))) ? data_to_sram : {16 {1'bz }} ;
204
-
205
- endmodule
206
206
207
+ assign SRAMdata = (~ (| (presentState ^ WRITE_1)) || (~ (| (presentState ^ INIT)) && (MEM_W_EN == 1 ))) ? data_to_sram : {16 {1'bz }} ;
208
+
209
+ endmodule
You can’t perform that action at this time.
0 commit comments