Skip to content

Commit b15c922

Browse files
author
David Lavoie-Boutin
committed
Merge branch 'master' of github.com:dlavoieb/ecse-425
Conflicts: PROC/TEST2.tcl
2 parents 2175442 + 57672bf commit b15c922

File tree

6 files changed

+102
-46
lines changed

6 files changed

+102
-46
lines changed

Assembler/all_instructions.asm

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
jump: add $9 $10 $11
22
addi $2, $4, 138
3+
addi $2, $2, 138
4+
addi $2, $2, 138
5+
or $14, $15, $16
6+
and $1, $2, $3
7+
nor $4, $7, $9
38
lw $25, 17($7)
4-
beq $3, $18, jump
5-
sw $8, 38($4)
6-
lui $30, 0x1382
9+
sw $8, 38($25)
710
and $1, $2, $3
8-
jr $8
911
nor $4, $7, $9
1012
or $14, $15, $16
1113
sll $8, $4, $1
@@ -19,6 +21,3 @@ mult $9, $17
1921
xor $7, $16, $9
2022
sra $19, $6, $23
2123
addi $6, $4, 0x75
22-
andi $1, $2, banana
23-
bne $8, $3, banana
24-
lb $19, ($4)

PROC/Init.dat

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,4 @@
1919
00010100000010101111111111110011
2020
00100000000000000000000000000000
2121
00010001011010110000000000000000
22+

PROC/PROCv2.vhd

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,8 @@ signal wb_WB_data_in_buffer: std_logic_vector (31 downto 0);
200200
signal mem_forward_data: std_logic_vector (31 downto 0);
201201
signal WB_forward_data: std_logic_vector (31 downto 0);
202202

203+
--Hazard Detection
204+
signal enable_stall: std_logic;
203205

204206
begin
205207

@@ -212,7 +214,7 @@ MEMstage: MEM port map(clk,mem_reset,mem_data_in_buffer,mem_address_in_buffer,me
212214

213215
clk<=clock;
214216
id_reset<=reset;
215-
ex_reset<=reset;
217+
ex_reset<=reset AND NOT(enable_stall);
216218
if_reset<=reset;
217219
mem_reset<=reset;
218220

@@ -280,6 +282,17 @@ if falling_edge(clock) then
280282
wb_WB_enable_in_buffer<=mem_WB_enable_out;
281283
wb_WB_address_in_buffer<=mem_WB_address_out;
282284

285+
--Hazard Detection
286+
if (ex_dest_regadd_out /= (ex_dest_regadd_out'range => '0')) then
287+
if (id_reg1_addr_out = ex_dest_regadd_out OR id_reg2_addr_out = ex_dest_regadd_out) then
288+
enable_stall <= '1';
289+
else
290+
enable_stall <= '0';
291+
end if;
292+
else
293+
enable_stall <= '0';
294+
end if;
295+
283296
end if;
284297
end process;
285298

PROC/PROCv3.vhd

Lines changed: 49 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@ register_access_add_in : in std_logic_vector(reg_adrsize-1 downto 0); -- Connect
2727

2828
register_access_out : out std_logic; -- Connects with register access in of WB stage (passthrough)
2929
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
3133
);
3234
end component;
3335

@@ -66,8 +68,11 @@ RDD : out STD_LOGIC_VECTOR (31 downto 0);
6668
RDAI : in STD_LOGIC_VECTOR (4 downto 0);
6769
RDAO : out STD_LOGIC_VECTOR (4 downto 0);
6870
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);
6973
clock : in STD_LOGIC;
7074
n_reset: in std_logic;
75+
use_imm: in std_logic;
7176
D1Sel1 : in STD_LOGIC;
7277
D1Sel0 : in STD_LOGIC;
7378
D2Sel0 : in STD_LOGIC;
@@ -81,6 +86,7 @@ ex_stall: in std_logic;
8186
byte_in:in std_logic;
8287
WB_enable_in: in std_logic;
8388
byte_out:out std_logic;
89+
alu_result_in:in STD_LOGIC_VECTOR (31 downto 0);
8490
WB_enable_out: out std_logic
8591

8692
);
@@ -154,6 +160,9 @@ signal ex_stall_in_buffer:std_logic;
154160
signal ex_stall_in_buffer0:std_logic;
155161
signal ex_byte_in_buffer:std_logic;
156162
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+
157166

158167
--EX out signals
159168
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;
172181
signal mem_byte_in_buffer : std_logic;
173182
signal mem_WB_enable_in_buffer : std_logic;
174183
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;
175186

176187

177188
--MEM out signals
@@ -185,15 +196,21 @@ signal wb_WB_enable_in_buffer: std_logic;
185196
signal wb_WB_address_in_buffer:std_logic_vector (reg_adrsize-1 downto 0);
186197
signal wb_WB_data_in_buffer: std_logic_vector (31 downto 0);
187198

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+
189206

190207
begin
191208

192209
--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);
195212
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);
197214

198215

199216
clk<=clock;
@@ -211,6 +228,19 @@ id_wenable_in_buffer<=wb_WB_enable_in_buffer;
211228
id_reg_add_in_buffer<=wb_WB_address_in_buffer;
212229
id_reg_data_in_buffer<=wb_WB_data_in_buffer;
213230

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';
214244

215245
proc: process (clock)
216246
begin
@@ -227,10 +257,7 @@ if falling_edge(clock) then
227257
ex_imm_in_buffer <=id_imm_out;
228258
ex_dest_regadd_in_buffer <= id_dest_regadd_out;
229259
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+
234261
ex_loaden_in_buffer <=id_loaden_out;
235262
ex_storeen_in_buffer <=id_storeen_out;
236263

