Initial commit of OpenSPARC T2 design and verification files.
[OpenSPARC-T2-DV] / design / sys / iop / ncu / rtl / ncu_mb1_ctl.v
CommitLineData
86530b38
AT
1// ========== Copyright Header Begin ==========================================
2//
3// OpenSPARC T2 Processor File: ncu_mb1_ctl.v
4// Copyright (C) 1995-2007 Sun Microsystems, Inc. All Rights Reserved
5// 4150 Network Circle, Santa Clara, California 95054, U.S.A.
6//
7// * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
8//
9// This program is free software; you can redistribute it and/or modify
10// it under the terms of the GNU General Public License as published by
11// the Free Software Foundation; version 2 of the License.
12//
13// This program is distributed in the hope that it will be useful,
14// but WITHOUT ANY WARRANTY; without even the implied warranty of
15// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16// GNU General Public License for more details.
17//
18// You should have received a copy of the GNU General Public License
19// along with this program; if not, write to the Free Software
20// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21//
22// For the avoidance of doubt, and except that if any non-GPL license
23// choice is available it will apply instead, Sun elects to use only
24// the General Public License version 2 (GPLv2) at this time for any
25// software where a choice of GPL license versions is made
26// available with the language indicating that GPLv2 or any later version
27// may be used, or where a choice of which version of the GPL is applied is
28// otherwise unspecified.
29//
30// Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
31// CA 95054 USA or visit www.sun.com if you need additional information or
32// have any questions.
33//
34// ========== Copyright Header End ============================================
35module ncu_mb1_ctl (
36 mb1_run,
37 mb1_addr,
38 mb1_wdata,
39 mb1_intman_wr_en,
40 mb1_intman_rd_en,
41 mb1_dmubuf0_wr_en,
42 mb1_dmubuf0_rd_en,
43 mb1_dmubuf1_wr_en,
44 mb1_dmubuf1_rd_en,
45 mb1_cpubuf_wr_en,
46 mb1_cpubuf_rd_en,
47 mb1_done,
48 mb1_fail,
49 scan_out,
50 l2clk,
51 scan_in,
52 tcu_pce_ov,
53 tcu_clk_stop,
54 tcu_aclk,
55 tcu_bclk,
56 tcu_scan_en,
57 mb1_start,
58 mb1_bisi_mode,
59 mb1_user_mode,
60 intman_dout,
61 cpubuf_dout,
62 dmubuf0_dout,
63 dmubuf1_dout);
64wire pce_ov;
65wire stop;
66wire siclk;
67wire soclk;
68wire se;
69wire l1clk;
70wire config_reg_scanin;
71wire config_reg_scanout;
72wire [8:0] config_in;
73wire [8:0] config_out;
74wire start_transition;
75wire reset_engine;
76wire mbist_user_loop_mode;
77wire mbist_done;
78wire run;
79wire bisi;
80wire user_mode;
81wire user_data_mode;
82wire user_addr_mode;
83wire user_loop_mode;
84wire user_cmpsel_hold;
85wire ten_n_mode;
86wire mbist_user_data_mode;
87wire mbist_user_addr_mode;
88wire mbist_user_cmpsel_hold;
89wire mbist_ten_n_mode;
90wire user_data_reg_scanin;
91wire user_data_reg_scanout;
92wire [7:0] user_data_in;
93wire [7:0] user_data_out;
94wire user_start_addr_reg_scanin;
95wire user_start_addr_reg_scanout;
96wire [6:0] user_start_addr_in;
97wire [6:0] user_start_addr;
98wire user_stop_addr_reg_scanin;
99wire user_stop_addr_reg_scanout;
100wire [6:0] user_stop_addr_in;
101wire [6:0] user_stop_addr;
102wire user_incr_addr_reg_scanin;
103wire user_incr_addr_reg_scanout;
104wire [6:0] user_incr_addr_in;
105wire [6:0] user_incr_addr;
106wire user_array_sel_reg_scanin;
107wire user_array_sel_reg_scanout;
108wire [1:0] user_array_sel_in;
109wire [1:0] user_array_sel;
110wire user_cmpsel_reg_scanin;
111wire user_cmpsel_reg_scanout;
112wire [1:0] user_cmpsel_in;
113wire [1:0] user_cmpsel;
114wire user_bisi_wr_reg_scanin;
115wire user_bisi_wr_reg_scanout;
116wire user_bisi_wr_mode_in;
117wire user_bisi_wr_mode;
118wire user_bisi_rd_reg_scanin;
119wire user_bisi_rd_reg_scanout;
120wire user_bisi_rd_mode_in;
121wire user_bisi_rd_mode;
122wire mbist_user_bisi_wr_mode;
123wire mbist_user_bisi_wr_rd_mode;
124wire start_transition_reg_scanin;
125wire start_transition_reg_scanout;
126wire start_transition_piped;
127wire run_reg_scanin;
128wire run_reg_scanout;
129wire counter_reg_scanin;
130wire counter_reg_scanout;
131wire [3:0] counter_in;
132wire [3:0] counter_out;
133wire cycle16;
134wire run_piped16;
135wire msb;
136wire intman_rd_wr_en_reg_scanin;
137wire intman_rd_wr_en_reg_scanout;
138wire mbist_intman_read;
139wire mbist_intman_write;
140wire dmubuf0_rd_wr_en_reg_scanin;
141wire dmubuf0_rd_wr_en_reg_scanout;
142wire mbist_dmubuf0_read;
143wire mbist_dmubuf0_write;
144wire dmubuf1_rd_wr_en_reg_scanin;
145wire dmubuf1_rd_wr_en_reg_scanout;
146wire mbist_dmubuf1_read;
147wire mbist_dmubuf1_write;
148wire cpubuf_rd_wr_en_reg_scanin;
149wire cpubuf_rd_wr_en_reg_scanout;
150wire mbist_cpubuf_read;
151wire mbist_cpubuf_write;
152wire mb1_addr_reg_scanin;
153wire mb1_addr_reg_scanout;
154wire [6:0] mbist_address;
155wire mb1_wdata_reg_scanin;
156wire mb1_wdata_reg_scanout;
157wire [7:0] mbist_wdata;
158wire done_fail_reg_scanin;
159wire done_fail_reg_scanout;
160wire fail;
161wire intman_rd_en_piped2;
162wire dmubuf0_rd_en_piped2;
163wire dmubuf1_rd_en_piped2;
164wire cpubuf_rd_en_piped2;
165wire [1:0] cmpsel_piped3;
166wire res_read_data_reg_scanin;
167wire res_read_data_reg_scanout;
168wire [39:0] res_read_data_piped;
169wire control_reg_scanin;
170wire control_reg_scanout;
171wire [22:0] control_in;
172wire [22:0] control_out;
173wire bisi_wr_rd;
174wire [1:0] array_sel;
175wire [1:0] cmpsel;
176wire intman_sel;
177wire [1:0] data_control;
178wire address_mix;
179wire [3:0] march_element;
180wire [6:0] array_address;
181wire upaddress_march;
182wire [2:0] read_write_control;
183wire five_cycle_march;
184wire one_cycle_march;
185wire increment_addr;
186wire [6:0] start_addr;
187wire [6:0] next_array_address;
188wire next_upaddr_march;
189wire next_downaddr_march;
190wire [6:0] stop_addr;
191wire [7:0] overflow_addr;
192wire cpubuf_sel;
193wire dmubuf0_sel;
194wire dmubuf1_sel;
195wire [6:0] incr_addr;
196wire overflow;
197wire [7:0] compare_addr;
198wire [6:0] add;
199wire [6:0] adj_address;
200wire increment_march_elem;
201wire [1:0] next_array_sel;
202wire [1:0] next_cmpsel;
203wire [1:0] next_data_control;
204wire next_address_mix;
205wire [3:0] next_march_element;
206wire array_write;
207wire array_read;
208wire true_data;
209wire [7:0] data_pattern;
210wire done_counter_reg_scanin;
211wire done_counter_reg_scanout;
212wire [2:0] done_counter_in;
213wire [2:0] done_counter_out;
214wire data_pipe_reg1_scanin;
215wire data_pipe_reg1_scanout;
216wire [7:0] date_pipe_reg1_in;
217wire [7:0] data_pipe_out1;
218wire data_pipe_reg2_scanin;
219wire data_pipe_reg2_scanout;
220wire [7:0] date_pipe_reg2_in;
221wire [7:0] data_pipe_out2;
222wire data_pipe_reg3_scanin;
223wire data_pipe_reg3_scanout;
224wire [7:0] date_pipe_reg3_in;
225wire [7:0] data_pipe_out3;
226wire [7:0] ncu_mb1_piped_wdata;
227wire ren_pipe_reg1_scanin;
228wire ren_pipe_reg1_scanout;
229wire [3:0] ren_pipe_reg1_in;
230wire [3:0] rd_en_piped;
231wire ren_pipe_reg2_scanin;
232wire ren_pipe_reg2_scanout;
233wire [3:0] ren_pipe_reg2_in;
234wire [3:0] rd_en_piped2;
235wire ren_pipe_reg3_scanin;
236wire ren_pipe_reg3_scanout;
237wire [3:0] ren_pipe_reg3_in;
238wire [3:0] rd_en_piped3;
239wire intman_rd_en_piped3;
240wire dmubuf0_rd_en_piped3;
241wire dmubuf1_rd_en_piped3;
242wire cpubuf_rd_en_piped3;
243wire cmpsel_pipe_reg1_scanin;
244wire cmpsel_pipe_reg1_scanout;
245wire [1:0] cmpsel_pipe_reg1_in;
246wire [1:0] cmpsel_pipe_out1;
247wire cmpsel_pipe_reg2_scanin;
248wire cmpsel_pipe_reg2_scanout;
249wire [1:0] cmpsel_pipe_reg2_in;
250wire [1:0] cmpsel_pipe_out2;
251wire cmpsel_pipe_reg3_scanin;
252wire cmpsel_pipe_reg3_scanout;
253wire [1:0] cmpsel_pipe_reg3_in;
254wire [1:0] cmpsel_pipe_out3;
255wire cmpsel_pipe_reg4_scanin;
256wire cmpsel_pipe_reg4_scanout;
257wire [1:0] cmpsel_pipe_reg4_in;
258wire [1:0] cmpsel_pipe_out4;
259wire [1:0] cmpsel_piped4;
260wire fail_reg_scanin;
261wire fail_reg_scanout;
262wire [3:0] fail_reg_in;
263wire [3:0] fail_reg_out;
264wire qual_cpubuf_fail;
265wire qual_dmubuf1_fail;
266wire qual_dmubuf0_fail;
267wire qual_intman_fail;
268wire fail_detect;
269
270
271
272
273
274// /////////////////////////////////////////////////////////////////////////////
275// Outputs
276// /////////////////////////////////////////////////////////////////////////////
277
278 output mb1_run;
279
280 output [6:0] mb1_addr;
281 output [7:0] mb1_wdata;
282
283 output mb1_intman_wr_en;
284 output mb1_intman_rd_en;
285
286 output mb1_dmubuf0_wr_en;
287 output mb1_dmubuf0_rd_en;
288
289 output mb1_dmubuf1_wr_en;
290 output mb1_dmubuf1_rd_en;
291
292 output mb1_cpubuf_wr_en;
293 output mb1_cpubuf_rd_en;
294
295 output mb1_done;
296 output mb1_fail;
297
298 output scan_out;
299
300
301// /////////////////////////////////////////////////////////////////////////////
302// Inputs
303// /////////////////////////////////////////////////////////////////////////////
304
305 input l2clk;
306 input scan_in;
307 input tcu_pce_ov; // scan signals
308 input tcu_clk_stop;
309 input tcu_aclk;
310 input tcu_bclk;
311 input tcu_scan_en;
312
313
314 input mb1_start;
315 input mb1_bisi_mode;
316 input mb1_user_mode;
317
318 input [15:0] intman_dout;
319 input [143:0] cpubuf_dout;
320 input [143:0] dmubuf0_dout;
321 input [143:0] dmubuf1_dout;
322
323
324// /////////////////////////////////////////////////////////////////////////////
325// Scan Renames
326// /////////////////////////////////////////////////////////////////////////////
327
328reg [47:0] res_read_data;
329
330assign pce_ov = tcu_pce_ov;
331assign stop = tcu_clk_stop;
332assign siclk = tcu_aclk;
333assign soclk = tcu_bclk;
334assign se = tcu_scan_en;
335
336
337////////////////////////////////////////////////////////////////////////////////
338// Clock header
339
340ncu_scd_ctl_l1clkhdr_ctl_macro clkgen (
341 .l2clk (l2clk ),
342 .l1en (1'b1 ),
343 .l1clk (l1clk ),
344 .pce_ov(pce_ov),
345 .stop(stop),
346 .se(se)
347);
348
349
350// /////////////////////////////////////////////////////////////////////////////
351//
352// MBIST Config Register
353//
354// /////////////////////////////////////////////////////////////////////////////
355//
356// A low to high transition on mb1_start will reset and start the engine.
357// mb1_start must remain active high for the duration of MBIST.
358// If mb1_start deasserts the engine will stop but not reset.
359// Once MBIST has completed mbist_done will assert and the fail status
360// signals will be valid.
361// To run MBIST again the mb1_start signal must transition low then high.
362//
363// Loop on Address will disable the address mix function.
364//
365// /////////////////////////////////////////////////////////////////////////////
366
367 ncu_scd_ctl_msff_ctl_macro__width_9 config_reg (
368 .scan_in(config_reg_scanin),
369 .scan_out(config_reg_scanout),
370 .din ( config_in[8:0] ),
371 .dout ( config_out[8:0] ),
372 .l1clk(l1clk),
373 .siclk(siclk),
374 .soclk(soclk));
375
376
377 assign config_in[0] = mb1_start;
378 assign config_in[1] = config_out[0];
379 assign start_transition = config_out[0] & ~config_out[1];
380 assign reset_engine = start_transition | (mbist_user_loop_mode & mbist_done);
381// assign run = config_out[1] & (mbist_user_loop_mode | ~mbist_done);
382 assign run = config_out[0] & config_out[1]; // 9/19/05 run to follow start only!
383
384 assign config_in[2] = start_transition ? mb1_bisi_mode: config_out[2];
385 assign bisi = config_out[2];
386
387 assign config_in[3] = start_transition ? mb1_user_mode: config_out[3];
388 assign user_mode = config_out[3];
389
390 assign config_in[4] = config_out[4];
391 assign user_data_mode = config_out[4];
392
393 assign config_in[5] = config_out[5];
394 assign user_addr_mode = config_out[5];
395
396 assign config_in[6] = config_out[6];
397 assign user_loop_mode = config_out[6];
398
399 assign config_in[7] = config_out[7];
400 assign user_cmpsel_hold = config_out[7]; //cmpsel_hold = 0 : Default, All cominations
401 // = 1 : User-specified cmpsel
402 assign config_in[8] = config_out[8];
403 assign ten_n_mode = config_out[8];
404
405
406 assign mbist_user_data_mode = user_mode & user_data_mode;
407 assign mbist_user_addr_mode = user_mode & user_addr_mode;
408 assign mbist_user_loop_mode = user_mode & user_loop_mode;
409 assign mbist_user_cmpsel_hold = user_mode & user_cmpsel_hold;
410 assign mbist_ten_n_mode = user_mode & ten_n_mode;
411
412
413 ncu_scd_ctl_msff_ctl_macro__width_8 user_data_reg (
414 .scan_in(user_data_reg_scanin),
415 .scan_out(user_data_reg_scanout),
416 .din ( user_data_in[7:0] ),
417 .dout ( user_data_out[7:0] ),
418 .l1clk(l1clk),
419 .siclk(siclk),
420 .soclk(soclk));
421
422
423 assign user_data_in[7:0] = user_data_out[7:0];
424
425
426// Defining User start, stop, and increment addresses.
427
428 ncu_scd_ctl_msff_ctl_macro__width_7 user_start_addr_reg (
429 .scan_in(user_start_addr_reg_scanin),
430 .scan_out(user_start_addr_reg_scanout),
431 .din ( user_start_addr_in[6:0] ),
432 .dout ( user_start_addr[6:0] ),
433 .l1clk(l1clk),
434 .siclk(siclk),
435 .soclk(soclk));
436
437 assign user_start_addr_in[6:0] = user_start_addr[6:0];
438
439 ncu_scd_ctl_msff_ctl_macro__width_7 user_stop_addr_reg (
440 .scan_in(user_stop_addr_reg_scanin),
441 .scan_out(user_stop_addr_reg_scanout),
442 .din ( user_stop_addr_in[6:0] ),
443 .dout ( user_stop_addr[6:0] ),
444 .l1clk(l1clk),
445 .siclk(siclk),
446 .soclk(soclk));
447
448 assign user_stop_addr_in[6:0] = user_stop_addr[6:0];
449
450
451 ncu_scd_ctl_msff_ctl_macro__width_7 user_incr_addr_reg (
452 .scan_in(user_incr_addr_reg_scanin),
453 .scan_out(user_incr_addr_reg_scanout),
454 .din ( user_incr_addr_in[6:0] ),
455 .dout ( user_incr_addr[6:0] ),
456 .l1clk(l1clk),
457 .siclk(siclk),
458 .soclk(soclk));
459
460 assign user_incr_addr_in[6:0] = user_incr_addr[6:0];
461
462// Defining User array_sel.
463
464 ncu_scd_ctl_msff_ctl_macro__width_2 user_array_sel_reg (
465 .scan_in(user_array_sel_reg_scanin),
466 .scan_out(user_array_sel_reg_scanout),
467 .din ( user_array_sel_in[1:0] ),
468 .dout ( user_array_sel[1:0] ),
469 .l1clk(l1clk),
470 .siclk(siclk),
471 .soclk(soclk));
472
473 assign user_array_sel_in[1:0] = user_array_sel[1:0];
474
475// Defining User cmpsel.
476
477 ncu_scd_ctl_msff_ctl_macro__width_2 user_cmpsel_reg (
478 .scan_in(user_cmpsel_reg_scanin),
479 .scan_out(user_cmpsel_reg_scanout),
480 .din ( user_cmpsel_in[1:0] ),
481 .dout ( user_cmpsel[1:0] ),
482 .l1clk(l1clk),
483 .siclk(siclk),
484 .soclk(soclk));
485
486 assign user_cmpsel_in[1:0] = user_cmpsel[1:0];
487
488// Defining user_bisi write and read registers
489
490 ncu_scd_ctl_msff_ctl_macro__width_1 user_bisi_wr_reg (
491 .scan_in(user_bisi_wr_reg_scanin),
492 .scan_out(user_bisi_wr_reg_scanout),
493 .din ( user_bisi_wr_mode_in ),
494 .dout ( user_bisi_wr_mode ),
495 .l1clk(l1clk),
496 .siclk(siclk),
497 .soclk(soclk));
498
499 assign user_bisi_wr_mode_in = user_bisi_wr_mode;
500
501 ncu_scd_ctl_msff_ctl_macro__width_1 user_bisi_rd_reg (
502 .scan_in(user_bisi_rd_reg_scanin),
503 .scan_out(user_bisi_rd_reg_scanout),
504 .din ( user_bisi_rd_mode_in ),
505 .dout ( user_bisi_rd_mode ),
506 .l1clk(l1clk),
507 .siclk(siclk),
508 .soclk(soclk));
509
510 assign user_bisi_rd_mode_in = user_bisi_rd_mode;
511
512 assign mbist_user_bisi_wr_mode = user_mode & bisi & user_bisi_wr_mode & ~user_bisi_rd_mode;
513// assign mbist_user_bisi_rd_mode = user_mode & bisi & user_bisi_rd_mode & ~user_bisi_wr_mode;
514
515 assign mbist_user_bisi_wr_rd_mode = user_mode & bisi &
516 ((user_bisi_wr_mode & user_bisi_rd_mode) |
517 (~user_bisi_wr_mode & ~user_bisi_rd_mode));
518
519////////////////////////////////////////////////////////////////////////////////
520// Piping start_transition
521////////////////////////////////////////////////////////////////////////////////
522
523 ncu_scd_ctl_msff_ctl_macro__width_1 start_transition_reg (
524 .scan_in(start_transition_reg_scanin),
525 .scan_out(start_transition_reg_scanout),
526 .din ( start_transition ),
527 .dout ( start_transition_piped ),
528 .l1clk(l1clk),
529 .siclk(siclk),
530 .soclk(soclk));
531
532
533////////////////////////////////////////////////////////////////////////////////
534// Staging run for 16 cycles for mbist engines supporting async FIFO's
535////////////////////////////////////////////////////////////////////////////////
536
537 ncu_scd_ctl_msff_ctl_macro__width_1 run_reg (
538 .scan_in(run_reg_scanin),
539 .scan_out(run_reg_scanout),
540 .din ( run ),
541 .dout ( mb1_run ),
542 .l1clk(l1clk),
543 .siclk(siclk),
544 .soclk(soclk));
545
546 ncu_scd_ctl_msff_ctl_macro__width_4 counter_reg (
547 .scan_in(counter_reg_scanin),
548 .scan_out(counter_reg_scanout),
549 .din ( counter_in[3:0] ),
550 .dout ( counter_out[3:0] ),
551 .l1clk(l1clk),
552 .siclk(siclk),
553 .soclk(soclk));
554
555 assign cycle16 = (&counter_out[3:0] == 1'b1);
556 assign counter_in[3:0] = reset_engine ? 4'b0:
557 run & ~cycle16 ? counter_out[3:0] + 4'b0001:
558 counter_out[3:0];
559
560 assign run_piped16 = config_out[0] & cycle16 & ~msb; // As soon as run goes low, mbist operation is done!
561
562// /////////////////////////////////////////////////////////////////////////////
563// Adding Flop Boundaries for mbist
564// /////////////////////////////////////////////////////////////////////////////
565
566ncu_scd_ctl_msff_ctl_macro__width_2 intman_rd_wr_en_reg (
567 .scan_in(intman_rd_wr_en_reg_scanin),
568 .scan_out(intman_rd_wr_en_reg_scanout),
569 .din ( {mbist_intman_read, mbist_intman_write} ),
570 .dout ( {mb1_intman_rd_en, mb1_intman_wr_en} ),
571 .l1clk(l1clk),
572 .siclk(siclk),
573 .soclk(soclk));
574
575ncu_scd_ctl_msff_ctl_macro__width_2 dmubuf0_rd_wr_en_reg (
576 .scan_in(dmubuf0_rd_wr_en_reg_scanin),
577 .scan_out(dmubuf0_rd_wr_en_reg_scanout),
578 .din ( {mbist_dmubuf0_read, mbist_dmubuf0_write} ),
579 .dout ( {mb1_dmubuf0_rd_en, mb1_dmubuf0_wr_en} ),
580 .l1clk(l1clk),
581 .siclk(siclk),
582 .soclk(soclk));
583
584ncu_scd_ctl_msff_ctl_macro__width_2 dmubuf1_rd_wr_en_reg (
585 .scan_in(dmubuf1_rd_wr_en_reg_scanin),
586 .scan_out(dmubuf1_rd_wr_en_reg_scanout),
587 .din ( {mbist_dmubuf1_read, mbist_dmubuf1_write} ),
588 .dout ( {mb1_dmubuf1_rd_en, mb1_dmubuf1_wr_en} ),
589 .l1clk(l1clk),
590 .siclk(siclk),
591 .soclk(soclk));
592
593ncu_scd_ctl_msff_ctl_macro__width_2 cpubuf_rd_wr_en_reg (
594 .scan_in(cpubuf_rd_wr_en_reg_scanin),
595 .scan_out(cpubuf_rd_wr_en_reg_scanout),
596 .din ( {mbist_cpubuf_read, mbist_cpubuf_write} ),
597 .dout ( {mb1_cpubuf_rd_en, mb1_cpubuf_wr_en} ),
598 .l1clk(l1clk),
599 .siclk(siclk),
600 .soclk(soclk));
601
602ncu_scd_ctl_msff_ctl_macro__width_7 mb1_addr_reg (
603 .scan_in(mb1_addr_reg_scanin),
604 .scan_out(mb1_addr_reg_scanout),
605 .din ( mbist_address[6:0] ),
606 .dout ( mb1_addr[6:0] ),
607 .l1clk(l1clk),
608 .siclk(siclk),
609 .soclk(soclk));
610
611ncu_scd_ctl_msff_ctl_macro__width_8 mb1_wdata_reg (
612 .scan_in(mb1_wdata_reg_scanin),
613 .scan_out(mb1_wdata_reg_scanout),
614 .din ( mbist_wdata[7:0] ),
615 .dout ( mb1_wdata[7:0] ),
616 .l1clk(l1clk),
617 .siclk(siclk),
618 .soclk(soclk));
619
620ncu_scd_ctl_msff_ctl_macro__width_2 done_fail_reg (
621 .scan_in(done_fail_reg_scanin),
622 .scan_out(done_fail_reg_scanout),
623 .din ( {mbist_done, fail} ),
624 .dout ( {mb1_done, mb1_fail} ),
625 .l1clk(l1clk),
626 .siclk(siclk),
627 .soclk(soclk));
628
629// Creating 40 bit result read_data to be compared
630
631always@( intman_rd_en_piped2 or dmubuf0_rd_en_piped2 or dmubuf1_rd_en_piped2 or cpubuf_rd_en_piped2 or cmpsel_piped3 or intman_dout or dmubuf0_dout or dmubuf1_dout or cpubuf_dout ) begin
632 case( {intman_rd_en_piped2,dmubuf0_rd_en_piped2,dmubuf1_rd_en_piped2,cpubuf_rd_en_piped2,cmpsel_piped3[1:0]} ) //synopsys parallel_case full_case
633 6'b100011 : res_read_data[39:0] = {24'b0,intman_dout[15:0]};
634 6'b010000 : res_read_data[39:0] = dmubuf0_dout[39:0];
635 6'b010001 : res_read_data[39:0] = dmubuf0_dout[79:40];
636 6'b010010 : res_read_data[39:0] = dmubuf0_dout[119:80];
637 6'b010011 : res_read_data[39:0] = {16'b0,dmubuf0_dout[143:120]};
638 6'b001000 : res_read_data[39:0] = dmubuf1_dout[39:0];
639 6'b001001 : res_read_data[39:0] = dmubuf1_dout[79:40];
640 6'b001010 : res_read_data[39:0] = dmubuf1_dout[119:80];
641 6'b001011 : res_read_data[39:0] = {16'b0,dmubuf1_dout[143:120]};
642 6'b000100 : res_read_data[39:0] = cpubuf_dout[39:0];
643 6'b000101 : res_read_data[39:0] = cpubuf_dout[79:40];
644 6'b000110 : res_read_data[39:0] = cpubuf_dout[119:80];
645 6'b000111 : res_read_data[39:0] = {16'b0,cpubuf_dout[143:120]};
646 default : res_read_data[39:0] = dmubuf0_dout[39:0];
647 endcase
648 end
649
650ncu_scd_ctl_msff_ctl_macro__width_40 res_read_data_reg (
651 .scan_in(res_read_data_reg_scanin),
652 .scan_out(res_read_data_reg_scanout),
653 .din ( res_read_data[39:0] ),
654 .dout ( res_read_data_piped[39:0] ),
655 .l1clk(l1clk),
656 .siclk(siclk),
657 .soclk(soclk));
658
659
660
661
662
663// /////////////////////////////////////////////////////////////////////////////
664//
665// MBIST Control Register
666//
667// /////////////////////////////////////////////////////////////////////////////
668// Remove Address mix disable before delivery
669// /////////////////////////////////////////////////////////////////////////////
670 ncu_scd_ctl_msff_ctl_macro__width_23 control_reg (
671 .scan_in(control_reg_scanin),
672 .scan_out(control_reg_scanout),
673 .din ( control_in[22:0] ),
674 .dout ( control_out[22:0] ),
675 .l1clk(l1clk),
676 .siclk(siclk),
677 .soclk(soclk));
678
679 assign msb = control_out[22];
680 assign bisi_wr_rd = (bisi & ~user_mode) | mbist_user_bisi_wr_rd_mode ? control_out[21] : 1'b1;
681 assign array_sel[1:0] = user_mode ? user_array_sel[1:0] : control_out[20:19];
682 assign cmpsel[1:0] = mbist_user_cmpsel_hold ? user_cmpsel :
683 intman_sel ? 2'b11 : control_out[18:17];
684 assign data_control[1:0] = control_out[16:15];
685 assign address_mix = (bisi | mbist_user_addr_mode) ? 1'b0 : control_out[14];
686 assign march_element[3:0] = control_out[13:10];
687 assign array_address[6:0] = upaddress_march ? control_out[9:3] : ~control_out[9:3];
688
689 assign read_write_control[2:0] = ~five_cycle_march ? {2'b11, control_out[0]} :
690 control_out[2:0];
691
692
693 assign control_in[2:0] = reset_engine ? 3'b0:
694 ~run_piped16 ? control_out[2:0]:
695 (five_cycle_march && (read_write_control[2:0] == 3'b100)) ? 3'b000:
696 (one_cycle_march && (read_write_control[2:0] == 3'b110)) ? 3'b000:
697 control_out[2:0] + 3'b001;
698
699 assign increment_addr = (five_cycle_march && (read_write_control[2:0] == 3'b100)) ||
700 (one_cycle_march && (read_write_control[2:0] == 3'b110)) ||
701 (read_write_control[2:0] == 3'b111);
702
703 assign control_in[9:3] = start_transition_piped || reset_engine ? start_addr[6:0]:
704 ~run_piped16 || ~increment_addr ? control_out[9:3]:
705 next_array_address[6:0];
706
707 assign next_array_address[6:0] = next_upaddr_march ? start_addr[6:0]:
708 next_downaddr_march ? ~stop_addr[6:0]:
709 (overflow_addr[6:0]); // array_addr + incr_addr
710
711 assign start_addr[6:0] = mbist_user_addr_mode ? user_start_addr[6:0]: 7'b0000000;
712 assign stop_addr[6:0] = mbist_user_addr_mode ? user_stop_addr[6:0] :
713 cpubuf_sel || dmubuf0_sel || dmubuf1_sel ? 7'b0011111 : 7'b1111111;
714 assign incr_addr[6:0] = mbist_user_addr_mode ? user_incr_addr[6:0] : 7'b0000001;
715
716 assign overflow_addr[7:0] = {1'b0,control_out[9:3]} + {1'b0,incr_addr[6:0]};
717 assign overflow = compare_addr[7:0] < overflow_addr[7:0];
718
719 assign compare_addr[7:0] = upaddress_march ? {1'b0, stop_addr[6:0]} :
720 {1'b0, ~start_addr[6:0]};
721
722
723 assign next_upaddr_march = ( (march_element[3:0] == 4'h0) || (march_element[3:0] == 4'h1) ||
724 (march_element[3:0] == 4'h6) || (march_element[3:0] == 4'h5) ||
725 (march_element[3:0] == 4'h8) ) && overflow;
726
727 assign next_downaddr_march = ( (march_element[3:0] == 4'h2) || (march_element[3:0] == 4'h7) ||
728 (march_element[3:0] == 4'h3) || (march_element[3:0] == 4'h4) ) &&
729 overflow;
730
731
732 assign add[6:0] = five_cycle_march && ( (read_write_control[2:0] == 3'h1) ||
733 (read_write_control[2:0] == 3'h3)) ?
734 adj_address[6:0]: array_address[6:0];
735
736 assign adj_address[6:0] = {array_address[6:2], ~array_address[1], array_address[0]};
737
738//intman has 128 words, while the other 3 memories have 32 words.
739//intman is 2 blks of 32 rows and 32 cols (2:1 colmux; col address is MSB!)
740//The other 3 memories are 32x144, signle blk of 32 rows.
741
742 assign mbist_address[6:0] = address_mix & intman_sel ? {add[0],add[6:1]}: //Fast colum, then row
743 address_mix ? {add[6:5],add[0],add[4:1]}:
744 add[6:0]; //Fast Row
745
746// Definition of the rest of the control register
747 assign increment_march_elem = increment_addr && overflow;
748
749 assign control_in[22:10] = reset_engine ? 13'b0:
750 ~run_piped16 ? control_out[22:10]:
751 {msb, bisi_wr_rd, next_array_sel[1:0], next_cmpsel[1:0], next_data_control[1:0], next_address_mix, next_march_element[3:0]} +
752 {12'b0, increment_march_elem};
753
754
755 assign next_array_sel[1:0] = user_mode ? 2'b11: control_out[20:19];
756
757 assign next_cmpsel[1:0] = (mbist_user_cmpsel_hold || ~bisi_wr_rd || mbist_user_bisi_wr_mode) ? 2'b11 :
758 intman_sel ? 2'b11 : control_out[18:17];
759
760 assign next_data_control[1:0] = (bisi || (mbist_user_data_mode && (data_control[1:0] == 2'b00))) ? 2'b11:
761 data_control[1:0];
762
763 assign next_address_mix = bisi | mbist_user_addr_mode ? 1'b1 : address_mix;
764
765// Incorporated ten_n_mode!
766 assign next_march_element[3:0] = ( bisi ||
767 (mbist_ten_n_mode && (march_element[3:0] == 4'b0101)) ||
768 ((march_element[3:0] == 4'b1000) && (read_write_control[2:0] == 3'b100)) )
769 && overflow ? 4'b1111: march_element[3:0];
770
771
772 assign array_write = ~run_piped16 ? 1'b0:
773 five_cycle_march ? (read_write_control[2:0] == 3'h0) ||
774 (read_write_control[2:0] == 3'h1) ||
775 (read_write_control[2:0] == 3'h4):
776 (~five_cycle_march & ~one_cycle_march) ? read_write_control[0]:
777 ( ((march_element[3:0] == 4'h0) & (~bisi || ~bisi_wr_rd || mbist_user_bisi_wr_mode)) || (march_element[3:0] == 4'h7));
778
779 assign array_read = ~array_write && run_piped16; // && ~initialize;
780// assign mbist_done = msb;
781
782 assign mbist_wdata[7:0] = true_data ? data_pattern[7:0]: ~data_pattern[7:0];
783
784
785 assign five_cycle_march = (march_element[3:0] == 4'h6) || (march_element[3:0] == 4'h8);
786 assign one_cycle_march = (march_element[3:0] == 4'h0) || (march_element[3:0] == 4'h5) ||
787 (march_element[3:0] == 4'h7);
788
789 assign upaddress_march = (march_element[3:0] == 4'h0) || (march_element[3:0] == 4'h1) ||
790 (march_element[3:0] == 4'h2) || (march_element[3:0] == 4'h6) ||
791 (march_element[3:0] == 4'h7);
792
793// assign true_data = read_write_control[1] ^ ~march_element[0];
794
795 assign true_data = (five_cycle_march && (march_element[3:0] == 4'h6)) ?
796 ((read_write_control[2:0] == 3'h0) || (read_write_control[2:0] == 3'h2)):
797 (five_cycle_march && (march_element[3:0] == 4'h8)) ?
798 ((read_write_control[2:0] == 3'h1) ||
799 (read_write_control[2:0] == 3'h3) || (read_write_control[2:0] == 3'h4)):
800 one_cycle_march ? (march_element[3:0] == 4'h7):
801 ~(read_write_control[0] ^ march_element[0]);
802
803
804 assign data_pattern[7:0] = (bisi & mbist_user_data_mode) ? ~user_data_out[7:0]:
805 mbist_user_data_mode ? user_data_out[7:0]:
806 bisi ? 8'hFF: // true_data function will invert to 8'h00
807 (data_control[1:0] == 2'h0) ? 8'hAA:
808 (data_control[1:0] == 2'h1) ? 8'h99:
809 (data_control[1:0] == 2'h2) ? 8'hCC:
810 8'h00;
811
812/////////////////////////////////////////////////////////////////////////
813// Creating the mbist_done signal
814/////////////////////////////////////////////////////////////////////////
815// Delaying mbist_done 8 clock signals after msb going high, to provide
816// a generic solution for done going high after the last fail has come back!
817
818 ncu_scd_ctl_msff_ctl_macro__width_3 done_counter_reg (
819 .scan_in(done_counter_reg_scanin),
820 .scan_out(done_counter_reg_scanout),
821 .din ( done_counter_in[2:0] ),
822 .dout ( done_counter_out[2:0] ),
823 .l1clk(l1clk),
824 .siclk(siclk),
825 .soclk(soclk));
826
827// config_out[1] is AND'ed to force mbist_done low 2 cycles after mbist_start
828// goes low.
829
830 assign mbist_done = (&done_counter_out[2:0] == 1'b1) & config_out[1];
831 assign done_counter_in[2:0] = reset_engine ? 3'b000:
832 msb & ~mbist_done & config_out[1] ? done_counter_out[2:0] + 3'b001:
833 done_counter_out[2:0];
834
835
836// /////////////////////////////////////////////////////////////////////////////
837// Array Selects and read and write_en
838// /////////////////////////////////////////////////////////////////////////////
839
840 assign intman_sel = ~array_sel[1] & ~array_sel[0];
841 assign dmubuf0_sel = ~array_sel[1] & array_sel[0];
842 assign dmubuf1_sel = array_sel[1] & ~array_sel[0];
843 assign cpubuf_sel = array_sel[1] & array_sel[0];
844
845 assign mbist_intman_read = intman_sel && array_read;
846 assign mbist_intman_write = intman_sel && array_write;
847
848 assign mbist_dmubuf0_read = dmubuf0_sel && array_read;
849 assign mbist_dmubuf0_write = dmubuf0_sel && array_write;
850
851 assign mbist_dmubuf1_read = dmubuf1_sel && array_read;
852 assign mbist_dmubuf1_write = dmubuf1_sel && array_write;
853
854 assign mbist_cpubuf_read = cpubuf_sel && array_read;
855 assign mbist_cpubuf_write = cpubuf_sel && array_write;
856
857
858// /////////////////////////////////////////////////////////////////////////////
859// Pipeline for wdata, enables, and cmpsel
860// /////////////////////////////////////////////////////////////////////////////
861
862// Pipeline for wdata
863
864 ncu_scd_ctl_msff_ctl_macro__width_8 data_pipe_reg1 (
865 .scan_in(data_pipe_reg1_scanin),
866 .scan_out(data_pipe_reg1_scanout),
867 .din ( date_pipe_reg1_in[7:0] ),
868 .dout ( data_pipe_out1[7:0] ),
869 .l1clk(l1clk),
870 .siclk(siclk),
871 .soclk(soclk));
872
873 ncu_scd_ctl_msff_ctl_macro__width_8 data_pipe_reg2 (
874 .scan_in(data_pipe_reg2_scanin),
875 .scan_out(data_pipe_reg2_scanout),
876 .din ( date_pipe_reg2_in[7:0] ),
877 .dout ( data_pipe_out2[7:0] ),
878 .l1clk(l1clk),
879 .siclk(siclk),
880 .soclk(soclk));
881
882 ncu_scd_ctl_msff_ctl_macro__width_8 data_pipe_reg3 (
883 .scan_in(data_pipe_reg3_scanin),
884 .scan_out(data_pipe_reg3_scanout),
885 .din ( date_pipe_reg3_in[7:0] ),
886 .dout ( data_pipe_out3[7:0] ),
887 .l1clk(l1clk),
888 .siclk(siclk),
889 .soclk(soclk));
890
891
892 assign date_pipe_reg1_in[7:0] = reset_engine ? 8'h00: mb1_wdata[7:0];
893 assign date_pipe_reg2_in[7:0] = reset_engine ? 8'h00: data_pipe_out1[7:0];
894 assign date_pipe_reg3_in[7:0] = reset_engine ? 8'h00: data_pipe_out2[7:0];
895
896 assign ncu_mb1_piped_wdata[7:0] = data_pipe_out3[7:0];
897
898// Pipeline for Read Enable
899 ncu_scd_ctl_msff_ctl_macro__width_4 ren_pipe_reg1 (
900 .scan_in(ren_pipe_reg1_scanin),
901 .scan_out(ren_pipe_reg1_scanout),
902 .din ( ren_pipe_reg1_in[3:0] ),
903 .dout ( rd_en_piped[3:0] ),
904 .l1clk(l1clk),
905 .siclk(siclk),
906 .soclk(soclk));
907
908 ncu_scd_ctl_msff_ctl_macro__width_4 ren_pipe_reg2 (
909 .scan_in(ren_pipe_reg2_scanin),
910 .scan_out(ren_pipe_reg2_scanout),
911 .din ( ren_pipe_reg2_in[3:0] ),
912 .dout ( rd_en_piped2[3:0] ),
913 .l1clk(l1clk),
914 .siclk(siclk),
915 .soclk(soclk));
916
917 ncu_scd_ctl_msff_ctl_macro__width_4 ren_pipe_reg3 (
918 .scan_in(ren_pipe_reg3_scanin),
919 .scan_out(ren_pipe_reg3_scanout),
920 .din ( ren_pipe_reg3_in[3:0] ),
921 .dout ( rd_en_piped3[3:0] ),
922 .l1clk(l1clk),
923 .siclk(siclk),
924 .soclk(soclk));
925
926 assign ren_pipe_reg1_in[3:0] = reset_engine ? 4'b0: {mb1_cpubuf_rd_en,mb1_dmubuf1_rd_en,mb1_dmubuf0_rd_en,mb1_intman_rd_en} ;
927 assign ren_pipe_reg2_in[3:0] = reset_engine ? 4'b0: rd_en_piped[3:0];
928 assign ren_pipe_reg3_in[3:0] = reset_engine ? 4'b0: rd_en_piped2[3:0];
929
930 assign intman_rd_en_piped2 = rd_en_piped2[0];
931 assign dmubuf0_rd_en_piped2 = rd_en_piped2[1];
932 assign dmubuf1_rd_en_piped2 = rd_en_piped2[2];
933 assign cpubuf_rd_en_piped2 = rd_en_piped2[3];
934
935 assign intman_rd_en_piped3 = rd_en_piped3[0];
936 assign dmubuf0_rd_en_piped3 = rd_en_piped3[1];
937 assign dmubuf1_rd_en_piped3 = rd_en_piped3[2];
938 assign cpubuf_rd_en_piped3 = rd_en_piped3[3];
939
940// Pipelining cmpsel
941
942 ncu_scd_ctl_msff_ctl_macro__width_2 cmpsel_pipe_reg1 (
943 .scan_in(cmpsel_pipe_reg1_scanin),
944 .scan_out(cmpsel_pipe_reg1_scanout),
945 .din ( cmpsel_pipe_reg1_in[1:0] ),
946 .dout ( cmpsel_pipe_out1[1:0] ),
947 .l1clk(l1clk),
948 .siclk(siclk),
949 .soclk(soclk));
950
951 ncu_scd_ctl_msff_ctl_macro__width_2 cmpsel_pipe_reg2 (
952 .scan_in(cmpsel_pipe_reg2_scanin),
953 .scan_out(cmpsel_pipe_reg2_scanout),
954 .din ( cmpsel_pipe_reg2_in[1:0] ),
955 .dout ( cmpsel_pipe_out2[1:0] ),
956 .l1clk(l1clk),
957 .siclk(siclk),
958 .soclk(soclk));
959
960 ncu_scd_ctl_msff_ctl_macro__width_2 cmpsel_pipe_reg3 (
961 .scan_in(cmpsel_pipe_reg3_scanin),
962 .scan_out(cmpsel_pipe_reg3_scanout),
963 .din ( cmpsel_pipe_reg3_in[1:0] ),
964 .dout ( cmpsel_pipe_out3[1:0] ),
965 .l1clk(l1clk),
966 .siclk(siclk),
967 .soclk(soclk));
968
969 ncu_scd_ctl_msff_ctl_macro__width_2 cmpsel_pipe_reg4 (
970 .scan_in(cmpsel_pipe_reg4_scanin),
971 .scan_out(cmpsel_pipe_reg4_scanout),
972 .din ( cmpsel_pipe_reg4_in[1:0] ),
973 .dout ( cmpsel_pipe_out4[1:0] ),
974 .l1clk(l1clk),
975 .siclk(siclk),
976 .soclk(soclk));
977
978 assign cmpsel_pipe_reg1_in[1:0] = reset_engine ? 2'b0: cmpsel[1:0];
979 assign cmpsel_pipe_reg2_in[1:0] = reset_engine ? 2'b0: cmpsel_pipe_out1[1:0];
980 assign cmpsel_pipe_reg3_in[1:0] = reset_engine ? 2'b0: cmpsel_pipe_out2[1:0];
981 assign cmpsel_pipe_reg4_in[1:0] = reset_engine ? 2'b0: cmpsel_pipe_out3[1:0];
982 assign cmpsel_piped3[1:0] = cmpsel_pipe_out3[1:0];
983 assign cmpsel_piped4[1:0] = cmpsel_pipe_out4[1:0];
984
985
986
987// /////////////////////////////////////////////////////////////////////////////
988// Shared Fail Detection
989// /////////////////////////////////////////////////////////////////////////////
990// Updated to meet these new features:
991// 1.When mbist_done signal is asserted when it completes all the
992// tests, it also need to assert static membist fail signal if
993// there were any failures during the tests.
994// 2.The mbist_fail signal won't be sticky bit from membist
995// engine. The TCU will make it sticky fail bit as needed.
996
997
998 ncu_scd_ctl_msff_ctl_macro__width_4 fail_reg (
999 .scan_in(fail_reg_scanin),
1000 .scan_out(fail_reg_scanout),
1001 .din ( fail_reg_in[3:0] ),
1002 .dout ( fail_reg_out[3:0] ),
1003 .l1clk(l1clk),
1004 .siclk(siclk),
1005 .soclk(soclk));
1006
1007
1008 assign fail_reg_in[3:0] = reset_engine ? 4'b0:
1009 {qual_cpubuf_fail,qual_dmubuf1_fail,qual_dmubuf0_fail,qual_intman_fail} | fail_reg_out[3:0];
1010
1011
1012 assign qual_intman_fail = fail_detect && intman_rd_en_piped3;
1013 assign qual_dmubuf0_fail = fail_detect && dmubuf0_rd_en_piped3;
1014 assign qual_dmubuf1_fail = fail_detect && dmubuf1_rd_en_piped3;
1015 assign qual_cpubuf_fail = fail_detect && cpubuf_rd_en_piped3;
1016
1017 assign fail = mbist_done ? |fail_reg_out[3:0]:
1018 qual_intman_fail | qual_dmubuf0_fail | qual_dmubuf1_fail | qual_cpubuf_fail;
1019
1020 assign fail_detect = intman_rd_en_piped3 ?
1021 ({2{ncu_mb1_piped_wdata[7:0]}} != res_read_data_piped[15:0]):
1022 (dmubuf0_rd_en_piped3 || dmubuf1_rd_en_piped3 || cpubuf_rd_en_piped3) &
1023 (cmpsel_piped4[1:0] == 2'b11) ?
1024 ({3{ncu_mb1_piped_wdata[7:0]}} != res_read_data_piped[23:0]):
1025 ({5{ncu_mb1_piped_wdata[7:0]}} != res_read_data_piped[39:0]);
1026
1027
1028
1029supply0 vss; // <- port for ground
1030supply1 vdd; // <- port for power
1031// /////////////////////////////////////////////////////////////////////////////
1032// fixscan start:
1033assign config_reg_scanin = scan_in ;
1034assign user_data_reg_scanin = config_reg_scanout ;
1035assign user_start_addr_reg_scanin = user_data_reg_scanout ;
1036assign user_stop_addr_reg_scanin = user_start_addr_reg_scanout;
1037assign user_incr_addr_reg_scanin = user_stop_addr_reg_scanout;
1038assign user_array_sel_reg_scanin = user_incr_addr_reg_scanout;
1039assign user_cmpsel_reg_scanin = user_array_sel_reg_scanout;
1040assign user_bisi_wr_reg_scanin = user_cmpsel_reg_scanout ;
1041assign user_bisi_rd_reg_scanin = user_bisi_wr_reg_scanout ;
1042assign start_transition_reg_scanin = user_bisi_rd_reg_scanout ;
1043assign run_reg_scanin = start_transition_reg_scanout;
1044assign counter_reg_scanin = run_reg_scanout ;
1045assign intman_rd_wr_en_reg_scanin = counter_reg_scanout ;
1046assign dmubuf0_rd_wr_en_reg_scanin = intman_rd_wr_en_reg_scanout;
1047assign dmubuf1_rd_wr_en_reg_scanin = dmubuf0_rd_wr_en_reg_scanout;
1048assign cpubuf_rd_wr_en_reg_scanin = dmubuf1_rd_wr_en_reg_scanout;
1049assign mb1_addr_reg_scanin = cpubuf_rd_wr_en_reg_scanout;
1050assign mb1_wdata_reg_scanin = mb1_addr_reg_scanout ;
1051assign done_fail_reg_scanin = mb1_wdata_reg_scanout ;
1052assign res_read_data_reg_scanin = done_fail_reg_scanout ;
1053assign control_reg_scanin = res_read_data_reg_scanout;
1054assign done_counter_reg_scanin = control_reg_scanout ;
1055assign data_pipe_reg1_scanin = done_counter_reg_scanout ;
1056assign data_pipe_reg2_scanin = data_pipe_reg1_scanout ;
1057assign data_pipe_reg3_scanin = data_pipe_reg2_scanout ;
1058assign ren_pipe_reg1_scanin = data_pipe_reg3_scanout ;
1059assign ren_pipe_reg2_scanin = ren_pipe_reg1_scanout ;
1060assign ren_pipe_reg3_scanin = ren_pipe_reg2_scanout ;
1061assign cmpsel_pipe_reg1_scanin = ren_pipe_reg3_scanout ;
1062assign cmpsel_pipe_reg2_scanin = cmpsel_pipe_reg1_scanout ;
1063assign cmpsel_pipe_reg3_scanin = cmpsel_pipe_reg2_scanout ;
1064assign cmpsel_pipe_reg4_scanin = cmpsel_pipe_reg3_scanout ;
1065assign fail_reg_scanin = cmpsel_pipe_reg4_scanout ;
1066assign scan_out = fail_reg_scanout ;
1067// fixscan end:
1068endmodule
1069// /////////////////////////////////////////////////////////////////////////////
1070
1071