根据程序中的input、output自动生成Verilog模块的端口声明。
使用方式:
perl auto_argument.pl module_name.v
#!/user/bin/perl -w
use strict;
use POSIX;
my $file_name;
my $outfile_name;
my $module_name;
my $author_name = "Sniper";
my @input;
my @output;
my @signal;
$file_name = $ARGV[0] if(@ARGV == 1);
&helpmessage() if(@ARGV != 1);
open(LOG,"<",$file_name) or die "Can not open $file_name for reading!\n";
while (defined(my $line = ))
{
chomp $line;
next if($line =~ /\A\s*\z/);
$line =~ s/\A\s*|\s*\z//g;
#module name
if($line =~ /\Amodule\s+([a-zA-Z0-9_]+)/)
{
$module_name = $1;
}
#io port
if($line =~ /\Ainput\s+([a-zA-Z0-9_]+)/)
{
push (@input , "$1");
push (@signal, "$1");
}
elsif($line =~ /\Ainput\s*\[.+\]\s*([a-zA-Z0-9_]+)/)
{
push (@input , "$1");
push (@signal, "$1");
}
elsif($line =~ /\Aoutput\s+reg\s+([a-zA-Z0-9_]+)/)
{
push (@output, "$1");
push (@signal, "$1");
}
elsif($line =~ /\Aoutput\s+reg\s*\[.+\]\s*([a-zA-Z0-9_]+)/)
{
push (@output, "$1");
push (@signal, "$1");
}
elsif($line =~ /\Aoutput\s+([a-zA-Z0-9_]+)/)
{
push (@output, "$1");
push (@signal, "$1");
}
elsif($line =~ /\Aoutput\s*\[.+\]\s*([a-zA-Z0-9_]+)/)
{
push (@output, "$1");
push (@signal, "$1");
}
elsif($line =~ /\Afunction/)
{
last;
}
}
close (LOG);
my $str = "";
#################################
### Inputs first, Outputs last
#################################
$str .="//==============================\n";
$str .="// Inputs first, Outputs last\n";
$str .="//==============================\n";
$str .="module $module_name(\n";
$str .=" //Inputs " . "\n";
foreach (@input)
{
$str .= " " . $_ . " ,\n";
}
$str .="\n";
$str .=" //Outputs" . "\n";
foreach (@output)
{
$str .= " " . $_ . " ,\n";
}
$str =~ s/,\n\z//g;# delete last ", "
$str .="\n);\n\n\n";
#################################
### All signals in order
#################################
$str .="//==============================\n";
$str .="// All signals in order\n";
$str .="//==============================\n";
$str .="module $module_name(\n";
foreach (@signal)
{
$str .= " " . $_ . " ,\n";
}
$str =~ s/,\n\z//g;# delete last ", "
$str .="\n);\n\n\n";
print $str;
$outfile_name = $module_name . "_AutoArg.v";
open(OUT,">",$outfile_name)or die "Can not open $outfile_name for writting!\n";
print OUT $str;
close (OUT);
print "\n[Perl INFO] Result file: " .$outfile_name . "\n\n\n\n\n";
sub help_message
{
print "\n\n" . "-"x60 . "\n";
print "THe $0 script used to auto argument.\n\n";
print "Usage: perl $0 module_file_name\n\n";
print "Example: perl $0 top.v\n";
print "-"x60 . "\n\n";
exit;
}