2023年11月26日发(作者:)
Verilog代码⾃动缩进和对齐Perl脚本(更新)
实验室做FPGA开发时经常⽤到Verilog,代码规范成为⼀个问题,于是乎写了⼀个Perl脚本对代码进⾏规范化,主要是进⾏⾃动缩进和对
齐。
代码原理很简单,主要是使⽤了正则表达式进⾏匹配和替换。
(新更新的代码增加了增加了变量名长度检测, 增加了module名检测, 对未加d的always进⾏添加的功能)
代码如下,初学Perl,请读者赐教:
use 5.010;
use File::Basename;
my $filename = 'C:UsersCvCvDesktopPerl_tmpcode.v';#输⼊⽂件名
my $outfilename = 'C:UsersCvCvDesktopPerl_tmpout.v';#输出⽂件名
my $basename = basename($filename,".v");
#----------------------------------------------------------
#测试⽂件存在
die "⽂件$filename不存在!n" unless -e $filename;
#打开⽂件
open(VFILE,"<",$filename) || die "打开⽂件失败!n";
open(OFILE,">",$outfilename) || die "打开⽂件失败!n";
#----------------------------------------------------------
#对⽂件预处理,begin等在⼀⾏的改成两⾏
#未添加d的always块进⾏添加
$always_cnt = 0;
my $last_line = "";
while(
chomp;#去除⾏尾的n
if(/(.*if.*)(begin.*)/i){
push @content,$1;
push @content,$2;
$last_line = $2;
}
elsif(/(.*begin.*)(if.*)/i){
push @content,$1;
push @content,$2;
$always_cnt = 1;
push @content,"begin";
}
push @content,$_;
$last_line = $_;
}
else{
push @content,$_;
$last_line = $_;
}
}
$always_cnt = 0;
#print join("n",@content);
#----------------------------------------------------------
#变量定义
$line =~ s/s*b(assign|initial)bs+(w)/$1 $2/i;
$assign_start = 1;
#print;
}
if(/modules+(w+)s*(/i){
#未匹配到分号,表⽰module输⼊输出定义多⾏
if(!/.*;/){
$module_def_start = 1;
$line = "n//--------------start of module define--------------n".$line;
}
$module_cnt++;
if($module_cnt>1){
print "⽂件存在多个modulen";
}
if($basename ne $1){
print "module名$1和⽂件名$basename不⼀致!n";
}
}
}
elsif(/bbeginb/i){#匹配到begin
my $tmp_space = $autoindent_space x $begin_cnt;
$begin_cnt++;
$line =~ s/^s*/$tmp_space/;
}
elsif(/bendb/i){#匹配到end
if($if_cnt>0){
if($module_def_start)
{
if(/.*;/){
#最后⼀⾏module定义
$line = ($autoindent_space x 4).$line;
$line .= "n//--------------end of module define--------------n";
$module_def_start = 0;
}


发布评论