前言
在我们进行IC数字后仿过程中,需要先加上-nonotifier选项,让仿真遇到违例后,先不产生叉态,保证仿真正常进行,然后再提取log中的时序违例信息,筛选出异步路径,放到一个文件中,让仿真吃进去,去掉-nonotifier选项,再进行仿真。
在提取log中的时序违例信息时,需要一个能够自动提取时序违例信息的脚本,同时还要保留时序违例信息出现的位置,以便出现问题时能够进行复现。本文主要利用perl脚本,实现时序违例信息的提取。
一、perl脚本提取后仿中的notimingcheck路径
整个脚本的思路是:先利用linux中的find命令找出所有的路径和路径所在的信息;再利用hash数组,将路径进行去重复处理,并以键值对的形式保存起来;再交换键和值,方便进行排序处理;再将对应的键值对按照一定的格式输出到no_timingcheck.tfile文件中。
use warnings;
use strict;
my $debug = 0;
my @file;
my $filename;
my $key;
my $value;
my %f_path; #hash for path and info
my %f_path_exchange; #exchange key and value
#==========get info and path
@file = `find ./*PSOTSIM* -name "*seed_1.log" |xargs grep -rn "Scope: "`;
#=========split key and value with hash to remove repeat path
foreach $filename (@file){
if($debug == 1){
print $filename;
}
if($filename =~ /: Scope: /){
if($debug == 1){
print "$' \n";# path for key
print "$` \n";# info for value
}
$key = $'; chomp($key);
$value = $`;
if(!exists $f_path{$key}){
$f_path{$key} = $value;
}
}
}
#=========exchange key and value for sort
foreach $key (keys %f_path){
$f_path_exchange{$f_path{$key}} = $key;
}
#=========output to no_timingcheck.tfile with right formal
if(! open FILE, ">", "no_timingcheck.tfile"){
die "can not open file: $!";
}
foreach $key (sort keys %f_path_exchange){
$value = $f_path_exchange{$key};
if($debug == 1){
print "$key => $value \n";
}
$output = "PATH " . $value . " -tcheck " . "#" . $key . "\n";
if($debug == 1){
print "$output \n";
}
print FILE $output;
}
close FILE;
这个脚本如果移植,需要更改的是@file这个地方,要根据自己实际的log路径和名字进行匹配。
总结
本文主要利用perl脚本,实现时序违例信息的提取。