-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathhazard.v
More file actions
202 lines (158 loc) · 3.31 KB
/
hazard.v
File metadata and controls
202 lines (158 loc) · 3.31 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
195
196
197
198
199
200
201
202
`ifndef __HAZARD__
`define __HAZARD__
module hazard(
is_b,is_j,is_load,is_m,is_d,dst_en,
fin,
pre_taken,real_taken,
r_dst,r_src1,r_src2,
src1_sel,src2_sel,
f_cmiss,m_cmiss,
f_arrival,m_arrival,
fd_st,de_st,em_st,mw_st,
flush_o,
rs1_depended_h_o,ptnt_e_i,
rstn,clk);
input is_b,is_j,is_load,dst_en,is_m,is_d;
input fin;
input pre_taken,real_taken;
input [4:0] r_dst,r_src1,r_src2;
input f_cmiss,m_cmiss;
input f_arrival,m_arrival;
input rstn,clk;
output[1:0] src1_sel,src2_sel;
output fd_st,de_st,em_st,mw_st;
output flush_o;
output rs1_depended_h_o;
output ptnt_e_i;
reg[4:0] dst_1,dst_2;
reg ld_dst1,ld_dst2;
wire Icmiss_st,Dcmiss_st,Linst_st,Ldhaz_st;
reg Icmiss_st_keep,Dcmiss_st_keep,Linst_st_keep;
reg jd1,jd2,jd_b1,jd_b2,jd_b3;//when jump instruction is decode, the state machine of flush control.
reg bpt,bptrt,bptnt,bptnt1;
reg bnt,bnt1,bnt2;
wire flush;
always@(posedge clk)//bypass
begin
if(~rstn)
begin
dst_1<=5'b0;
dst_2<=5'b0;
ld_dst1<=1'b0;
ld_dst2<=1'b0;
end
else
begin
dst_1<=r_dst&{5{dst_en&~(flush)}};
dst_2<=dst_1;
ld_dst1<=is_load;
ld_dst2<=ld_dst1;
end
end
assign src1_sel[0]=(~(r_src1==0))&(dst_1==r_src1);
assign src1_sel[1]=(~(r_src1==0))&(~(dst_1==dst_2))&(dst_2==r_src1);
assign src2_sel[0]=(~(r_src2==0))&(dst_1==r_src2);
assign src2_sel[1]=(~(r_src2==0))&(~(dst_1==dst_2))&(dst_2==r_src2);
//stall
assign Ldhaz_st= ld_dst1&((dst_1==r_src1)|(dst_1==r_src2));
assign Icmiss_st=~f_arrival&(f_cmiss|Icmiss_st_keep);
assign Dcmiss_st=~m_arrival&(m_cmiss|Dcmiss_st_keep);
assign Linst_st=~(fin|flush)&(is_d|is_m|Linst_st_keep);
always@(posedge clk)
begin
if(~rstn)
begin
Icmiss_st_keep<=1'b0;
Dcmiss_st_keep<=1'b0;
Linst_st_keep<=1'b0;
end
else
begin
if(fin)
begin
Linst_st_keep<=1'b0;
end
else if((~flush)&(is_d|is_m))
begin
Linst_st_keep<=1'b1;
end
if(f_cmiss)
begin
Icmiss_st_keep<=1'b1;
end
else if(f_arrival)
begin
Icmiss_st_keep<=1'b0;
end
if(m_cmiss)
begin
Dcmiss_st_keep<=1'b1;
end
else if(m_arrival)
begin
Dcmiss_st_keep<=1'b0;
end
end
end
assign fd_st=Linst_st|Icmiss_st|Dcmiss_st|Ldhaz_st;
assign de_st=Ldhaz_st|Dcmiss_st;
assign em_st=Dcmiss_st;
//flush
always@(posedge clk)
begin
if(~rstn)
begin
jd1<=1'b0;
jd2<=1'b0;
jd_b1<=1'b0;
jd_b2<=1'b0;
jd_b3<=1'b0;
bpt<=1'b0;
bptrt<=1'b0;
bptnt<=1'b0;
bptnt1<=1'b0;
bnt<=1'b0;
bnt1<=1'b0;
bnt2<=1'b0;
end
else
begin
if(is_j&(~flush))// if jump-1 is also a jump, ingore latter one
begin
jd1<=1'b1;
jd_b1<=(|src1_sel[1:0])|(|src2_sel[1:0]);
end
else if(is_b&(~flush))
begin
if(pre_taken)
begin
bpt<=1'b1;
end
else
bnt<=1'b1;
begin
end
end
else
begin
jd1<=1'b0;
bpt<=1'b0;
bnt<=1'b0;
jd_b1<=1'b0;
end
jd2<=jd1;
jd_b2<=jd_b1;
jd_b3<=jd_b2;
bptrt<=bpt&real_taken;
bptnt<=bpt&~real_taken;
bptnt1<=bptnt;
bnt1<=bnt&real_taken;
bnt2<=bnt1;
end
end
assign flush=jd1|jd_b2|bptnt|(bpt&real_taken)|bnt1|(bnt&real_taken);
assign flush_o=flush;
assign rs1_depended_h_o=|src1_sel;
assign ptnt_e_i=bpt&~real_taken;
endmodule
`endif