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等在⼀⾏的改成两⾏

#未添加dalways块进⾏添加

$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;

}