@@ -239,6 +266,7 @@ if falling_edge(clock) then
239266

240267
ex_byte_in_buffer<=id_byte_out;
241268
ex_WB_enable_in_buffer<=id_WB_enable_out;
269+
ex_use_IMM_in<=id_useimm_out;
242270

243271

244272
--EX/MEM Buffer Latching
@@ -256,14 +284,23 @@ if falling_edge(clock) then
256284
wb_WB_address_in_buffer<=mem_WB_address_out;
257285

258286
--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;
261293
else
262294
enable_stall <= '0';
263295
end if;
264296

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;
265302

266303
end if;
267304
end process;
268305

269-
end foo;
306+
end foo;

PROC/TEST2.tcl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ sim:/PROCv2/id_reset\
77
sim:/PROCv2/if_reset\
88
sim:/PROCv2/mem_reset
99

10+
add wave -group "Hazard Detection" sim:/PROCv2/enable_stall
11+
1012
add wave -group "IF in buffers" -radix unsigned sim:/PROCv2/if_pc_in_buffer\
1113
-radix binary sim:/PROCv2/if_pc_sel_in_buffer\
1214
-radix binary sim:/PROCv2/if_pc_enable_in_buffer
@@ -76,7 +78,7 @@ add wave -group "WB in buffers" -radix binary sim:/PROCv2/wb_WB_enable_in_buffer
7678
;
7779

7880
proc runsim {} {
79-
vsim PROCv2
81+
vsim PROCv2 -t ps
8082

8183
AddWaves
8284
;#run 1 ns

PROC/TEST3.tcl

Lines changed: 29 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
proc AddWaves {} {
22
;#Add waves we're interested in to the Wave window
33

4-
add wave -group "Hazard Detection" sim:/PROCv3/enable_stall\
4+
add wave -group "Hazard Detection" sim:/PROCv3/enable_stall
55

66
add wave -group "Control Signals" sim:/PROCv3/clk\
77
sim:/PROCv3/ex_reset\
@@ -81,6 +81,32 @@ sim:/PROCv3/wb_WB_data_in_buffer
8181
}
8282
;
8383

84+
proc runsim {} {
85+
vsim PROCv3 -t ps
86+
87+
AddWaves
88+
;#run 1 ns
89+
force -deposit /PROCv3/if_pc_enable_in_buffer 0 0 ns
90+
force -deposit /PROCv3/MEMstage/mem_access_write 0 0
91+
force -deposit /PROCv3/MEMstage/data_in "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ" 0
92+
force -deposit /PROCv3/MEMstage/data_out "00000000000000000000000000000000" 0
93+
force -deposit /PROCv3/MEMstage/address_in "00000000000000000000000000000000" 0
94+
force -deposit /PROCv3/MEMstage/byte 0 0
95+
96+
GenerateCPUClock
97+
98+
force -deposit /PROCv3/reset 0 0
99+
100+
101+
loadInstructions
102+
run 1 ns
103+
force -deposit /PROCv3/if_pc_in_buffer "00000000000000000000000000110000" 0
104+
force -deposit /PROCv3/if_pc_enable_in_buffer 1 0 ns
105+
force -deposit /PROCv3/reset 1 1
106+
run 10 ns
107+
108+
}
109+
84110
proc loadInstructions {} {
85111
force -deposit PROCv3/IFstage/instruction_memory/initialize 0 0 ns, 1 1 ns, 0 2 ns
86112
;#run 1 ns ;#Force signals to update right away
@@ -100,11 +126,11 @@ vcom memory_arbiter_lib.vhd
100126
vcom Main_Memory.vhd
101127
vcom Data_Mem.vhd
102128
vcom MEM.vhd
129+
vcom PC.vhd
103130
vcom fetch.vhd
104131
vcom shifter.vhd
105132
vcom comparator.vhd
106133
vcom Register.vhd
107-
vcom PC.vhd
108134
vcom decode.vhd
109135
vcom ALU.vhd
110136
vcom mux41.vhd
@@ -113,31 +139,9 @@ vcom PROCv3.vhd
113139

114140
; # Start Simulation
115141

116-
vsim PROCv3 -t ps
117-
118-
AddWaves
119-
;#run 1 ns
120-
force -deposit /PROCv3/if_pc_enable_in_buffer 0 0 ns
121-
force -deposit /PROCv3/MEMstage/mem_access_write 0 0
122-
force -deposit /PROCv3/MEMstage/data_in "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ" 0
123-
force -deposit /PROCv3/MEMstage/data_out "00000000000000000000000000000000" 0
124-
force -deposit /PROCv3/MEMstage/address_in "00000000000000000000000000000000" 0
125-
force -deposit /PROCv3/MEMstage/byte 0 0
126142

127-
GenerateCPUClock
143+
}
128144

129-
force -deposit /PROCv3/reset 0 0
130-
131145

132-
loadInstructions
133-
run 1 ns
134-
force -deposit /PROCv3/if_pc_in_buffer "00000000000000000000000000110000" 0
135-
force -deposit /PROCv3/if_pc_enable_in_buffer 1 0 ns
136-
force -deposit /PROCv3/reset 1 1
137-
run 10 ns
138-
139-
}
140146

141-
Init
142147

143-
run 5 ns

0 commit comments

Comments
 (0)