我们看后仿波形,分析后仿时序为例时,对着茫茫多的log,实在没有精力一行一行的过,最好的办法是用脚本,将时序为例都写到新的文件中,然后我们再将文档中重复的时序为例都去掉,剩下的才是我们真正需要关注的Timing violation,至于为啥要删除重复的,是因为,一般出现时序违例的地方,常常会一直报x态到log里,我们只需要保留最开始的那一个即可。
好了,以上都是我们需要解决的问题的前提,这块我只记录如何使用perl删掉文档中所有重复的行,代码如下:
for($i = 0 ; $i < $line_temp_cnt ; $i++ )
{
open VIO_T , "<$vio_temp_file" or die "Cant open violation_temp.log!";
if($simulator eq "vcs")
{
while(my $line = <VIO_T>)
{
chomp($line);
if($linecnt < $i+1)
{
if(($line =~ m/violation in(\s+\S+)/) and ($i == $linecnt))
{
$patten = $1;
}
$linecnt ++;
}
elsif($line =~ m/$patten/)
{
push(@redundant,$linecnt);
$vio_cut_hash{$linecnt} = 1;
$linecnt++;
}
else
{
$linecnt++;
}
}
$linecnt = 0;
$patten = '';
close(VIO_T);
}
print "$i One loop done!\n";
}
整个过程一共分三个步骤:
1,从第一行开始提取特征,即 violation后的字符串;
2,遇见相同的patten(这块从提取的特征哪里可以得到)记录到数组里面;
3,本轮循环结束,下一次从第二行开始提取特征,总的循环次数是整个时序违例文档的行数;
如上我们得到的@redundant数据就是所有的重复行的编号,下面我们只需要删掉这个数组里面保存的行号对应的行即可,至于如何删除,其实很简单啦,这里不是讨论的重点。