1 | // ========== Copyright Header Begin ========================================== |
---|
2 | // |
---|
3 | // OpenSPARC T1 Processor File: sparc_ifu_mbist.v |
---|
4 | // Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved. |
---|
5 | // DO NOT ALTER OR REMOVE COPYRIGHT NOTICES. |
---|
6 | // |
---|
7 | // The above named program is free software; you can redistribute it and/or |
---|
8 | // modify it under the terms of the GNU General Public |
---|
9 | // License version 2 as published by the Free Software Foundation. |
---|
10 | // |
---|
11 | // The above named program is distributed in the hope that it will be |
---|
12 | // useful, but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
---|
14 | // General Public License for more details. |
---|
15 | // |
---|
16 | // You should have received a copy of the GNU General Public |
---|
17 | // License along with this work; if not, write to the Free Software |
---|
18 | // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. |
---|
19 | // |
---|
20 | // ========== Copyright Header End ============================================ |
---|
21 | /////////////////////////////////////////////////////////////////////////////// |
---|
22 | // |
---|
23 | // Description: Memory BIST Controller for the L1 ICache and DCache |
---|
24 | // Block Type: Control Block |
---|
25 | // Module: mbist_engine |
---|
26 | // |
---|
27 | /////////////////////////////////////////////////////////////////////////////// |
---|
28 | |
---|
29 | |
---|
30 | module sparc_ifu_mbist( |
---|
31 | mbist_dcache_read, |
---|
32 | mbist_dcache_write, |
---|
33 | mbist_dcache_word, |
---|
34 | mbist_dcache_index, |
---|
35 | mbist_dcache_way, |
---|
36 | mbist_icache_read, |
---|
37 | mbist_icache_write, |
---|
38 | mbist_icache_index, |
---|
39 | mbist_icache_word, |
---|
40 | mbist_icache_way, |
---|
41 | mbist_icache_wdata, |
---|
42 | mbist_dcache_wdata, |
---|
43 | mbist_done, |
---|
44 | mbist_dcache_fail, |
---|
45 | mbist_icache_fail, |
---|
46 | rclk, |
---|
47 | mbist_start, |
---|
48 | mbist_ifq_run_bist, |
---|
49 | mbist_userdata_mode, |
---|
50 | mbist_bisi_mode, |
---|
51 | mbist_loop_mode, |
---|
52 | mbist_loop_on_address, |
---|
53 | mbist_stop_on_fail, |
---|
54 | mbist_stop_on_next_fail, |
---|
55 | mbist_dcache_data_in, |
---|
56 | mbist_icache_data_in, |
---|
57 | grst_l, |
---|
58 | arst_l, |
---|
59 | mbist_si, |
---|
60 | mbist_so, |
---|
61 | mbist_se |
---|
62 | ); |
---|
63 | |
---|
64 | |
---|
65 | |
---|
66 | |
---|
67 | // ///////////////////////////////////////////////////////////////////////////// |
---|
68 | // Outputs |
---|
69 | // ///////////////////////////////////////////////////////////////////////////// |
---|
70 | |
---|
71 | output mbist_dcache_read; |
---|
72 | output mbist_dcache_write; |
---|
73 | output mbist_dcache_word; |
---|
74 | output[6:0] mbist_dcache_index; |
---|
75 | output[1:0] mbist_dcache_way; |
---|
76 | |
---|
77 | output mbist_icache_read; |
---|
78 | output mbist_icache_write; |
---|
79 | output[7:0] mbist_icache_index; |
---|
80 | output mbist_icache_word; |
---|
81 | output[1:0] mbist_icache_way; |
---|
82 | output mbist_ifq_run_bist; |
---|
83 | |
---|
84 | output[7:0] mbist_icache_wdata; |
---|
85 | output[7:0] mbist_dcache_wdata; |
---|
86 | |
---|
87 | output mbist_done; |
---|
88 | output mbist_dcache_fail; |
---|
89 | output mbist_icache_fail; |
---|
90 | |
---|
91 | output mbist_so; |
---|
92 | |
---|
93 | |
---|
94 | |
---|
95 | // ///////////////////////////////////////////////////////////////////////////// |
---|
96 | // Inputs |
---|
97 | // ///////////////////////////////////////////////////////////////////////////// |
---|
98 | |
---|
99 | input rclk; |
---|
100 | input mbist_si; |
---|
101 | input mbist_se; |
---|
102 | |
---|
103 | input grst_l; |
---|
104 | input arst_l; |
---|
105 | |
---|
106 | input mbist_start; |
---|
107 | input mbist_userdata_mode; |
---|
108 | input mbist_bisi_mode; |
---|
109 | input mbist_loop_mode; |
---|
110 | input mbist_loop_on_address; |
---|
111 | input mbist_stop_on_fail; |
---|
112 | input mbist_stop_on_next_fail; |
---|
113 | |
---|
114 | input[71:0] mbist_dcache_data_in; |
---|
115 | input[67:0] mbist_icache_data_in; |
---|
116 | |
---|
117 | |
---|
118 | // ///////////////////////////////////////////////////////////////////////////// |
---|
119 | // Wires |
---|
120 | // ///////////////////////////////////////////////////////////////////////////// |
---|
121 | |
---|
122 | wire [7:0] config_in; |
---|
123 | wire [7:0] config_out; |
---|
124 | wire start_transition; |
---|
125 | wire reset_engine; |
---|
126 | wire loop; |
---|
127 | wire run; |
---|
128 | wire bisi; |
---|
129 | wire userdata_mode; |
---|
130 | wire stop_on_fail; |
---|
131 | wire stop_on_next_fail; |
---|
132 | wire loop_on_address; |
---|
133 | wire [7:0] userdata_in; |
---|
134 | wire [7:0] userdata_out; |
---|
135 | wire [6:0] useradd_in; |
---|
136 | wire [6:0] useradd_out; |
---|
137 | wire [20:0] control_in; |
---|
138 | wire [20:0] control_out; |
---|
139 | wire msb; |
---|
140 | wire array_sel; |
---|
141 | wire [1:0] data_control; |
---|
142 | wire address_mix; |
---|
143 | wire [2:0] march_element; |
---|
144 | wire [9:0] array_address; |
---|
145 | wire dcache_sel; |
---|
146 | wire [1:0] read_write_control; |
---|
147 | wire [20:0] qual_control_out; |
---|
148 | wire four_cycle_march; |
---|
149 | wire [9:0] add; |
---|
150 | wire upaddress_march; |
---|
151 | wire [10:0] mbist_address; |
---|
152 | wire array_write; |
---|
153 | wire array_read; |
---|
154 | wire initialize; |
---|
155 | wire fail; |
---|
156 | wire true_data; |
---|
157 | wire [7:0] data_pattern; |
---|
158 | wire second_time_through; |
---|
159 | wire icache_sel; |
---|
160 | wire dc_read_pipe_out1; |
---|
161 | wire dc_read_pipe_out2; |
---|
162 | wire dcache_piped_read; |
---|
163 | wire ic_read_pipe_out1; |
---|
164 | wire ic_read_pipe_out2; |
---|
165 | wire icache_piped_read; |
---|
166 | wire [7:0] data_pipe_out1; |
---|
167 | wire [7:0] data_pipe_out2; |
---|
168 | wire [10:0] add_pipe_out1; |
---|
169 | wire [10:0] add_pipe_out2; |
---|
170 | wire [9:0] dcache_piped_address; |
---|
171 | wire [10:0] icache_piped_address; |
---|
172 | wire [1:0] fail_reg_in; |
---|
173 | wire [1:0] fail_reg_out; |
---|
174 | wire qual_dcache_fail; |
---|
175 | wire qual_icache_fail; |
---|
176 | wire beyond_last_fail; |
---|
177 | wire dcache_fail; |
---|
178 | wire icache_fail; |
---|
179 | wire mismatch, mbist_word_sel; |
---|
180 | wire [71:0] expect_data; |
---|
181 | wire [71:0] compare_data; |
---|
182 | wire qual_fail, dcache_data_sel; |
---|
183 | wire [10:0] fail_add_reg_in; |
---|
184 | wire [10:0] fail_add_reg_out; |
---|
185 | wire [71:0] fail_data_reg_in; |
---|
186 | wire [71:0] fail_data_reg_out; |
---|
187 | wire [20:0] fail_control_reg_in; |
---|
188 | wire [20:0] fail_control_reg_out; |
---|
189 | wire mbist_icache_read_bf, mbist_icache_write_bf; |
---|
190 | wire [71:0] compare_data_bf; |
---|
191 | wire msb_rst, msb_d1_rst, msb_d2_rst, msb_d3_rst, mbist_done_int; |
---|
192 | wire msb_d1, msb_d2, msb_d3, msb_d4, mbist_reset_l, mbist_reset; |
---|
193 | |
---|
194 | |
---|
195 | //// reset buffer //// |
---|
196 | |
---|
197 | dffrl_async rstff(.din (grst_l), |
---|
198 | .q (mbist_reset_l), |
---|
199 | .clk (rclk), .se(mbist_se), .si(), .so(), |
---|
200 | .rst_l (arst_l)); |
---|
201 | |
---|
202 | assign mbist_reset = ~mbist_reset_l; |
---|
203 | |
---|
204 | // ///////////////////////////////////////////////////////////////////////////// |
---|
205 | // |
---|
206 | // MBIST Config Register |
---|
207 | // |
---|
208 | // ///////////////////////////////////////////////////////////////////////////// |
---|
209 | // |
---|
210 | // A low to high transition on mbist_start will reset and start the engine. |
---|
211 | // mbist_start must remain active high for the duration of MBIST. |
---|
212 | // If mbist_start deasserts the engine will stop but not reset. |
---|
213 | // Once MBIST has completed mbist_done will assert and the fail status |
---|
214 | // signals will be valid. |
---|
215 | // To run MBIST again the mbist_start signal must transition low then high. |
---|
216 | // |
---|
217 | // Loop on Address will disable the address mix function. |
---|
218 | // |
---|
219 | // ///////////////////////////////////////////////////////////////////////////// |
---|
220 | |
---|
221 | |
---|
222 | |
---|
223 | dff_s #(8) config_reg ( |
---|
224 | .clk ( rclk ), |
---|
225 | .din ( config_in[7:0] ), |
---|
226 | .q ( config_out[7:0] ), .se(mbist_se), .si(), .so()); |
---|
227 | |
---|
228 | |
---|
229 | |
---|
230 | assign config_in[0] = mbist_start; |
---|
231 | assign config_in[1] = config_out[0]; |
---|
232 | assign start_transition = config_out[0] & ~config_out[1]; |
---|
233 | assign reset_engine = mbist_reset | start_transition | ((loop | loop_on_address) & mbist_done); |
---|
234 | assign run = config_out[1] & ~mbist_done_int; |
---|
235 | assign mbist_ifq_run_bist = run; |
---|
236 | |
---|
237 | assign config_in[2] = start_transition ? mbist_bisi_mode: config_out[2]; |
---|
238 | assign bisi = config_out[2]; |
---|
239 | |
---|
240 | assign config_in[3] = start_transition ? mbist_userdata_mode: config_out[3]; |
---|
241 | assign userdata_mode = config_out[3]; |
---|
242 | |
---|
243 | assign config_in[4] = start_transition ? mbist_loop_mode: config_out[4]; |
---|
244 | assign loop = config_out[4]; |
---|
245 | |
---|
246 | assign config_in[5] = start_transition ? mbist_stop_on_fail: config_out[5]; |
---|
247 | assign stop_on_fail = config_out[5]; |
---|
248 | |
---|
249 | assign config_in[6] = start_transition ? mbist_stop_on_next_fail: config_out[6]; |
---|
250 | assign stop_on_next_fail = config_out[6]; |
---|
251 | |
---|
252 | assign config_in[7] = start_transition ? mbist_loop_on_address: config_out[7]; |
---|
253 | assign loop_on_address = config_out[7]; |
---|
254 | |
---|
255 | |
---|
256 | dff_s #(8) userdata_reg ( |
---|
257 | .clk ( rclk ), |
---|
258 | .din ( userdata_in[7:0] ), |
---|
259 | .q ( userdata_out[7:0] ), .se(mbist_se), .si(), .so()); |
---|
260 | |
---|
261 | |
---|
262 | assign userdata_in[7:0] = userdata_out[7:0]; |
---|
263 | |
---|
264 | |
---|
265 | |
---|
266 | |
---|
267 | dff_s #(7) user_address_reg ( |
---|
268 | .clk ( rclk ), |
---|
269 | .din ( useradd_in[6:0] ), |
---|
270 | .q ( useradd_out[6:0] ), .se(mbist_se), .si(), .so()); |
---|
271 | |
---|
272 | assign useradd_in[6:0] = useradd_out[6:0]; |
---|
273 | |
---|
274 | |
---|
275 | // ///////////////////////////////////////////////////////////////////////////// |
---|
276 | // |
---|
277 | // MBIST Control Register |
---|
278 | // |
---|
279 | // ///////////////////////////////////////////////////////////////////////////// |
---|
280 | // Remove Address mix disable before delivery |
---|
281 | // ///////////////////////////////////////////////////////////////////////////// |
---|
282 | |
---|
283 | |
---|
284 | dff_s #(21) control_reg ( |
---|
285 | .clk ( rclk ), |
---|
286 | .din ( control_in[20:0] ), |
---|
287 | .q ( control_out[20:0] ), .se(mbist_se), .si(), .so()); |
---|
288 | |
---|
289 | assign msb = control_out[20]; |
---|
290 | assign array_sel = control_out[19]; |
---|
291 | assign data_control[1:0] = userdata_mode ? 2'b11 : control_out[18:17]; |
---|
292 | assign address_mix = loop_on_address ? 1'b1: control_out[16]; |
---|
293 | assign mbist_word_sel = loop_on_address ? 1'b1 : control_out[15]; |
---|
294 | assign march_element[2:0] = control_out[14:12]; |
---|
295 | assign array_address[9:0] = loop_on_address ? {6'h3f, control_out[5:2]}: |
---|
296 | (dcache_sel & ~bisi) ? {1'd1, control_out[10:2]}: control_out[11:2]; |
---|
297 | assign read_write_control[1:0] = control_out[1:0]; |
---|
298 | |
---|
299 | assign qual_control_out[20:0] = {msb, array_sel, data_control[1:0], address_mix, mbist_word_sel, march_element[2:0], array_address[9:0], read_write_control[1:0]}; |
---|
300 | |
---|
301 | // added by Chandra |
---|
302 | |
---|
303 | wire [1:0] add_data_int; |
---|
304 | wire [20:0] add_data; |
---|
305 | wire [9:0] mbist_address_bf; |
---|
306 | |
---|
307 | assign add_data_int[1:0] = four_cycle_march ? 2'b01: 2'b10; |
---|
308 | assign add_data[20:0] = qual_control_out[20:0] + {19'd0, add_data_int}; |
---|
309 | assign control_in[20:0] = {21{~run & ~reset_engine}} & qual_control_out | {21{run & ~reset_engine}} & add_data; |
---|
310 | |
---|
311 | assign add[9:0] = upaddress_march ? array_address[9:0]: ~array_address[9:0]; |
---|
312 | assign mbist_address_bf[9:0] = loop_on_address ? {useradd_out[5:0], add[3:0]}: |
---|
313 | address_mix ? (dcache_sel ? ({add[9:8], add[0], add[7:1]}) : ({add[9:8], add[6:0], add[7]})) : |
---|
314 | add[9:0]; |
---|
315 | |
---|
316 | |
---|
317 | |
---|
318 | assign array_write = ~run ? 1'b0: |
---|
319 | four_cycle_march ? (read_write_control[0] ^ read_write_control[1]): read_write_control[1]; |
---|
320 | assign array_read = ~array_write && run && ~initialize; |
---|
321 | |
---|
322 | assign mbist_done_int = (stop_on_fail && fail) || (stop_on_next_fail && fail) || |
---|
323 | (bisi && march_element[0]) || msb; |
---|
324 | |
---|
325 | assign mbist_done = (stop_on_fail && fail) || (stop_on_next_fail && fail) || |
---|
326 | (bisi && march_element[0]) || msb_d4; |
---|
327 | |
---|
328 | //////////// |
---|
329 | //////////// |
---|
330 | |
---|
331 | wire [7:0] mbist_write_data_bf; |
---|
332 | |
---|
333 | assign mbist_write_data_bf[7:0] = true_data ? data_pattern[7:0]: ~data_pattern[7:0]; |
---|
334 | assign mbist_dcache_wdata[7:0] = mbist_write_data_bf[7:0]; |
---|
335 | |
---|
336 | assign second_time_through = ~loop_on_address && address_mix; |
---|
337 | assign initialize = (march_element[2:0] == 3'b000) && ~second_time_through; |
---|
338 | assign four_cycle_march = (march_element[2:0] == 3'h6) || (march_element[2:0] == 3'h7); |
---|
339 | assign upaddress_march = (march_element[2:0] == 3'h0) || (march_element[2:0] == 3'h1) || |
---|
340 | (march_element[2:0] == 3'h2) || (march_element[2:0] == 3'h6); |
---|
341 | |
---|
342 | assign true_data = read_write_control[1] ^ ~march_element[0]; |
---|
343 | assign data_pattern[7:0] = userdata_mode ? userdata_out[7:0]: |
---|
344 | bisi ? 8'hFF: // true_data function will invert to 8'h00 |
---|
345 | (data_control[1:0] == 2'h0) ? 8'hAA: |
---|
346 | (data_control[1:0] == 2'h1) ? 8'h99: |
---|
347 | (data_control[1:0] == 2'h2) ? 8'hCC: |
---|
348 | 8'h00; |
---|
349 | assign dcache_sel = ~array_sel; |
---|
350 | assign icache_sel = array_sel; |
---|
351 | |
---|
352 | //////////// |
---|
353 | //////////// |
---|
354 | |
---|
355 | assign mbist_dcache_index[6:0] = mbist_address[6:0]; |
---|
356 | assign mbist_dcache_way[1:0] = (mbist_address[8:7] & {2{config_out[0]}}); |
---|
357 | assign mbist_dcache_word = mbist_address[10]; |
---|
358 | assign mbist_dcache_read = dcache_sel && array_read; |
---|
359 | assign mbist_dcache_write = (dcache_sel || bisi) && array_write; |
---|
360 | |
---|
361 | assign mbist_icache_index[7:0] = mbist_address[7:0]; |
---|
362 | assign mbist_icache_way[1:0] = (mbist_address[9:8] & {2{config_out[0]}}); |
---|
363 | assign mbist_icache_word = mbist_address[10]; |
---|
364 | assign mbist_icache_read_bf = icache_sel && array_read; |
---|
365 | assign mbist_icache_write_bf = (icache_sel || bisi) && array_write; |
---|
366 | |
---|
367 | //////////////////////// |
---|
368 | //////////////////////// |
---|
369 | |
---|
370 | assign msb_rst = msb & ~reset_engine; |
---|
371 | dff_s #(1) msb_d1_inst( |
---|
372 | .clk ( rclk ), |
---|
373 | .din ( msb_rst ), |
---|
374 | .q ( msb_d1 ), .se(mbist_se), .si(), .so()); |
---|
375 | assign msb_d1_rst = msb_d1 & ~reset_engine; |
---|
376 | dff_s #(1) msb_d2_inst( |
---|
377 | .clk ( rclk ), |
---|
378 | .din ( msb_d1_rst ), |
---|
379 | .q ( msb_d2 ), .se(mbist_se), .si(), .so()); |
---|
380 | assign msb_d2_rst = msb_d2 & ~reset_engine; |
---|
381 | dff_s #(1) msb_d3_inst( |
---|
382 | .clk ( rclk ), |
---|
383 | .din ( msb_d2_rst ), |
---|
384 | .q ( msb_d3 ), .se(mbist_se), .si(), .so()); |
---|
385 | assign msb_d3_rst = msb_d3 & ~reset_engine; |
---|
386 | dff_s #(1) msb_d4_inst( |
---|
387 | .clk ( rclk ), |
---|
388 | .din ( msb_d3_rst ), |
---|
389 | .q ( msb_d4 ), .se(mbist_se), .si(), .so()); |
---|
390 | |
---|
391 | // ///////////////////////////////////////////////////////////////////////////// |
---|
392 | // Pipeline for Read, Data, and Address |
---|
393 | // ///////////////////////////////////////////////////////////////////////////// |
---|
394 | |
---|
395 | wire dc_read_pipe_out3, dc_read_pipe_out4, ic_read_pipe_out3, ic_read_pipe_out4; |
---|
396 | wire dc_read_pipe_out1_bf, dc_read_pipe_out2_bf, dc_read_pipe_out3_bf; |
---|
397 | wire ic_read_pipe_out1_bf, ic_read_pipe_out2_bf, ic_read_pipe_out3_bf; |
---|
398 | |
---|
399 | //////////// |
---|
400 | //////////// |
---|
401 | |
---|
402 | dff_s #(1) dc_read_pipe_reg1 ( |
---|
403 | .clk ( rclk ), |
---|
404 | .din ( mbist_dcache_read ), |
---|
405 | .q ( dc_read_pipe_out1 ), .se(mbist_se), .si(), .so()); |
---|
406 | |
---|
407 | assign dc_read_pipe_out1_bf = dc_read_pipe_out1 & ~reset_engine; |
---|
408 | |
---|
409 | dff_s #(1) dc_read_pipe_reg2 ( |
---|
410 | .clk ( rclk ), |
---|
411 | .din ( dc_read_pipe_out1_bf ), |
---|
412 | .q ( dc_read_pipe_out2 ), .se(mbist_se), .si(), .so()); |
---|
413 | |
---|
414 | assign dc_read_pipe_out2_bf = dc_read_pipe_out2 & ~reset_engine; |
---|
415 | |
---|
416 | dff_s #(1) dc_read_pipe_reg3 ( |
---|
417 | .clk ( rclk ), |
---|
418 | .din ( dc_read_pipe_out2_bf ), |
---|
419 | .q ( dc_read_pipe_out3 ), .se(mbist_se), .si(), .so()); |
---|
420 | |
---|
421 | assign dc_read_pipe_out3_bf = dc_read_pipe_out3 & ~reset_engine; |
---|
422 | assign dcache_data_sel = dc_read_pipe_out3_bf; |
---|
423 | |
---|
424 | dff_s #(1) dc_read_pipe_reg4 ( |
---|
425 | .clk ( rclk ), |
---|
426 | .din ( dc_read_pipe_out3_bf ), |
---|
427 | .q ( dc_read_pipe_out4 ), .se(mbist_se), .si(), .so()); |
---|
428 | |
---|
429 | assign dcache_piped_read = dc_read_pipe_out4 & ~reset_engine; |
---|
430 | |
---|
431 | //////////// |
---|
432 | //////////// |
---|
433 | |
---|
434 | dff_s #(1) ic_read_pipe_reg1 ( |
---|
435 | .clk ( rclk ), |
---|
436 | .din ( mbist_icache_read_bf ), |
---|
437 | .q ( ic_read_pipe_out1 ), .se(mbist_se), .si(), .so()); |
---|
438 | |
---|
439 | assign ic_read_pipe_out1_bf = ic_read_pipe_out1 & ~reset_engine; |
---|
440 | assign mbist_icache_read = ic_read_pipe_out1; |
---|
441 | |
---|
442 | dff_s #(1) ic_read_pipe_reg2 ( |
---|
443 | .clk ( rclk ), |
---|
444 | .din ( ic_read_pipe_out1_bf ), |
---|
445 | .q ( ic_read_pipe_out2 ), .se(mbist_se), .si(), .so()); |
---|
446 | |
---|
447 | assign ic_read_pipe_out2_bf = ic_read_pipe_out2 & ~reset_engine; |
---|
448 | |
---|
449 | dff_s #(1) ic_read_pipe_reg3 ( |
---|
450 | .clk ( rclk ), |
---|
451 | .din ( ic_read_pipe_out2_bf ), |
---|
452 | .q ( ic_read_pipe_out3 ), .se(mbist_se), .si(), .so()); |
---|
453 | |
---|
454 | assign ic_read_pipe_out3_bf = ic_read_pipe_out3 & ~reset_engine; |
---|
455 | |
---|
456 | dff_s #(1) ic_read_pipe_reg4 ( |
---|
457 | .clk ( rclk ), |
---|
458 | .din ( ic_read_pipe_out3_bf ), |
---|
459 | .q ( ic_read_pipe_out4 ), .se(mbist_se), .si(), .so()); |
---|
460 | |
---|
461 | |
---|
462 | assign icache_piped_read = ic_read_pipe_out4 & ~reset_engine; |
---|
463 | |
---|
464 | //////////// |
---|
465 | //////////// |
---|
466 | |
---|
467 | dff_s #(1) ic_write_pipe_reg1 ( |
---|
468 | .clk ( rclk ), |
---|
469 | .din ( mbist_icache_write_bf ), |
---|
470 | .q ( mbist_icache_write ), .se(mbist_se), .si(), .so()); |
---|
471 | |
---|
472 | //////////// |
---|
473 | //////////// |
---|
474 | |
---|
475 | wire [7:0] data_pipe_out3, data_pipe_out4; |
---|
476 | |
---|
477 | dff_s #(8) data_pipe_reg1 ( |
---|
478 | .clk ( rclk ), |
---|
479 | .din ( mbist_write_data_bf[7:0] ), |
---|
480 | .q ( data_pipe_out1[7:0] ), .se(mbist_se), .si(), .so()); |
---|
481 | |
---|
482 | assign mbist_icache_wdata = data_pipe_out1; |
---|
483 | |
---|
484 | dff_s #(8) data_pipe_reg2 ( |
---|
485 | .clk ( rclk ), |
---|
486 | .din ( data_pipe_out1[7:0] ), |
---|
487 | .q ( data_pipe_out2[7:0] ), .se(mbist_se), .si(), .so()); |
---|
488 | |
---|
489 | dff_s #(8) data_pipe_reg3 ( |
---|
490 | .clk ( rclk ), |
---|
491 | .din ( data_pipe_out2[7:0] ), |
---|
492 | .q ( data_pipe_out3[7:0] ), .se(mbist_se), .si(), .so()); |
---|
493 | |
---|
494 | dff_s #(8) data_pipe_reg4 ( |
---|
495 | .clk ( rclk ), |
---|
496 | .din ( data_pipe_out3[7:0] ), |
---|
497 | .q ( data_pipe_out4[7:0] ), .se(mbist_se), .si(), .so()); |
---|
498 | |
---|
499 | |
---|
500 | //////////// |
---|
501 | //////////// |
---|
502 | |
---|
503 | wire [10:0] add_pipe_out3, add_pipe_out4; |
---|
504 | wire mbist_word_sel_bf; |
---|
505 | |
---|
506 | assign mbist_word_sel_bf = loop_on_address ? useradd_out[6] : mbist_word_sel; |
---|
507 | |
---|
508 | dff_s #(11) add_pipe_reg1 ( |
---|
509 | .clk ( rclk ), |
---|
510 | .din ( {mbist_word_sel_bf, mbist_address_bf[9:0]} ), |
---|
511 | .q ( add_pipe_out1[10:0] ), .se(mbist_se), .si(), .so()); |
---|
512 | |
---|
513 | assign mbist_address = add_pipe_out1; |
---|
514 | |
---|
515 | dff_s #(11) add_pipe_reg2 ( |
---|
516 | .clk ( rclk ), |
---|
517 | .din ( add_pipe_out1[10:0] ), |
---|
518 | .q ( add_pipe_out2[10:0] ), .se(mbist_se), .si(), .so()); |
---|
519 | |
---|
520 | dff_s #(11) add_pipe_reg3 ( |
---|
521 | .clk ( rclk ), |
---|
522 | .din ( add_pipe_out2[10:0] ), |
---|
523 | .q ( add_pipe_out3[10:0] ), .se(mbist_se), .si(), .so()); |
---|
524 | |
---|
525 | dff_s #(11) add_pipe_reg4 ( |
---|
526 | .clk ( rclk ), |
---|
527 | .din ( add_pipe_out3[10:0] ), |
---|
528 | .q ( add_pipe_out4[10:0] ), .se(mbist_se), .si(), .so()); |
---|
529 | |
---|
530 | |
---|
531 | assign dcache_piped_address[9:0] = {add_pipe_out4[10], add_pipe_out4[8:0]}; |
---|
532 | assign icache_piped_address[10:0] = add_pipe_out4[10:0]; |
---|
533 | |
---|
534 | // ///////////////////////////////////////////////////////////////////////////// |
---|
535 | // Shared Fail Detection |
---|
536 | // ///////////////////////////////////////////////////////////////////////////// |
---|
537 | |
---|
538 | dff_s #(2) fail_reg ( |
---|
539 | .clk ( rclk ), |
---|
540 | .din ( fail_reg_in[1:0] ), |
---|
541 | .q ( fail_reg_out[1:0] ), .se(mbist_se), .si(), .so()); |
---|
542 | |
---|
543 | |
---|
544 | assign fail_reg_in[1:0] = reset_engine ? 2'b0: {qual_dcache_fail,qual_icache_fail} | fail_reg_out[1:0]; |
---|
545 | |
---|
546 | |
---|
547 | assign qual_dcache_fail = (!stop_on_next_fail || (stop_on_next_fail && beyond_last_fail)) && dcache_fail; |
---|
548 | assign qual_icache_fail = (!stop_on_next_fail || (stop_on_next_fail && beyond_last_fail)) && icache_fail; |
---|
549 | |
---|
550 | assign dcache_fail = dcache_piped_read && mismatch; |
---|
551 | assign icache_fail = icache_piped_read && mismatch; |
---|
552 | |
---|
553 | // added by Chandra |
---|
554 | |
---|
555 | // assign expect_data[71:0] = { ({4{dcache_piped_read}} & data_pipe_out4[7:4]), |
---|
556 | // (icache_piped_read ? {2{data_pipe_out4[1:0]}} : data_pipe_out4[3:0]), {8{data_pipe_out4[7:0]}}}; |
---|
557 | |
---|
558 | assign expect_data[71:0] = { ({4{dcache_piped_read}} & data_pipe_out4[7:4]), |
---|
559 | (icache_piped_read ? {2{data_pipe_out4[1:0]}} : data_pipe_out4[3:0]), {7{data_pipe_out4[7:0]}}, |
---|
560 | (icache_piped_read ? data_pipe_out4[7:4] : data_pipe_out4[3:0]), data_pipe_out4[3:0] }; |
---|
561 | |
---|
562 | assign compare_data_bf[71:0] = dcache_data_sel ? mbist_dcache_data_in[71:0]: {4'h0,mbist_icache_data_in[67:0]}; |
---|
563 | |
---|
564 | dff_s #(72) compare_data_inst( |
---|
565 | .clk ( rclk ), |
---|
566 | .din ( compare_data_bf[71:0] ), |
---|
567 | .q ( compare_data[71:0] ), .se(mbist_se), .si(), .so()); |
---|
568 | |
---|
569 | assign mismatch = expect_data[71:0] != compare_data[71:0]; |
---|
570 | |
---|
571 | |
---|
572 | assign mbist_dcache_fail = fail_reg_out[1]; |
---|
573 | assign mbist_icache_fail = fail_reg_out[0]; |
---|
574 | |
---|
575 | assign fail = |fail_reg_out[1:0]; |
---|
576 | assign qual_fail = qual_dcache_fail || qual_icache_fail; |
---|
577 | |
---|
578 | |
---|
579 | // ///////////////////////////////////////////////////////////////////////////// |
---|
580 | // Fail Address and Data Capture and Control Reg Store |
---|
581 | // ///////////////////////////////////////////////////////////////////////////// |
---|
582 | |
---|
583 | |
---|
584 | |
---|
585 | dff_s #(11) fail_add_reg( |
---|
586 | .clk ( rclk ), |
---|
587 | .din ( fail_add_reg_in[10:0] ), |
---|
588 | .q ( fail_add_reg_out[10:0] ), .se(mbist_se), .si(), .so()); |
---|
589 | |
---|
590 | |
---|
591 | assign fail_add_reg_in[10:0] = reset_engine ? 11'b0: |
---|
592 | qual_dcache_fail ? {1'b0,dcache_piped_address[9:0]}: |
---|
593 | qual_icache_fail ? icache_piped_address[10:0]: |
---|
594 | fail_add_reg_out[10:0]; |
---|
595 | |
---|
596 | |
---|
597 | dff_s #(72) fail_data_reg( |
---|
598 | .clk ( rclk ), |
---|
599 | .din ( fail_data_reg_in[71:0] ), |
---|
600 | .q ( fail_data_reg_out[71:0] ), .se(mbist_se), .si(), .so()); |
---|
601 | |
---|
602 | |
---|
603 | assign fail_data_reg_in[71:0] = reset_engine ? 72'b0: |
---|
604 | qual_fail ? compare_data[71:0]: |
---|
605 | fail_data_reg_out[71:0]; |
---|
606 | |
---|
607 | |
---|
608 | assign fail_control_reg_in[20:0] = (reset_engine && !mbist_stop_on_next_fail) ? 21'b0: |
---|
609 | qual_fail ? qual_control_out[20:0]: |
---|
610 | fail_control_reg_out[20:0]; |
---|
611 | |
---|
612 | dff_s #(21) fail_control_reg_inst( |
---|
613 | .clk ( rclk ), |
---|
614 | .din ( fail_control_reg_in[20:0] ), |
---|
615 | .q ( fail_control_reg_out[20:0] ), .se(mbist_se), .si(), .so()); |
---|
616 | |
---|
617 | //////// |
---|
618 | |
---|
619 | assign beyond_last_fail = qual_control_out[20:0] > fail_control_reg_out[20:0]; |
---|
620 | |
---|
621 | |
---|
622 | endmodule |
---|