@@ -27,7 +27,9 @@ register_access_add_in : in std_logic_vector(reg_adrsize-1 downto 0); -- Connect
27
27
28
28
register_access_out : out std_logic ; -- Connects with register access in of WB stage (passthrough)
29
29
register_access_add_out : out std_logic_vector (reg_adrsize- 1 downto 0 ); -- ex_dest_regadd_out (passthrough)
30
- data_out : out std_logic_vector (31 downto 0 ) := (others => 'Z' )
30
+ forwarded_data_in: in std_logic_vector (31 downto 0 );
31
+ data_out : out std_logic_vector (31 downto 0 ) := (others => 'Z' );
32
+ data_in_selected: in std_logic
31
33
);
32
34
end component ;
33
35
@@ -66,8 +68,11 @@ RDD : out STD_LOGIC_VECTOR (31 downto 0);
66
68
RDAI : in STD_LOGIC_VECTOR (4 downto 0 );
67
69
RDAO : out STD_LOGIC_VECTOR (4 downto 0 );
68
70
FCode: in std_logic_vector (3 downto 0 );
71
+ mem_forward_data: in std_logic_vector (31 downto 0 );
72
+ WB_forward_data: in std_logic_vector (31 downto 0 );
69
73
clock : in STD_LOGIC ;
70
74
n_reset: in std_logic ;
75
+ use_imm: in std_logic ;
71
76
D1Sel1 : in STD_LOGIC ;
72
77
D1Sel0 : in STD_LOGIC ;
73
78
D2Sel0 : in STD_LOGIC ;
@@ -81,6 +86,7 @@ ex_stall: in std_logic;
81
86
byte_in:in std_logic ;
82
87
WB_enable_in: in std_logic ;
83
88
byte_out:out std_logic ;
89
+ alu_result_in:in STD_LOGIC_VECTOR (31 downto 0 );
84
90
WB_enable_out: out std_logic
85
91
86
92
);
@@ -154,6 +160,9 @@ signal ex_stall_in_buffer:std_logic;
154
160
signal ex_stall_in_buffer0:std_logic ;
155
161
signal ex_byte_in_buffer:std_logic ;
156
162
signal ex_WB_enable_in_buffer:std_logic ;
163
+ signal ex_alu_result_in:std_logic_vector (31 downto 0 );
164
+ signal ex_use_IMM_in: std_logic ;
165
+
157
166
158
167
-- EX out signals
159
168
signal ex_ALU_result_out:std_logic_vector (31 downto 0 );-- used by mem
@@ -172,6 +181,8 @@ signal mem_access_load_in_buffer: std_logic;
172
181
signal mem_byte_in_buffer : std_logic ;
173
182
signal mem_WB_enable_in_buffer : std_logic ;
174
183
signal mem_WB_address_in_buffer:std_logic_vector (reg_adrsize- 1 downto 0 );
184
+ signal mem_forwarded_data_in: std_logic_vector (31 downto 0 );
185
+ signal mem_data_in_selected: std_logic ;
175
186
176
187
177
188
-- MEM out signals
@@ -185,15 +196,21 @@ signal wb_WB_enable_in_buffer: std_logic;
185
196
signal wb_WB_address_in_buffer:std_logic_vector (reg_adrsize- 1 downto 0 );
186
197
signal wb_WB_data_in_buffer: std_logic_vector (31 downto 0 );
187
198
188
- signal enable_stall : std_logic ;
199
+ -- Forwarding signals
200
+ signal mem_forward_data: std_logic_vector (31 downto 0 );
201
+ signal WB_forward_data: std_logic_vector (31 downto 0 );
202
+
203
+ -- Hazard Detection
204
+ signal enable_stall: std_logic ;
205
+
189
206
190
207
begin
191
208
192
209
-- instantiate stages
193
- IDstage : decode port map (clk, id_pc_in_buffer, id_pc_out,id_inst_in_buffer, id_wenable_in_buffer,id_reg_add_in_buffer,id_reg_data_in_buffer,id_alu_op_out,id_r1_out,id_r2_out,id_reg1_addr_out,id_reg2_addr_out,id_imm_out, id_dest_regadd_out, id_loaden_out,id_storeen_out, id_useimm_out,id_branch_out, id_byte_out,id_WB_enable_out, id_reset);
194
- EXstage : EX port map (ex_r1_in_buffer,ex_r2_in_buffer,ex_imm_in_buffer,ex_ALU_result_out,ex_dest_regadd_in_buffer,ex_dest_regadd_out,ex_alu_op_in_buffer,clk,ex_reset,ex_ALUData1_selector1_in_buffer,ex_ALUData1_selector0_in_buffer, ex_ALUData2_selector0_in_buffer,ex_ALUData2_selector1_in_buffer,ex_storeen_in_buffer,ex_loaden_in_buffer,ex_storeen_out,ex_loaden_out, ex_mem_data_out,ex_stall_in_buffer,ex_byte_in_buffer,ex_WB_enable_in_buffer,ex_byte_out,ex_WB_enable_out);
210
+ IDstage : decode port map (clk, id_pc_in_buffer, id_pc_out,id_inst_in_buffer, id_wenable_in_buffer,id_reg_add_in_buffer,id_reg_data_in_buffer,id_alu_op_out,id_r1_out,id_r2_out, id_reg1_addr_out,id_reg2_addr_out,id_imm_out, id_dest_regadd_out, id_loaden_out,id_storeen_out, id_useimm_out,id_branch_out, id_byte_out,id_WB_enable_out, id_reset);
211
+ EXstage : EX port map (ex_r1_in_buffer,ex_r2_in_buffer,ex_imm_in_buffer,ex_ALU_result_out,ex_dest_regadd_in_buffer,ex_dest_regadd_out,ex_alu_op_in_buffer,mem_forward_data,WB_forward_data , clk,ex_reset, ex_use_IMM_in, ex_ALUData1_selector1_in_buffer,ex_ALUData1_selector0_in_buffer, ex_ALUData2_selector0_in_buffer,ex_ALUData2_selector1_in_buffer,ex_storeen_in_buffer,ex_loaden_in_buffer,ex_storeen_out,ex_loaden_out, ex_mem_data_out,ex_stall_in_buffer,ex_byte_in_buffer,ex_WB_enable_in_buffer,ex_byte_out,ex_alu_result_in ,ex_WB_enable_out);
195
212
IFstage : fetch port map (clk,if_pc_out,if_pc_in_buffer, if_pc_sel_in_buffer,if_pc_enable_in_buffer,if_inst_out,if_reset);
196
- MEMstage : MEM port map (clk,mem_reset,mem_data_in_buffer,mem_address_in_buffer,mem_access_write_in_buffer ,mem_access_load_in_buffer,mem_byte_in_buffer,mem_WB_enable_in_buffer,mem_WB_address_in_buffer,mem_WB_enable_out,mem_WB_address_out,mem_WB_data_out);
213
+ MEMstage : MEM port map (clk,mem_reset,mem_data_in_buffer,mem_address_in_buffer,mem_access_write_in_buffer ,mem_access_load_in_buffer,mem_byte_in_buffer,mem_WB_enable_in_buffer,mem_WB_address_in_buffer,mem_WB_enable_out,mem_WB_address_out,mem_forwarded_data_in, mem_WB_data_out,mem_data_in_selected );
197
214
198
215
199
216
clk<= clock;
@@ -211,6 +228,19 @@ id_wenable_in_buffer<=wb_WB_enable_in_buffer;
211
228
id_reg_add_in_buffer<= wb_WB_address_in_buffer;
212
229
id_reg_data_in_buffer<= wb_WB_data_in_buffer;
213
230
231
+ -- unclocked forwarding signals
232
+ mem_forward_data<= wb_WB_data_in_buffer;
233
+ WB_forward_data<= wb_WB_data_in_buffer;
234
+ ex_alu_result_in<= mem_data_in_buffer;
235
+ mem_forwarded_data_in<= wb_WB_data_in_buffer;
236
+
237
+
238
+ -- Control Unit
239
+ ex_ALUData1_selector0_in_buffer<= '0' ;
240
+ ex_ALUData1_selector1_in_buffer<= '0' ;
241
+ ex_ALUData2_selector0_in_buffer<= '0' ;
242
+ ex_ALUData2_selector1_in_buffer<= '0' ;
243
+ mem_data_in_selected<= '0' ;
214
244
215
245
proc : process (clock)
216
246
begin
@@ -227,10 +257,7 @@ if falling_edge(clock) then
227
257
ex_imm_in_buffer <= id_imm_out;
228
258
ex_dest_regadd_in_buffer <= id_dest_regadd_out;
229
259
ex_alu_op_in_buffer <= id_alu_op_out;
230
- ex_ALUData1_selector0_in_buffer<= '0' ;
231
- ex_ALUData1_selector1_in_buffer<= '0' ;
232
- ex_ALUData2_selector0_in_buffer<= id_useimm_out;
233
- ex_ALUData2_selector1_in_buffer<= '0' ;
260
+
234
261
ex_loaden_in_buffer <= id_loaden_out;
235
262
ex_storeen_in_buffer <= id_storeen_out;
236
263
@@ -239,6 +266,7 @@ if falling_edge(clock) then
239
266
240
267
ex_byte_in_buffer<= id_byte_out;
241
268
ex_WB_enable_in_buffer<= id_WB_enable_out;
269
+ ex_use_IMM_in<= id_useimm_out;
242
270
243
271
244
272
-- EX/MEM Buffer Latching
@@ -256,14 +284,23 @@ if falling_edge(clock) then
256
284
wb_WB_address_in_buffer<= mem_WB_address_out;
257
285
258
286
-- Hazard Detection
259
- if (ex_loaden_out= '1' AND (id_reg1_addr_out = ex_dest_regadd_out OR id_reg2_addr_out = ex_dest_regadd_out)) then
260
- enable_stall <= '1' ;
287
+ if (ex_dest_regadd_out /= (ex_dest_regadd_out'range => '0' )) then
288
+ if (id_reg1_addr_out = ex_dest_regadd_out OR id_reg2_addr_out = ex_dest_regadd_out) then
289
+ enable_stall <= '1' ;
290
+ else
291
+ enable_stall <= '0' ;
292
+ end if ;
261
293
else
262
294
enable_stall <= '0' ;
263
295
end if ;
264
296
297
+ -- if (ex_loaden_out='1' AND (id_reg1_addr_out = ex_dest_regadd_out OR id_reg2_addr_out = ex_dest_regadd_out)) then
298
+ -- enable_stall <= '1';
299
+ -- else
300
+ -- enable_stall <= '0';
301
+ -- end if;
265
302
266
303
end if ;
267
304
end process ;
268
305
269
- end foo ;
306
+ end foo ;
0 commit comments