最近项目中遇到了一个小的任务,需要写一个小的Perl脚本,刚好借此机会学习一下Perl,在这里总结一下。
项目中需要将一些从数字到rf的信号抓出来并且按一定的格式处理好送给模拟那边做后仿。我们直接用Verdi将顶层信号保存下来,然后那边给的需求是处理成如下格式:V(信号名,单个bit) <+ Vd信号值;
eg: V(TxSample[0]) <+ Vd0;
#! /usr/bin/perl
use split;
open DEC, "> ../svtb/XXXX_signal.sv";
open SRC, "< ./script/XX_intf" or die "There is no XX_intf";
my $signal;
my $start;
my $end;
my num = 0;
while(SRC){
my @sp_res_p0 = split /u_xxx_top\./;
$num++'
if($sp_res_p0[1] =~ m/\[/g){
my @sp_res_p1 = split /\[/, $_;
my @sp_res_p2 = split /\[/, $sp_res_p0[1];
my @sp_res_p3 = split /\]/, $sp_res_p2[1];
my @sp_res_p4 = split /\:/, $sp_res_p3[0];
$start = sp_res_p4[1];
$end = sp_res_p4[0];
my @num = ($start...$end);
foreach (@num){
print DEC "if\(\($p_res_p1[0]\[$_\] === 1\'bx\) || \($sp_res_p1[0]\[$\] === 1\'bz\)\) begin\n \$fdisplay \(fid, \"V\($sp_res_p2[0]\[\$_\]\) <+ Vd*0.5;\"\)\;\nend\nelse begin\n\$fdisplay\(fid, \"V($sp_res_p2[0]\[$_\]\) <+ Vd*\%d;\",$sp_res_p1[0]\[$_\]\)\;\nend\n\n";"
}
}
else {
chomp $_;
chomp $sp_res_p0[1];
print DEC "if\(\($_ === 1\'bx\) || \($_ === 1\'bz\)\) begin\n \$fdisplay\(fid, \"V\($sp_res_p0[1]\) <+ Vd*0.5;\"\)\;\nend\nelse begin\n \$fdisplay\(fid,\"V\($sp_res_p0[1]\] <+ Vd*\%d;\", $_\)\;\nend\n\n";
}
}
print "generate ./svtb/xxx_getsgn.sv, $num. done.\n"