【IC验证】perl脚本——分析前/后仿用例回归情况
目录
1 脚本名称
post_analysis
2 脚本使用说明
help:打印脚本说明信息
命令:post_analysis help
前/后仿结束后,首先填写好nocare_list(要过滤的log信息),然后在有log文件的上一层次路径下运行post_analysis脚本,执行脚本时若不带-all参数,则过滤掉nocare_list中的信息后只对后仿log进行分析,若带-all参数,则会过滤nocare_list中的信息后,对前/后仿的log信息进行分析,给出pass、timeout、bombed、violation等结果:
(1)不带-all参数:
脚本会只分析名称带max或者min的后仿文件夹如(rfdig_m33_tc029_max、rfdig_m33_tc001_max_20230911),除去runsim.log文件中和nocare_list中的内容相关的violation,之后在各个用例文件夹下产生runsim_temp.log文件,随后分析runsim_temp.log文件out of reset之后的内容,若case PASS但存在violation,则输出结果 VOILATION以及$setuphold/$setup/$hold/$width违例的数量,并产生结果文件: postsim_result.log;若不仍存在violation,则输出结果PASS到postsim_result.log文件中;否则输出结果FAIL、TIMEOUT、RUNNING、BOMB到postsim_result.log文件中。
(2)带-all参数:
对前仿也进行上述分析。
3 nocare_list文件示例
在runsim.log中找到包含以下关键字的行,并将其删除:
4 脚本执行方法
post_analysis //只对文件夹名称中有max或者min的后仿文件夹进行分析
post_analysis -all //对前后仿的文件夹都进行分析
5 postsim_result.log文件示例
(1)PASS说明reset后无任何violation;
(2)VOILATION说明reset后仍存在violation,需查看对应的runsim_temp.log确认每一个violation;
(3)FAIL说明用例fail,需查看对应的runsim_temp.log,确认fail原因;
(4)TIMEOUT说明用例超时,需查看对应的runsim_temp.log,确认超时原因;
(5)RUNNING说明用例还在跑,确认相关原因;
(6)BOMB说明用例编译失败,需查看对应的vcs_compile.log确认编译失败原因;
6 脚本代码
#! /usr/bin/perl -w
#==========================================================
# PERL MODULE
#==========================================================
use Cwd;
use Getopt::Long;
$Getopt::Long::ignorecase = 0;
#==========================================================
# PERL FUNCTION GetOptions (get command parameters)
#==========================================================
GetOptions("all" => \$g_dir) or die ("Invalid arguments. \n");
our $g_help = 0;
if (!GetOptions (
"help" => \$g_help,
)
) {
&print_message();
exit 0;
}
#==========================================================
# GENERATE postsim_result.log FILE
#==========================================================
our $sim_log = "runsim.log";
our $new_sim_log = "runsim_temp.log";
our @dirs = <*>;
our $reset_line_num;
our $tail_lines;
our $casename;
($sec,$min,$hour,$mday,$mon,$year) = localtime();
if (open(NOCARE_ID,"nocare_list") or die "cannot open nocare_list, no such file!!!") {
@nocarecontent = <NOCARE_ID>;
my $cur_dir = getcwd;
chdir($cur_dir) or die "cannot cd $cur_dir"; #cd simdir
open(PS_ID,">postsim_result.log");
print PS_ID "====================================================";
printf PS_ID "%02d/%02d/%02d %02d:%02d:%02d",$year+1900,$mon+1,$mday,"$hour","$min","$sec";
print PS_ID "====================================================\n";
foreach $dir (@dirs) {
chdir($cur_dir) or die "cannot cd $cur_dir"; #cd simdir
if ($g_dir) {
if ($dir =~ /(.+)tc(\d+)(.*)/) {
$casename = $dir;
print "dir_name = $casename \n" ;
}
else {
next;
}
}
else {
if (($dir =~ /(.+)(\d+)(.*)max(.*)/) or ($dir =~ /(.+)(\d+)(.*)min(.*)/)) {
$casename = $dir;
print "dir_name = $casename \n" ;
}
else {
next;
}
}
chdir($dir) or die "cannot cd $dir"; #cd simdir/xxx_tc00X(every case dir)
unlink $new_sim_log;
open(NEW_ID,">runsim_temp.log");
$nocarename=$sim_log; #simdir/xxx_tcXXX/runsim.log
if (open(LOG_ID,"$nocarename")) {
@logcontent = <LOG_ID>; #ever line in runsim.log
$match=0;
$write_en=0;
foreach $log (@logcontent) {
if ($match eq 1) {
$match = 0;
} else {
foreach $nocare (@nocarecontent) {
if ($log =~ /$nocare/) {
$match = 1;
$write_en = 0;
last;
} else {
$write_en = 1;
}
}
if ($write_en eq 1) {
print NEW_ID $log;
$write_en = 0;
}
}
}
close NEW_ID; #finish write run_sim_temp.log
close LOG_ID; #finish read run_sim.log
}
else {
print "Can not find $nocarename file!!! \n";
}
####report###
if(-e "runsim.log") {
if (open NEW_ID,$new_sim_log) {
@linecontent = <NEW_ID>;
$reset_bgn = 0;
$setuphold = 0;
$width = 0;
$print_over= 0;
foreach $line (@linecontent) {
if ($reset_bgn eq 1) {
if ($line =~ /.*\$setuphold.*/ or $line =~ /.*\$setup.*/ or $line =~ /.*\$hold.*/) {
$setuphold = $setuphold+1;
} elsif ($line =~ /.*\$width.*/) {
$width = $width+1;
} elsif ($line =~ /.*the test case finished with (\w+).*/) {
if($1 eq "FAIL") {
$print_over = 1;
printf PS_ID "%-50s%-10s%-30s","$casename",">>>>","FAIL";
print PS_ID "\n";
} elsif ($1 eq "TIMEOUT") {
$print_over = 1;
printf PS_ID "%-50s%-10s%-30s","$casename",">>>>","TIMEOUT";
print PS_ID "\n";
} elsif ($1 eq "PASS") {
$print_over = 1;
if ($setuphold > 0 or $width > 0) {
printf PS_ID "%-50s%-10s%-30s","$casename",">>>>","VOILATION";
printf PS_ID "\$setuphold:%-5d \$width:%-5d",$setuphold,$width;
print PS_ID "\n";
} else {
printf PS_ID "%-50s%-10s%-30s","$casename",">>>>","PASS";
print PS_ID "\n";
}
} else {
next;
}
} else {
next;
}
} else {
if ($line =~ /.*Out of reset!.*/) {
$reset_bgn = 1;
} else {
next;
}
}
}
if ($print_over eq 0) {
printf PS_ID "%-50s%-10s%-30s","$casename",">>>>","RUNNING";
print PS_ID "\n";
} else {
next;
}
} else {
next;
}
} else {
printf PS_ID "%-50s%-10s%-30s","$casename",">>>>","BOMBED";
print PS_ID "\n";
}
}
printf PS_ID "%-58s","========================================================";
printf PS_ID "%-7s",$ENV{'USER'};
printf PS_ID "%58s","========================================================";
close PS_ID;
}
#==========================================================
# HELP INFORMATION PRINT
#==========================================================
if ($g_help) {
&print_message();
exit 0;
}
#==========================================================
# SUB PROGRAM (print help ingormation)
#==========================================================
sub print_message ()
{
print "
NAME
post_analysis - Check case sim result script
MAXSCEND
post_analysis [-h]
Options
-h : help information
You should run this script in the directory containing all the cases' working directories
\n";
}