DC-DFTC工具串scan chain过程中遇到Error(TEST-1313)

在串chain过程中,遇到TEST-1313的Error,从log中看不到其他任何异常的Error,所以只能从TEST-1313入手。

从TEST-1313的介绍分析:

从介绍来看应该是设置的test-points有问题,需要重新设置一下test-points。

接上次修改test-points后,重新run insert-dft依旧还是TEST-1313的Error。

回过头再重新去细看log中的Error,发现在TEST-1313之前即有Error出现了,而这个Error的上一步是在执行simulation library的loading动作,所以就怀疑这个simulation library 的loading执行错误导致了接下来的Build Error。

而整个flow中只有一个simulation library的设置,即test_simulation_library指定

命令没有问题,而是指定的simulation library file有问题,打开文件查看,发现verilog文件确实有verilog的语法错误,最后两个多了两个宏标志。

修改这个Verilog的simulation library file之后重新run就pass了。

请为我详细分析下述两个脚本: fate_mapping=report/fate_port_mapping.CHX005.ddr5.list pat_type=CPU_uncore_PAT scan_cell_rpt=report/scan_cell/202310191513/core.CPU_SPATPG.INT.INTEST.LPWR_OFF.A0_CPU_CORE_TO_0530.VERIFY.202310191513.tessent_scan_cell.all.rpt scan_chain_rpt=report/scan_cell/202310191513/core.CPU_SPATPG.INT.INTEST.LPWR_OFF.A0_CPU_CORE_TO_0530.VERIFY.202310191513.tessent_scan_chain.all.cp.rpt # int_log_maping_tool=./tools/int_fail_log_2_scan_cell.pipe.fate.pl int_log_maping_tool=./tools/int_fail_log_2_scan_cell.pipe.fate.20231213.pl # shift_cyc=181479 # load_unload_cyc=25 # capture_cyc=32 # shift_dummy_cyc=4 # input pipe 5 # output pipe 5 # # # load 25(17 edtupdate=1 + 8 edt_update=0 ) # shift 238753 :tpf record shift cycles is 5 less than the actually shift cycles, sell below # unload 4 # capture 32 # # pattern cycle: # 0~24: load # 25~238782: shift cycle 238758 # 238783~238786: unload # 238787~238811: load # 238812~477569: shift cycle 238758 # 477570~477573: unload # 477574~477605: capture # 477606~477630: load # 477631~716388: shift cycle 238758 # 716389~716392: unload end shift_cyc=238758 load_unload_cyc=25 capture_cyc=32 shift_dummy_cyc=4 #fail_log=./tmp/all.#131.#A0_SP5.25C.v900.v900.f2000.f2000.cpu_core_sp_int_163_com2int_2600M.ddr5.2023-10-23_14-09-41.log log_array=( \ ./all#107.#A0_TT336.25C.v850.v850.f2000.f2000.cpu_uncore_sp_int_org_tie_4_2000.ddr5.2024-03-20_10-57-27.log ) for fail_log in ${log_array[@]}; do perl $int_log_maping_tool \ -pat_type $pat_type \ -scan_cell $scan_cell_rpt \ -scan_chain $scan_chain_rpt \ -pad_map $fate_mapping \ -shift_cyc $shift_cyc \ -shift_dummy_cyc $shift_dummy_cyc \ -load_unload_cyc $load_unload_cyc \ -capture_cyc $capture_cyc \ -pipe_stage 5 \ -pat0_shift yes \ -fail_log $fail_log \ -out_log $fail_log.fail \ -excel_log $fail_log.excel done #! /usr/bin/perl -w use warnings; use strict; #============================================================================= # FileName: int_fail_log_2_scan_cell.pl # Desc: use to locate the error scan cell ========= my $argv; my $pat_type; my $scan_cell; my $scan_chain; my $pad_map; my $fail_log; my $shift_cyc; my $shift_dummy_cyc; my $load_unload_cyc; my $capture_cyc; my $pat0_shift; my $out_log; my $pipe_stage; my $excel_log; my $excel_wafer; my $excel_corner; my $excel_die_id; my $excel_pattern; my $excel_freq; my $excel_volt; my $excel_temp; my $excel_fail_reg; my $excel_fail_pat_num; my $excel_fail_scanout; my $excel_fail_chain_offset; my $excel_fail_pat_exp; my $excel_fail_pat_got; my $excel_fail_pat_body; our %padmap; while ($argv = shift @ARGV) { if($argv eq '-pat_type') { $pat_type = shift @ARGV; }elsif($argv eq '-scan_cell') { $scan_cell = shift @ARGV; }elsif($argv eq '-scan_chain') { $scan_chain = shift @ARGV; }elsif($argv eq '-pad_map') { $pad_map = shift @ARGV; }elsif($argv eq '-fail_log') { $fail_log = shift @ARGV; }elsif($argv eq '-shift_cyc') { $shift_cyc = shift @ARGV; }elsif($argv eq '-load_unload_cyc') { $load_unload_cyc = shift @ARGV; }elsif($argv eq '-capture_cyc') { $capture_cyc = shift @ARGV; }elsif($argv eq '-pipe_stage') { $pipe_stage = shift @ARGV; }elsif($argv eq '-shift_dummy_cyc') { $shift_dummy_cyc = shift @ARGV; }elsif($argv eq '-pat0_shift') { $pat0_shift = shift @ARGV; }elsif($argv eq '-out_log') { $out_log = shift @ARGV; }elsif($argv eq '-excel_log') { $excel_log = shift @ARGV; }elsif($argv eq '-excel_wafer') { $excel_wafer = shift @ARGV; }elsif($argv eq '-excel_corner') { $excel_corner = shift @ARGV; }elsif($argv eq '-excel_die_id') { $excel_die_id = shift @ARGV; }elsif($argv eq '-excel_pattern') { $excel_pattern = shift @ARGV; }elsif($argv eq '-excel_freq') { $excel_freq = shift @ARGV; }elsif($argv eq '-excel_volt') { $excel_volt = shift @ARGV; }elsif($argv eq '-excel_temp') { $excel_temp = shift @ARGV; }else{ print "ERROR: parameter error !!!\n"; } } my $line; my $idx; my $fmc; my $fpga; my $fpc_dm4; my $fpc_dm5; my $fpc_ddr5; my $hdr; my $zdi_pad; my $ccd_pad; my $pad; my $atpg_pad; my %PAD_IDX; my %FT2CP_PAD; my %FT2ATPG_PAD; open(MAPPING, "$pad_map")||die "open mapping file failed!($pad_map)\n"; while($line = <MAPPING>){ #1_idx #2_FMC #3_FPGA #4_FPC(DM3/4) #5_FPC(DM5) #6_FPC(DDR5) #7_HDR #8_ZDI_PAD #9_CCD_PAD #10_CPU_uncore_PAT #11_CPU_uncore_ATPG #12_CPU_core_PAT #13_CPU_core_ATPG #14_CPS_PAT #15_CPS_PAT_ATPG #16_GFX_PAT #17_GFX_PAT_ATPG #18_JTAG_PAT #19_CCD_JTAG if($line =~ /^(\d+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)/) { $idx = $1; $fmc = $2; $fpga = $3; $fpc_dm4 = $4; $fpc_dm5 = $5; $fpc_ddr5 = $6; $hdr = $7; $zdi_pad = $8; $ccd_pad = $9; $pad = "NA"; $atpg_pad = "NA"; if ($pat_type eq "CPU_uncore_PAT") { $pad = $10; $atpg_pad = $11; } if ($pat_type eq "CPU_core_PAT") { $pad = $12; $atpg_pad = $13; } if ($pat_type eq "CPS_PAT") { $pad = $14; $atpg_pad = $15; $ccd_pad = "NA"; } if ($pat_type eq "GFX_PAT") { $pad = $16; $atpg_pad = $17; $ccd_pad = "NA"; } if ($pat_type eq "JTAG_PAT") { $pad = $18; $atpg_pad = $19; $ccd_pad = "NA"; } if(exists $PAD_IDX{$idx}) { print STDOUT "Error, $idx is exists in $pat_type\n"; } else { $PAD_IDX{$idx} = $pad; } $pad =~ s/^I_//g; $pad =~ s/^O_//g; $FT2CP_PAD{$pad} = $ccd_pad; $FT2ATPG_PAD{$pad} = $atpg_pad; } } close (MAPPING); my $chain_name; my $chain_output_pad; my %CHAIN_PAD; open(CHAIN,"$scan_chain") || die "Can't open the file: $scan_chain"; while($line = <CHAIN>) { chomp($line); if($line=~/chain = (\S+).*output = '\/(\S+)'/) { $chain_name=$1; $chain_output_pad=$2; $CHAIN_PAD{$chain_output_pad}=$chain_name; } } close (CHAIN); #open($input,"gzip -dc $scan_cell | ") || die("Could not open $scan_cell"); open(SCANCELL,"$scan_cell") || die("Could not open $scan_cell"); my %file_handles; my $chain_cell_rpt; while ($line = <SCANCELL>) { chomp($line); if($line=~/(\d+)\s+(\S+)\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+(\S+)/) { $chain_name=$2; if (exists $file_handles{$chain_name}) { print {$file_handles{$chain_name}} "$line\n"; } else{ open($chain_cell_rpt,">$scan_cell.$chain_name.txt") || die("Could not write $!"); print {$chain_cell_rpt} "$line\n"; $file_handles{$chain_name} = $chain_cell_rpt; } } } close (SCANCELL); foreach my $chain_cell_rpt (values %file_handles) { close $chain_cell_rpt; } my @PAT_NAME; my @PAT_CYCLE; my $pat_name; my $pat_cycle; open(FAIL_LOG, "$fail_log")||die "open fail log file failed!($fail_log)\n"; $idx=0; $PAT_CYCLE[$idx]=0; while($line = <FAIL_LOG>){ if ($line =~ /^(\S+) has (\d+) cycle/) { $pat_name = $1; $pat_cycle = $2; push @PAT_NAME, $pat_name; $pat_cycle = $pat_cycle + $PAT_CYCLE[$idx]; push @PAT_CYCLE, $pat_cycle; $idx++; } } close (FAIL_LOG); my $fail_cycle; my $fail_pad; my $fail_chain; my $exp; my $got; my $org_exp; my $org_got; my $fail_pattern_num; my $fail_scan_cell_num; my $append_cycle=0; my $fail_cycle_file; my $cell_inv_flag; my $cell_qpin_flag; my $cell_name; my $cell_full_name; my $tmp_line; my $match_flag; my $gen_fail_log=0; my $fail_num=0; open(FAIL_LOG, "$fail_log")||die "open fail log file failed!($fail_log)\n"; open(OUT_LOG, ">$out_log")||die "open fail log file failed!($fail_log)\n"; open(EXCEL_LOG, ">>$excel_log")||die "open fail log file failed!($fail_log)\n"; while($line = <FAIL_LOG>){ if ($line =~ /^\s+(\d+)\s+(\S+)\s+exp=(\S)\s+got=(\S)/) { chomp($line); $fail_cycle = $1; $fail_pad = $2; $exp=$3; $got=$4; $org_exp=$3; $org_got=$4; $idx = 0; $append_cycle=0; $fail_cycle_file=0; $fail_num++; if ($fail_num > 500) { print OUT_LOG "$line\n"; next; } while ($fail_cycle > $PAT_CYCLE[$idx]) { $idx++; } $pat_name=$PAT_NAME[$idx-1]; $fail_cycle_file = $fail_cycle - $PAT_CYCLE[$idx-1]; if ($pat0_shift eq "yes") { $fail_pattern_num = int (($fail_cycle_file + 1) / ($load_unload_cyc + $shift_cyc + $shift_dummy_cyc + $capture_cyc)) - 1 - 1; $fail_scan_cell_num = ($fail_cycle_file + 1) % ($load_unload_cyc + $shift_cyc + $shift_dummy_cyc + $capture_cyc) - 1 - $load_unload_cyc - $pipe_stage + $capture_cyc; } else { $fail_pattern_num = int (($fail_cycle_file + 1) / ($load_unload_cyc + $shift_cyc + $shift_dummy_cyc + $capture_cyc)) - 1; $fail_scan_cell_num = ($fail_cycle_file + 1) % ($load_unload_cyc + $shift_cyc + $shift_dummy_cyc + $capture_cyc) - 1 - $load_unload_cyc - $pipe_stage; } $atpg_pad=$FT2ATPG_PAD{$fail_pad}; if (exists $FT2CP_PAD{$fail_pad}) { if ($FT2CP_PAD{$fail_pad} eq "NA") { $chain_output_pad = $fail_pad; } else { $chain_output_pad = $FT2CP_PAD{$fail_pad}; } } else { print STDOUT "Error, can not mapping FT pad $fail_pad to CP pad, please check!\n"; } $chain_name=$CHAIN_PAD{$chain_output_pad}; open(CELL,"< $scan_cell.$chain_name.txt") || die "Can't open the file: $scan_cell.$chain_name.txt"; $match_flag=0; $cell_full_name="NA"; while($tmp_line = <CELL>){ # 29636 zdi_1 MASTER (FF-LE) TFFF 42097406 /CCD_CPTEST29 F HDN6BULT08_FSDPQ_DY2_1 /zdi_ccd/zdil_x32/zdi_dll_zdi/r_inst_scan_obs_rxreq24/\sq_reg[4] U1 (SI,Q) if ($tmp_line =~ /^\s*$fail_scan_cell_num\s+$chain_name\s+MASTER\s+\S+\s+(\S)(\S)(\S)(\S)\s+\d+\s+\S+\s+\S\s+\S+\s+(.*)\s+\S+\s+\(\S+,\S+\)/) { $cell_inv_flag=$2; $cell_qpin_flag=$4; $cell_name = $5; $cell_name =~ s/\s+$//g; if ($cell_qpin_flag eq "T") { $cell_full_name = $cell_name . "/QN"; } else { $cell_full_name = $cell_name . "/Q"; } if ($cell_inv_flag eq "T") { my $tmp = $exp; $exp = $got; $got = $exp; } if ($got eq "H") { $got="1'b1"; } else { $got="1'b0"; } $match_flag=1; $gen_fail_log=1; last; } } close (CELL); if ($match_flag == 0) { print STDOUT "Error, can not find $chain_name $fail_scan_cell_num fail cell name, please check!\n"; } my $tmp_str="$cell_full_name"." = "."$got"; printf OUT_LOG "%-30s\t; # %-150s\t # %-5s\t%-12s\t%-8s\t%s\t%s\t; #atpg_pad=%-12s\tchain=%-25s\tpat_name=%s\n", "$line", "$tmp_str", "$fail_pattern_num", "$chain_output_pad", "$fail_scan_cell_num", "$org_exp", "$org_got", "$atpg_pad", "$chain_name", "$pat_name"; printf STDOUT "%-30s\t; # %-150s\t # %-5s\t%-12s\t%-8s\t%s\t%s\t; #atpg_pad=%-12s\tchain=%-25s\tpat_name=%s\n", "$line", "$tmp_str", "$fail_pattern_num", "$chain_output_pad", "$fail_scan_cell_num", "$org_exp", "$org_got", "$atpg_pad", "$chain_name", "$pat_name"; $excel_fail_reg=$cell_name; $excel_fail_pat_num=$fail_pattern_num; $excel_fail_scanout=$chain_output_pad; $excel_fail_chain_offset=$fail_scan_cell_num; $excel_fail_pat_exp=$org_exp; $excel_fail_pat_got=$org_got; $excel_fail_pat_body=$pat_name; printf EXCEL_LOG "$excel_wafer\t$excel_corner\t$excel_die_id\t$excel_pattern\t$excel_volt\t$excel_freq\t$excel_temp\t$excel_fail_reg\t$excel_fail_pat_num\t$excel_fail_scanout\t$excel_fail_chain_offset\t$excel_fail_pat_exp\t$excel_fail_pat_got\t$excel_fail_pat_body\n"; } else { print OUT_LOG "$line"; } } close (FAIL_LOG); close (OUT_LOG); if ($gen_fail_log == 0) { unlink "$out_log"; printf EXCEL_LOG "$excel_wafer\t$excel_corner\t$excel_die_id\t$excel_pattern\t$excel_volt\t$excel_freq\t$excel_temp\tall_pattern_pass\n"; } #mv cps_only_sp_com_sync_production_202309201538_p1.all.#131.#A1_TT_276.25C.v900.v900.f2000.f2000.cps_only_sp_com_sync_production_202309201538_p1.ddr5.2023-09-26_17-40-17.log cps_only_sp_com_sync_production_202309201538_p1.202309201538_p1.ddr5.2023-09-26_17-40-17.log #mv cps_only_sp_com_sync_production_202309201538_p2.all.#131.#A1_TT_276.25C.v900.v900.f2000.f2000.cps_only_sp_com_sync_production_202309201538_p2.ddr5.2023-09-26_17-43-21.log cps_only_sp_com_sync_production_202309201538_p2.202309201538_p2.ddr5.2023-09-26_17-43-21.log #mv cps_only_sp_com_sync_production_202309201538_p3.all.#131.#A1_TT_276.25C.v900.v900.f2000.f2000.cps_only_sp_com_sync_production_202309201538_p3.ddr5.2023-09-26_17-46-26.log cps_only_sp_com_sync_production_202309201538_p3.202309201538_p3.ddr5.2023-09-26_17-46-26.log #mv cps_only_sp_com_sync_production_202309201538_p4.all.#131.#A1_TT_276.25C.v900.v900.f2000.f2000.cps_only_sp_com_sync_production_202309201538_p4.ddr5.2023-09-26_17-48-32.log cps_only_sp_com_sync_production_202309201538_p4.202309201538_p4.ddr5.2023-09-26_17-48-32.log #mv cps_only_sp_com_sync_production_202309201538_p5.all.#131.#A1_TT_276.25C.v900.v900.f2000.f2000.cps_only_sp_com_sync_production_202309201538_p5.ddr5.2023-09-26_17-51-36.log cps_only_sp_com_sync_production_202309201538_p5.202309201538_p5.ddr5.2023-09-26_17-51-36.log #mv cps_only_sp_com_sync_production_202309201538_p6.all.#131.#A1_TT_276.25C.v900.v900.f2000.f2000.cps_only_sp_com_sync_production_202309201538_p6.ddr5.2023-09-26_17-54-42.log cps_only_sp_com_sync_production_202309201538_p6.202309201538_p6.ddr5.2023-09-26_17-54-42.log #mv cps_only_sp_com_sync_production_202309201538_p7.all.#131.#A1_TT_276.25C.v900.v900.f2000.f2000.cps_only_sp_com_sync_production_202309201538_p7.ddr5.2023-09-26_17-57-48.log cps_only_sp_com_sync_production_202309201538_p7.202309201538_p7.ddr5.2023-09-26_17-57-48.log #mv cps_only_sp_com_sync_production_202309201538_p8.all.#131.#A1_TT_276.25C.v900.v900.f2000.f2000.cps_only_sp_com_sync_production_202309201538_p8.ddr5.2023-09-26_18-00-54.log cps_only_sp_com_sync_production_202309201538_p8.202309201538_p8.ddr5.2023-09-26_18-00-54.log #log_array=( #cps_only_sp_com_sync_production_202309201538_p1.202309201538_p1.ddr5.2023-09-26_17-40-17.log #cps_only_sp_com_sync_production_202309201538_p2.202309201538_p2.ddr5.2023-09-26_17-43-21.log #cps_only_sp_com_sync_production_202309201538_p3.202309201538_p3.ddr5.2023-09-26_17-46-26.log #cps_only_sp_com_sync_production_202309201538_p4.202309201538_p4.ddr5.2023-09-26_17-48-32.log #cps_only_sp_com_sync_production_202309201538_p5.202309201538_p5.ddr5.2023-09-26_17-51-36.log #cps_only_sp_com_sync_production_202309201538_p6.202309201538_p6.ddr5.2023-09-26_17-54-42.log #cps_only_sp_com_sync_production_202309201538_p7.202309201538_p7.ddr5.2023-09-26_17-57-48.log #cps_only_sp_com_sync_production_202309201538_p8.202309201538_p8.ddr5.2023-09-26_18-00-54.log #) # #for log in ${log_array[@]}; do # echo $log # perl int_fail_log_2_scan_cell.fate.pl \ # -pat_type CPS_PAT \ # -scan_cell /d/chx005/chx005_fate_2.5_20230807.git/report/scan_cell/202309191707/CNE001.CPS_SPATPG.INT.INTEST.LPWR_OFF.A0_CPS_only_TO_0420.COVERAGE_NOR.202309191707.tessent_scan_cell.rpt \ # -scan_chain /d/chx005/chx005_fate_2.5_20230807.git/report/scan_cell/202309191707/CNE001.CPS_SPATPG.INT.INTEST.LPWR_OFF.A0_CPS_only_TO_0420.COVERAGE_NOR.202309191707.tessent_scan_chain.rpt \ # -pad_map /d/chx005/chx005_fate_2.5_20230807.git/report/fate_port_mapping.CHX005.ddr5.list \ # -shift_cyc 180443 \ # -shift_dummy_cyc 4 \ # -load_unload_cyc 25 \ # -capture_cyc 32 \ # -fail_log $log \ # -out_log $log.fail #done
09-23
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值